[Mysql]SQL 中JOIN 的总结与使用

0x0 前言

总的来说,四种JOIN的使用/区别可以描述为:

left join 做链接:会从左表那里返回所有的记录,即使在右表中没有匹配的行。

right join 右连接:返回右表中的所有记录,即使在左表中没有记录与它匹配

full join 全连接:返回左右表中的所有记录

inner join 内连接:在表中存在至少一个匹配, 关键字inner可省略。

具体可以看stackoverflow上,Difference between Inner Join & Full join这个问题,说得蛮清楚的,我就搬运一下这个问题的答案好了。

0x1 三种JOIN

一共有三种JOIN:
  • LEFT OUTER JOIN
  • RIGHT OUTER JOIN
  • FULL OUTER JOIN

关键字OUTER是可选择的,取决于具体语言,在实现上它们都是遵循标准的,因此FULL JOINFULL OUTER JOIN是一样的。

接着将以简化的数据集来说明这些JOIN语句。考虑有如下两个数据集,注意到有些元素在A中有,在B中没有,反过来也是。

Set "A"    Set "B"

 AA      |   BB
-------- | --------
 Item 1  |   Item 3
 Item 2  |   Item 4
 Item 3  |   Item 5
 Item 4  |   Item 6

0x1_1 LEFT JOIN

现在执行如下SQL语句(左连接,LEFT JOIN):

SELECT * FROM A LEFT OUTER JOIN B ON AA = BB

将会得到如下的结果(空白的元素表示NULL):

AA         BB
--------   --------
 Item 1   
 Item 2   
 Item 3     Item 3
 Item 4     Item 4

左连接(LEFT JOIN)会输出左边的表中的所有结果,如果右边的表中有相应项,则会输出,否则为NULL

因此,如果要找出在AA(左边的表)中有,而在BB(右边的表)中没有的数据项,可以使用如下的SQL语句:

SELECT * FROM A LEFT OUTER JOIN B ON AA = BB
WHERE BB is NULL

0x1_2 RIGHT JOIN

如果使用右连接(RIGHT JOIN),结果将会输出BB中所有的数据项和AA中相应的匹配项(注意你现在是获取了右边的表中的所有数据项):

SELECT * FROM A RIGHT OUTER JOIN B ON AA = BB

结果

 AA         BB
--------   --------
 Item 3     Item 3
 Item 4     Item 4
            Item 5
            Item 6

0x1_3 FULL JOIN

如果想要取得所有的元素项,则可以使用FULL JOIN:

SELECT * FROM A FULL JOIN B ON AA = BB

结果

 AA         BB
--------   --------
 Item 1            <-----+
 Item 2                  |
 Item 3     Item 3       |
 Item 4     Item 4       |
            Item 5       +--- empty holes are NULL's
            Item 6       |
   ^                     |
   |                     |
   +---------------------+

再次注意,缺失的数据项的值是NULL。

0x1_4 INNER JOIN

INNER JOINJOIN是一样的,一般INNER关键字可以省略。INNER JOIN将只会返回相匹配的元素项,即不会返回结果为NULL的数据项。

SELECT * FROM A INNER JOIN B ON AA = BB

结果

 AA         BB
--------   --------
 Item 3     Item 3
 Item 4     Item 4

0x1_5 CROSS JOIN

最后还有一个CROSS JOIN,笛卡儿积,将会返回A中每个元素分别匹配B中所有元素的结果,即N*M组合。

SELECT * FROM A CROSS JOIN B

结果

 AA         BB
--------   --------
 Item 1     Item 3      ^
 Item 1     Item 4      +--- A中第一个元素, 匹配B中所有元素
 Item 1     Item 5      |
 Item 1     Item 6      v
 Item 2     Item 3      ^
 Item 2     Item 4      +--- A中第二个元素, 匹配B中所有元素
 Item 2     Item 5      |
 Item 2     Item 6      v
 Item 3     Item 3      ... and so on
 Item 3     Item 4
 Item 3     Item 5
 Item 3     Item 6
 Item 4     Item 3
 Item 4     Item 4
 Item 4     Item 5
 Item 4     Item 6

0x_2 图解SQL的JOIN操作

这边也有一张图清楚的说明了每个JOIN操作。建议把上面的内容浏览一边后,再好好看下这张图片,相信对JOIN的操作应该就完全明白了。
SQL-JOIN

0x3 参考文献

0x4 关于我

  • @Author:Zemo
  • @Email:zemochen#126.com
  • 欢迎转载,让更多的人学到东西
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值