1、内连接

取两表的公共部分,想单语交集,使用内连接:

1
2
3
4
SELECTF <select_list> 
FROM tableA A
INNER JOIN tableB B
ON A.key = B.key

图片

2、左外连接

取两表的公共部分,加左表(A)的独有,简称左表(A)的全部;右表(B)没有的部分用null来填充,使用左外连接:

1
2
3
4
SELECT <select_list>
FROM tableA A
LEFT JOIN tableB B
ON A.Key = B.Key

图片

3、右外连接

取两表的公共部分,加右表的独有,简称右表的全部。左表没有的部分使用null来填充,使用右外连接:

1
2
3
4
SELECT <select_list>
FROM tableA A
RIGHT JOIN tableB B
ON A.Key = B.Key

图片

4、左连接

取左表的独有部分,由内连接和左外连接,即左外连接的基础上去掉公共部分(内连接部分),公共部分也属于右表的一份,所以在左外连接的基础上,去掉右表的部分即可,使用左连接:

1
2
3
4
5
SELECT <select_list>
FROM tableA A
LEFT JOIN tableB B
ON A.Key = B.key
WHERE B.Key IS NULL

图片

5、右连接

同理,右连接是获取属于右表的独有部分,在右连接的基础上去掉公共部分即可,使用右连接:

1
2
3
4
5
SELECT <select_list>
FROM tableA A
RIGHT JOIN tableB B
ON A.Key = B.key
WHERE A.Key IS NULL

图片

6、全连接

取两表的所有,相当于并集,使用全连接:

1
2
3
4
SELECT  <select_list>
FROM tableA A
FULL OUTER JOIN tableB B
ON A.Key = B.key

注意这个FULL OUTER JOIN,这个语法只有在Oracle中有效,而在MySQL中是不支持该语法的,那如果要在MySQL实现全链接查询怎么办?
对于全连接,我们可以看作是一个左外连接加一个右外连接 ,但是对于公共部分,在左连接的时候加了一遍,而在右连接右加了一遍,所以应该在这两者基础上去重,对于两表去重,我们想到union这个关键字,所以在MySQL中,全连接的sql语句为:

1
2
3
SELECT <select_list> FROM tableA A LEFT JOIN tableB B ON A.Key=B.Key
UNION
SELECT <select_list> FROM tableA A RIGHT JOIN tableB B ON A.Key=B.Key

图片

7、除公共部分

在全连接的基础上,去掉左表和右表的公共部分,即左表的独有加右表的独有:

1
2
3
4
5
6
SELECT  <select_list>
FROM tableA A
FULL OUTER JOIN tableB B
ON A.Key = B.key
WHERE A.Key IS NULL
OR B.Key IS NULL

同样的道理,FULL OUTER JOIN在MySQL中不支持,对于这种情况,可以考虑是左连接(左表独有)加右连接(右表独有),可以使用UNION ALL(由于左表独有和右表独有,根本没有重复的部分,所以此出使用UNION也是可以的):

1
2
3
4
5
6
7
SELECT <select_list> FROM tableA A LEFT JOIN tableB B 
ON A.Key = B.key WHERE B.Key IS NULL

UNION ALL

SELECT <select_list> FROM tableA A RIGHT JOIN tableB B
ON A.Key = B.key WHERE A.Key IS NULL

图片

最后更新: 2019年06月28日 11:14

原始链接: https://www.sunnymaple.cn/2019/06/28/七种JOIN图/

× 请我吃糖~
打赏二维码