在 SQL 中,表之间的联接操作(Join)是非常重要的。本文将介绍 INNER JOIN
和 OUTER JOIN
的区别,并进一步解释 LEFT OUTER JOIN
、RIGHT OUTER JOIN
和 FULL OUTER JOIN
的具体用法。
INNER JOIN
与 OUTER JOIN
的区别
INNER JOIN
INNER JOIN
返回两个表中满足联接条件的交集部分。假设我们有两个表 A 和 B:
A B
- -
1 3
2 4
3 5
4 6
INNER JOIN
会返回表 A 和 B 中共有的行:
SELECT * FROM A INNER JOIN B ON A.a = B.b;
-- 结果
a | b
--+--
3 | 3
4 | 4
OUTER JOIN
OUTER JOIN
返回两个表的并集,包括未匹配到的数据部分。根据具体的类型,OUTER JOIN
可以进一步分为 LEFT OUTER JOIN
、RIGHT OUTER JOIN
和 FULL OUTER JOIN
。
LEFT OUTER JOIN
LEFT OUTER JOIN
返回左表(A)中的所有行,以及右表(B)中与左表匹配的行。如果左表中的行在右表中没有匹配项,则右表的相应列将显示为 NULL。
SELECT * FROM A LEFT OUTER JOIN B ON A.a = B.b;
-- 结果
a | b
--+-----
1 | NULL
2 | NULL
3 | 3
4 | 4
RIGHT OUTER JOIN
RIGHT OUTER JOIN
返回右表(B)中的所有行,以及左表(A)中与右表匹配的行。如果右表中的行在左表中没有匹配项,则左表的相应列将显示为 NULL。
SELECT * FROM A RIGHT OUTER JOIN B ON A.a = B.b;
-- 结果
a | b
-----+----
3 | 3
4 | 4
NULL | 5
NULL | 6
FULL OUTER JOIN
FULL OUTER JOIN
返回左表和右表中的所有行。如果在某个表中没有匹配的行,则另一个表的相应列将显示为 NULL。
SELECT * FROM A FULL OUTER JOIN B ON A.a = B.b;
a | b
-----+-----
1 | NULL
2 | NULL
3 | 3
4 | 4
NULL | 5
NULL | 6
总结
INNER JOIN
只返回两个表中匹配的行。LEFT OUTER JOIN
返回左表中的所有行,以及右表中与之匹配的行,右表中没有匹配的行显示为 NULL。RIGHT OUTER JOIN
返回右表中的所有行,以及左表中与之匹配的行,左表中没有匹配的行显示为 NULL。FULL OUTER JOIN
返回两个表中的所有行,若一方没有匹配的行,另一方相应列显示为 NULL。