本文以雙表A/B為例,通過可視化結果集對比,徹底講透內連接、左/右/全外連接、交叉連接、自然連接、聯合連接七大類型,並揭示ON/WHERE差異、查詢執行原理、連接選型決策樹。
| 表 a (id, name) | 表 b (id, job, parent_id) | |||
|---|---|---|---|---|
| 1 | 張3 | 1 | 23 | 1 |
| 2 | 李四 | 2 | 34 | 2 |
| 3 | 王武 | 3 | 34 | 4 |
關聯:a.id = b.parent_id
INNER JOINSELECT a.*, b.* FROM a INNER JOIN b ON a.id = b.parent_id;
| id | name | id | job | parent_id |
|---|---|---|---|---|
| 1 | 張3 | 1 | 23 | 1 |
| 2 | 李四 | 2 | 34 | 2 |
僅匹配行(王武無匹配,b.id=3無對應a.id=4被剔除)
LEFT JOINSELECT a.*, b.* FROM a LEFT JOIN b ON a.id = b.parent_id;
| id | name | id | job | parent_id |
|---|---|---|---|---|
| 1 | 張3 | 1 | 23 | 1 |
| 2 | 李四 | 2 | 34 | 2 |
| 3 | 王武 | NULL | NULL | NULL |
左表全保留,王武保留,右表NULL填充
RIGHT JOINSELECT a.*, b.* FROM a RIGHT JOIN b ON a.id = b.parent_id;
| id | name | id | job | parent_id |
|---|---|---|---|---|
| 1 | 張3 | 1 | 23 | 1 |
| 2 | 李四 | 2 | 34 | 2 |
| NULL | NULL | 3 | 34 | 4 |
右表全保留,b.id=3保留,左表NULL填充
FULL JOINSELECT a.*, b.* FROM a FULL JOIN b ON a.id = b.parent_id;
| id | name | id | job | parent_id |
|---|---|---|---|---|
| 1 | 張3 | 1 | 23 | 1 |
| 2 | 李四 | 2 | 34 | 2 |
| NULL | NULL | 3 | 34 | 4 |
| 3 | 王武 | NULL | NULL | NULL |
雙表全保留 = 左外 UNION 右外(去重)
CROSS JOIN(笛卡爾積)FROM A CROSS JOIN BFROM A, B(無ON/WHERE)WHERE過濾等價於內連接FROM A, B WHERE A.id = B.id(中間表=笛卡爾積→WHERE過濾)FROM A INNER JOIN B ON A.id = B.id(中間表=ON過濾後笛卡爾積,效能更優)語句7(WHERE獨立)vs 語句8(條件移至ON):
-- 7: WHERE 獨立
SELECT ... FROM O LEFT JOIN C ON C.ID=O.CUSTOMER_ID WHERE O.ORDER_NUMBER<>'MIKE_ORDER001';
-- 8: 條件在 ON
SELECT ... FROM O LEFT JOIN C ON C.ID=O.CUSTOMER_ID AND O.ORDER_NUMBER<>'MIKE_ORDER001';
結果截然不同:語句8導致左表行在ON階段被過濾,右表NULL行反而保留。鐵律:ON只寫關聯條件,WHERE寫業務過濾。
SELECT ... FROM O LEFT JOIN C ON C.ID=O.CUSTOMER_ID
UNION
SELECT ... FROM O RIGHT JOIN C ON C.ID=O.CUSTOMER_ID;
UNION JOIN(極罕見,Oracle/MySQL不支援)功能:全外連接結果 EXCEPT/MINUS 內連接結果 = 僅保留「不匹配行」。等價:
-- Oracle
SELECT ... FROM O FULL JOIN C ON ... MINUS SELECT ... FROM O INNER JOIN C ON ...;
-- DB2
SELECT ... FROM O FULL JOIN C ON ... EXCEPT SELECT ... FROM O INNER JOIN C ON ...;
自然連接 NATURAL JOIN(不推薦生產使用)
- 自動匹配同名欄位,無需ON,不允許指定SELECT列(僅*)
- 類型:
NATURAL INNER/LEFT/RIGHT/FULL JOIN
- 風險:表結構變更導致語義突變,可讀性差
SQL查詢執行原理(優化理論基石)
- 單表:WHERE過濾→中間表→SELECT投影
- 雙表:笛卡爾積→ON/連接類型過濾→中間表→WHERE過濾→SELECT投影
- 多表:遞歸雙表連接→最終中間表→WHERE→SELECT
連接選型決策樹
業務場景 選擇
雙表關聯欄位相等匹配 內連接
左表關聯欄位 ⊆ 右表 右外連接
右表關聯欄位 ⊆ 左表 左外連接
雙向有交集但互不包含 全外連接
求差集(全外 - 內) 聯合連接
掌握連接語義與執行原理,是寫出高效、正確SQL的核心內功。