MySQL 不支持 FULL OUTER JOIN,如果需要使用 FULL OUTER JOIN,可以使用 LEFT OUTER JOIN 和 RIGHT OUTER JOIN 来模拟。这篇文章研究怎样使用 LEFT OUTER JOIN 和 RIGHT OUTER JOIN 代替 FULL OUTER JOIN。
因为 PostgreSQL 支持 FULL OUTER JOIN,所以可以直接使用 FULL OUTER JOIN 来判断结果是否正确。
1. 2 张表,值唯一的情况。
1.1. 创建测试表。
DROP TABLE IF EXISTS table1; DROP TABLE IF EXISTS table2; CREATE TABLE table1 ( column_1 NUMERIC ); INSERT INTO table1 VALUES (123); INSERT INTO table1 VALUES (12); INSERT INTO table1 VALUES (111); CREATE TABLE table2 ( column_2 NUMERIC ); INSERT INTO table2 VALUES (123); INSERT INTO table2 VALUES (12); INSERT INTO table2 VALUES (23);
1.2 查看表里的内容
查询 1-2-1: 查询表 1 内容。
SELECT * FROM table1 t1;
输出 1-2-1:
123
12
111
查询 1-2-2: 查询表 2 内容。
SELECT * FROM table2 t2;
输出 1-2-2
123
12
23
1.3 链接查询
查询 1-3-1: 两张表内连接。
SELECT * FROM table1 t1 INNER JOIN table2 t2 ON t1.column_1 = t2.column_2 ORDER BY column_1, column_2;
输出 1-3-1:
12 12
123 123
解释 1-3-1:INNER JOIN 只输出满足连接条件的行。(注:ON 后面的内容,在本文中称之为连接条件)
查询 1-3-2: 两张表左连接。
SELECT * FROM table1 t1 LEFT OUTER JOIN table2 t2 ON t1.column_1 = t2.column_2 ORDER BY column_1, column_2;
输出 1-3-2:
12 12
111
123 123
解释 1-3-2: 左连接,左边的表每一行都会输出。右边的表只输出符合连接条件的行。可以这么理解:左连接 = 内连接 + 左表不符合连接条件的行。
查询 1-3-3: 两张表右连接。
SELECT * FROM table1 t1 RIGHT OUTER JOIN table2 t2 ON t1.column_1 = t2.column_2 ORDER BY column_1, column_2;
输出 1-3-3:
12 12
123 123
23
解释 1-3-3: 右连接,右边的表每一行都会输出。左边的表只输出符合连接条件的行。可以这么理解:右连接 = 内连接 + 右表不符合连接条件的行。
查询 1-3-4: 两张表全连接。
SELECT * FROM table1 t1 FULL OUTER JOIN table2 t2 ON t1.column_1 = t2.column_2 ORDER BY column_1, column_2;
输出 1-3-4:
12 12
111
123 123
23
解释 1-3-4: 全连接,左边的表每一行都会输出,右边的表每一行也都会输出。可以这么理解:全连接 = 内连接 + 左表不符合连接条件的行 + 右表不符合连接条件的行。
整理一下上面的解释:
左连接 = 内连接 + 左表不符合连接条件的行
右连接 = 内连接 + 右表不符合连接条件的行
全连接 = 内连接 + 左表不符合连接条件的行 + 右表不符合连接条件的行所以:
全连接 = 左连接 + 右连接 - 内连接
这篇文章的标题是使用左连接和右连接来代替全连接。如果在合并左连接和右连接的时候,可以将重复的行去掉,就可以得到全连接的结果了。刚好,UNION 提供了这样的功能。
查询 1-3-5: 使用 UNION 合并左连接和右连接。
SELECT * FROM table1 t1 LEFT OUTER JOIN table2 t2 ON t1.column_1 = t2.column_2 UNION SELECT * FROM table1 t1 RIGHT OUTER JOIN table2 t2 ON t1.column_1 = t2.column_2 ORDER BY column_1, column_2;
输出 1-3-5:
12 12
111
123 123
23
可以看出,输出 1-3-4 和 1-3-5 完全相同。
总结:
在 2 张表、值唯一的情况下,可以联合(UNION)左连接和右连接来获得全连接的结果。