可视化理解SQL的JOIN用法

相信熟悉SQL的人都知道SQL的JOIN语法,有几种变形(INNER JOIN,LEFT JOIN,RIGHT JOIN等)。讲解SQL的JOIN用法的文档有很多,但多数时候在使用起来的时候还是易弄混,不易清楚的理解每种用法产生的结果集。下面我以图解的方式,让你对SQL的JOIN种种变形有一个清晰直观的理解,从而更容易的理解并运用它。

首先,假设有A,B两张表,结构及数据如下:


table

INNER JOIN


inner-join-image

INNER JOIN产生的结果集是A表和B表的交集。
代码如下:
1
2
3
4
SELECT <select_list>
FROM Table_A A
INNER JOIN Table_B B
ON A.Key = B.Key


结果如下:

inner-join-data

LEFT JOIN


left-join-image

LEFT JOIN产生A表的完全集,而B表中匹配的则有值,没有匹配的则以NULL填充。
代码如下:
1
2
3
4
SELECT <select_list>
FROM Table_A A
LEFT JOIN Table_B B
ON A.key = B.key


结果如下:

left-join-data

RIGHT JOIN


right-join-image

RIGHT JOIN和LEFT JOIN相对应,产生的是B表的完全集,而A表中匹配的则有值,没有匹配的则以NULL填充。
代码如下:
1
2
3
4
SELECT <select_list>
FROM Table_A A
RIGHT JOIN Table_B B
ON A.key = B.key


结果如下:

right-join-data

OUTER JOIN


outer-join-image

OUTER JOIN也可以写成FULL OUTER JOIN,产生的是A表和B表的并集。没有匹配的记录,仍是以NULL填充。
代码如下:
1
2
3
4
SELECT <select_list>
FROM Table_A A
FULL OUTER JOIN Table_B B
ON A.key = B.key


结果如下:

outer-join-data

LEFT Excluding JOIN


left-ex-join-image

LEFT Excluding JOIN产生在A表中有而在B表中没有的集合。
代码如下:
1
2
3
4
5
SELECT <select_list>
FROM Table_A A
LEFT JOIN Table_B B
ON A.key = B.key
WHERE B.key IS NULL


结果如下:

left-ex-join-data

RIGHT Excluding JOIN


right-ex-join-image

RIGHT Excluding JOIN与LEFT Excluding JOIN相对应,产生的是B表中有而在A表中没有的集合。
代码如下:
1
2
3
4
5
SELECT <select_list>
FROM Table_A A
RIGHT JOIN Table_B B
ON A.key = B.key
WHERE A.key IS NULL


结果如下:

right-ex-join-data

OUTER Excluding JOIN


outer-ex-join-image

OUTER Excluding JOIN产生的是A表有而B表没有,B表有而A表没有的数据集。
代码如下:
1
2
3
4
5
SELECT <select_list>
FROM Table_A A
FULL OUTER JOIN Table_B B
ON A.key = B.key
WHERE A.key IS NULL OR B.key IS NULL


结果如下:

outer-ex-join-data

最后,下面这张图整理了上面讲的所有内容。

sql-joins
大师兄 wechat
欢迎关注我的微信公众号:Python大师兄