为什么使用join 代替子查询_SQL多表查询:SQL JOIN连接查询各种用法总结

d4d20679719f8106f6a2e2e2ed23be49.png

前面

在实际应用中,大多的查询都是需要多表连接查询的,但很多初学SQL的小伙伴总对各种JOIN有些迷糊。回想一下,初期很长一段时间,我常用的似乎也就是等值连接 WHERE 后面加等号,对各种JOIN也是不求甚解,今天索性就来个JOIN的小总结。

首先,设定两张表,作为下面例子的操作对象。

表1 学生信息表

b42164745603bf0d92ed60173a5242c5.png

表2 专业班级表

b03e5ae74f3ffdd7813b95ef8327c63d.png

再来个SQL JOIN连接查询各种用法的大合影,先预热一下。

f33f36e695ddf3fbef2cbb84f446cce7.png

No.1 【INNER JOIN】内连接

这是最常用的,获取两个表中指定字段满足匹配关系的记录。

e20789ed1078dfb6ae54b4fecd7de76e.png

内连接通常有两种情况:

等值连接:查找两个表中连接字段相等的记录。

--查询每个学生的学号、姓名、籍贯、年龄、专业、班级

1c14a6f95f2c578a5b6f14b9bb6c090d.png

自身连接:就是和自己进行连接查询,给一张表取两个不同的别名,然后附上连接条件。

--要在学生表里查询与 HH 同龄且籍贯也相同的学生信息

fcc53c946ba593dc98d9ed6ce980d574.png

No.2 【LEFT JOIN】左连接

获取左表中的所有记录,即使在右表没有对应匹配的记录。

f9b5c71d2cc0367b92eb173d40860f76.png
--左连接:显示左表student所有记录,如右表中没有与之

93f58198594fb5a30104c3750f5d2577.png

No.3 【RIGHT JOIN】右连接

用于获取右表中的所有记录,即使左表没有对应匹配的记录。

36c8bbfa2ada1cf2a445c1556beae4e6.png
--右连接:显示右表major所有记录,如左表中没有与之

2420de6c585c9e363f2cbd055dff2e98.png

No.4 【FULL JOIN】 完全连接

返回两个表中的所有行。

9d7341719278ac79d60199324784b354.png
--完全连接:显示两张表的并集,如果其中一张表的记录

4219a9f1b0cd5a0aaffc965363404587.png

No.5 【CROSS JOIN】交叉连接

结果是笛卡尔积,就是第一个表的行数乘以第二个表的行数。

58c726d20adf368aa746371c7094f847.png
--交叉连接:一张表中的数据依次取出分别与另一张表中的

a0f364fdec4986f51e709bbb9513c8f7.gif

No.6 延伸【Left Excluding JOIN】左表唯一

返回左表有但右表没有关联数据的记录。

a529623fb9f6194ca7ad2795045ad624.png
--左表唯一:将右表B以及两张表交集的部分过滤掉,

c8121776cc62f3a10dde03786fe8eb01.png

No.7 延伸【Right Excluding JOIN】右表唯一

返回右表有但左表没有关联数据的记录。

577373ca67d24b26dc60915a144ab8d0.png
--右表唯一:将左表A以及两张表交集的部分过滤掉,

e165da08f7a08461781d80483540b309.png

No.8 延伸【Outer Excluding JOIN】非交集连接

返回左表和右表里没有相互关联的记录。

e412f729eeb2f9692dfd214387c5c166.png
--非交集连接:查找两张表中没有关联的记录项。

9984c7bee2bec1315e845f6ec1325efa.png

最后

谈及 SQL 里的各种 JOIN 之间的区别时,被广为引用的是 CodeProject 上C.L. Moffatt的文章, 本文也有所参考,感兴趣的小伙伴可以去看一下。

https://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins

OK! 就酱紫,抛砖引玉一下,更多JOIN的用法可以参看一下上面的链接。

-------------------------- END --------------------------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值