【SQL】各取所需 | SQL JOIN链接查询各类用法总结

前面

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

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

表1  学生信息表code

表2  专业班级表对象

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

No.1 【INNER JOIN】内链接

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

内链接一般有两种状况:io

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

--查询每一个学生的学号、姓名、籍贯、年龄、专业、班级
--涉及到student和major两张表,用共有字段“学号”为链接字段

--写法1:使用INNER JOIN
SELECT A.学号, A.姓名, A.籍贯, A.年龄, B.专业, B.班级
FROM student A
INNER JOIN major B   
ON  A.学号=B.学号

--写法2:--省去了INNER,直接写JOIN,与INNER JOIN没有区别
SELECT A.学号, A.姓名, A.籍贯, A.年龄, B.专业, B.班级
FROM student A
JOIN major B  
ON  A.学号=B.学号

--写法3: --使用WHERE,已经逐渐被淘汰
SELECT A.学号, A.姓名, A.籍贯, A.年龄, B.专业, B.班级
FROM student A, major B
WHERE A.学号=B.学号 

--上面三种写法的结果都是同样的,推荐使用写法2

🅱 自身链接:就是和本身进行链接查询,给一张表取两个不一样的别名,而后附上链接条件。引用

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

SELECT B.学号, B.姓名, B.性别, B.籍贯, B.年龄
FROM student A 
JOIN student B
ON A.年龄=B.年龄 AND A.籍贯=B.籍贯 AND A.姓名='HH'

No.2 【LEFT JOIN】左链接

获取左表中的全部记录,即便在右表没有对应匹配的记录。im

 

--左链接:显示左表student全部记录,如右表中没有与之
--匹配的项则以NULL值代替。

SELECT A.学号, A.姓名, A.籍贯, A.年龄, B.专业, B.班级
FROM student A LEFT JOIN major B  
ON  A.学号=B.学号

No.3 【RIGHT JOIN】右链接

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

--右链接:显示右表major全部记录,如左表中没有与之
--匹配的项则以NULL值代替。

SELECT A.学号, A.姓名, A.籍贯, A.年龄, B.专业, B.班级
FROM student A RIGHT JOIN major B  
ON  A.学号=B.学号

No.4 【FULL JOIN】 彻底链接

返回两个表中的全部行。

--彻底链接:显示两张表的并集,若是其中一张表的记录
--在另外一张表中没有匹配的行,则对应的数据项填充NULL

SELECT A.学号, A.姓名, A.籍贯, A.年龄, B.专业, B.班级
FROM student A FULL JOIN major B  
ON  A.学号=B.学号

No.5 【CROSS JOIN】交叉链接

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

--交叉链接:一张表中的数据依次取出分别与另外一张表中的
--每条数据挨个组合,最后记录数量为两张表记录数的乘积

SELECT * FROM student CROSS JOIN major

--本例student和major都为7条记录,因此结果为7*7=49条记录

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

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

--左表惟一:将右表B以及两张表交集的部分过滤掉,
--获得的记录是左表中惟一存在的。

SELECT A.学号, A.姓名, A.籍贯, A.年龄, B.专业, B.班级
FROM student A LEFT JOIN major B  
ON  A.学号=B.学号
WHERE B.学号 IS NULL

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

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

--右表惟一:将左表A以及两张表交集的部分过滤掉,
--获得的记录是右表中惟一存在的。

SELECT A.学号, A.姓名, A.籍贯, A.年龄, B.专业, B.班级
FROM student A RIGHT JOIN major B  
ON  A.学号=B.学号
WHERE A.学号 IS NULL

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

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

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

SELECT A.学号, A.姓名, A.籍贯, A.年龄, B.专业, B.班级
FROM student A FULL JOIN major B  
ON  A.学号=B.学号
WHERE A.学号 IS NULL OR B.学号 IS NULL

最后

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

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

 

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

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

相关文章
相关标签/搜索