
Join 就是两张表的合并:数据分散在不同的表格里,当需要合并的时候,输入数据管理语句,找到要使用的数据。
SQL中的连接(JOIN)语句用于将数据库中的两个或多个表组合起来。由"连接"生成的集合,可以被保存为表,或者当成表来使用。JOIN 语句的含义是把两张表的属性通过它们的值组合在一起。基于 ANSI 标准的 SQL 列出了五种 JOIN 方式:内连接(INNER),全外连接(FULL OUTER),左外连接(LEFT OUTER),右外连接(RIGHT OUTER)和交叉连接(CROSS)。在特定的情况下,一张表(基本表,视图,或连接表)可以和自身进行连接,成为自连接(self-join)。
合并的种类不同,集合下面的图,来说明一下
Inner join 保留两个表中相交部分的数据
Left join(Outer) 先保留左边的数据,然后根据表A 去搜索与表B相交的部分
Right join(Outer)先保留左边的数据,然后根据表B 去搜索与表A相交的部分
Full Join (Outer) 两边的数据全部保留
下面的这个韦恩图,清晰明了,还要注意下面的代码区别:

笛卡尔乘积:这个乘积是 sql 执行Join 语句时候的基本思路。但是会对这个join的过程进行优化:Mysql用的Loop join(首先走一遍A,对A 中的每一条记录与B表进行比较链接,满足id相同,返回记录)/还有其他的join: Merge join(对AB两个表进行排序,同时验证id是否相同)/ Hash join (首先对A表中的id记录进行hash计算,生成hash表,然后join,把B表中的每条记录的进行hash运算,然后在A 的hash表中验证是否一致,最后得出结果)
是指两个集合X和Y的笛卡尓积(Cartesian product)
设A,B为集合,用A中元素为第一元素,B中元素为第二元素构成有序对,所有这样的有序对组成的集合叫做A与B的笛卡尔积,记作AxB.
笛卡尔积的符号化为:
A×B={(x,y)|x∈A∧y∈B}
例如,A={a,b}, B={0,1,2},则
A×B={(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)}
B×A={(0, a), (0, b), (1, a), (1, b), (2, a), (2, b)}

mysql 官方文档对应的代码:

举个inner join 的例子:
https://www.w3schools.com/sql/sql_join.aspwww.w3schools.com有两个表格,一个订单表格,一个顾客信息表格:


订单”表中的“ CustomerID”列是指“客户”表中的“ CustomerID”。 上面两个表之间的关系是“ CustomerID”列
然后,我们可以创建以下SQL语句(包含一个INNER JOIN),该语句选择两个表中具有匹配值的记录:
SELECT Orders.OrderID, Customers.CustomerName, Orders.OrderDate
FROM Orders
INNERJOIN Customers ON Orders.CustomerID=Customers.CustomerID;
结果是这样的:

再来left join的例子:
SELECT Customers.CustomerName, Orders.OrderID
FROM Customers
LEFT JOIN Orders ON Customers.CustomerID = Orders.CustomerID
ORDER BY Customers.CustomerName;
注意:即使右侧表(订单)中没有匹配项,LEFT JOIN关键字也会从左侧表(客户)返回所有记录。
还是两个表格,顾客表和订单表,来看一下原来的表格:


结果是这样:

韦恩图与代码结合~





本文详细介绍了SQL中的JOIN操作,包括内连接、外连接等五种主要类型,并提供了具体的例子来展示如何使用这些JOIN类型来合并数据库中的不同表。


被折叠的 条评论
为什么被折叠?



