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)左連接和右連接來獲得全連接的結果。