![d4d20679719f8106f6a2e2e2ed23be49.png](https://img-blog.csdnimg.cn/img_convert/d4d20679719f8106f6a2e2e2ed23be49.png)
前面
在实际应用中,大多的查询都是需要多表连接查询的,但很多初学SQL的小伙伴总对各种JOIN有些迷糊。回想一下,初期很长一段时间,我常用的似乎也就是等值连接 WHERE 后面加等号,对各种JOIN也是不求甚解,今天索性就来个JOIN的小总结。
首先,设定两张表,作为下面例子的操作对象。
表1 学生信息表
![b42164745603bf0d92ed60173a5242c5.png](https://img-blog.csdnimg.cn/img_convert/b42164745603bf0d92ed60173a5242c5.png)
表2 专业班级表
![b03e5ae74f3ffdd7813b95ef8327c63d.png](https://img-blog.csdnimg.cn/img_convert/b03e5ae74f3ffdd7813b95ef8327c63d.png)
再来个SQL JOIN连接查询各种用法的大合影,先预热一下。
![f33f36e695ddf3fbef2cbb84f446cce7.png](https://img-blog.csdnimg.cn/img_convert/f33f36e695ddf3fbef2cbb84f446cce7.png)
No.1 【INNER JOIN】内连接
这是最常用的,获取两个表中指定字段满足匹配关系的记录。
![e20789ed1078dfb6ae54b4fecd7de76e.png](https://img-blog.csdnimg.cn/img_convert/e20789ed1078dfb6ae54b4fecd7de76e.png)
内连接通常有两种情况:
等值连接:查找两个表中连接字段相等的记录。
--查询每个学生的学号、姓名、籍贯、年龄、专业、班级
![1c14a6f95f2c578a5b6f14b9bb6c090d.png](https://img-blog.csdnimg.cn/img_convert/1c14a6f95f2c578a5b6f14b9bb6c090d.png)
自身连接:就是和自己进行连接查询,给一张表取两个不同的别名,然后附上连接条件。
--要在学生表里查询与 HH 同龄且籍贯也相同的学生信息
![fcc53c946ba593dc98d9ed6ce980d574.png](https://img-blog.csdnimg.cn/img_convert/fcc53c946ba593dc98d9ed6ce980d574.png)
No.2 【LEFT JOIN】左连接
获取左表中的所有记录,即使在右表没有对应匹配的记录。
![f9b5c71d2cc0367b92eb173d40860f76.png](https://img-blog.csdnimg.cn/img_convert/f9b5c71d2cc0367b92eb173d40860f76.png)
--左连接:显示左表student所有记录,如右表中没有与之
![93f58198594fb5a30104c3750f5d2577.png](https://img-blog.csdnimg.cn/img_convert/93f58198594fb5a30104c3750f5d2577.png)
No.3 【RIGHT JOIN】右连接
用于获取右表中的所有记录,即使左表没有对应匹配的记录。
![36c8bbfa2ada1cf2a445c1556beae4e6.png](https://img-blog.csdnimg.cn/img_convert/36c8bbfa2ada1cf2a445c1556beae4e6.png)
--右连接:显示右表major所有记录,如左表中没有与之
![2420de6c585c9e363f2cbd055dff2e98.png](https://img-blog.csdnimg.cn/img_convert/2420de6c585c9e363f2cbd055dff2e98.png)
No.4 【FULL JOIN】 完全连接
返回两个表中的所有行。
![9d7341719278ac79d60199324784b354.png](https://img-blog.csdnimg.cn/img_convert/9d7341719278ac79d60199324784b354.png)
--完全连接:显示两张表的并集,如果其中一张表的记录
![4219a9f1b0cd5a0aaffc965363404587.png](https://img-blog.csdnimg.cn/img_convert/4219a9f1b0cd5a0aaffc965363404587.png)
No.5 【CROSS JOIN】交叉连接
结果是笛卡尔积,就是第一个表的行数乘以第二个表的行数。
![58c726d20adf368aa746371c7094f847.png](https://img-blog.csdnimg.cn/img_convert/58c726d20adf368aa746371c7094f847.png)
--交叉连接:一张表中的数据依次取出分别与另一张表中的
![a0f364fdec4986f51e709bbb9513c8f7.gif](https://img-blog.csdnimg.cn/img_convert/a0f364fdec4986f51e709bbb9513c8f7.gif)
No.6 延伸【Left Excluding JOIN】左表唯一
返回左表有但右表没有关联数据的记录。
![a529623fb9f6194ca7ad2795045ad624.png](https://img-blog.csdnimg.cn/img_convert/a529623fb9f6194ca7ad2795045ad624.png)
--左表唯一:将右表B以及两张表交集的部分过滤掉,
![c8121776cc62f3a10dde03786fe8eb01.png](https://img-blog.csdnimg.cn/img_convert/c8121776cc62f3a10dde03786fe8eb01.png)
No.7 延伸【Right Excluding JOIN】右表唯一
返回右表有但左表没有关联数据的记录。
![577373ca67d24b26dc60915a144ab8d0.png](https://img-blog.csdnimg.cn/img_convert/577373ca67d24b26dc60915a144ab8d0.png)
--右表唯一:将左表A以及两张表交集的部分过滤掉,
![e165da08f7a08461781d80483540b309.png](https://img-blog.csdnimg.cn/img_convert/e165da08f7a08461781d80483540b309.png)
No.8 延伸【Outer Excluding JOIN】非交集连接
返回左表和右表里没有相互关联的记录。
![e412f729eeb2f9692dfd214387c5c166.png](https://img-blog.csdnimg.cn/img_convert/e412f729eeb2f9692dfd214387c5c166.png)
--非交集连接:查找两张表中没有关联的记录项。
![9984c7bee2bec1315e845f6ec1325efa.png](https://img-blog.csdnimg.cn/img_convert/9984c7bee2bec1315e845f6ec1325efa.png)
最后
谈及 SQL 里的各种 JOIN 之间的区别时,被广为引用的是 CodeProject 上C.L. Moffatt的文章, 本文也有所参考,感兴趣的小伙伴可以去看一下。
https://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins
OK! 就酱紫,抛砖引玉一下,更多JOIN的用法可以参看一下上面的链接。
-------------------------- END --------------------------