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关键字也会从左侧表(客户)返回所有记录。
还是两个表格,顾客表和订单表,来看一下原来的表格:
结果是这样:
韦恩图与代码结合~