首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

SQL四大連接類型深度圖解:左外、右外、內、全連接與交叉/自然/聯合連接全景

     編輯:MySQL 資料庫相關知識

本文以雙表A/B為例,通過可視化結果集對比,徹底講透內連接、左/右/全外連接、交叉連接、自然連接、聯合連接七大類型,並揭示ON/WHERE差異、查詢執行原理、連接選型決策樹。

測試資料

表 a (id, name)表 b (id, job, parent_id)
1張31231
2李四2342
3王武3344

關聯:a.id = b.parent_id

四大核心連接結果集對比

1. 內連接 INNER JOIN

SELECT a.*, b.* FROM a INNER JOIN b ON a.id = b.parent_id;
idnameidjobparent_id
1張31231
2李四2342

僅匹配行(王武無匹配,b.id=3無對應a.id=4被剔除)

2. 左外連接 LEFT JOIN

SELECT a.*, b.* FROM a LEFT JOIN b ON a.id = b.parent_id;
idnameidjobparent_id
1張31231
2李四2342
3王武NULLNULLNULL

左表全保留,王武保留,右表NULL填充

3. 右外連接 RIGHT JOIN

SELECT a.*, b.* FROM a RIGHT JOIN b ON a.id = b.parent_id;
idnameidjobparent_id
1張31231
2李四2342
NULLNULL3344

右表全保留,b.id=3保留,左表NULL填充

4. 全外連接 FULL JOIN

SELECT a.*, b.* FROM a FULL JOIN b ON a.id = b.parent_id;
idnameidjobparent_id
1張31231
2李四2342
NULLNULL3344
3王武NULLNULLNULL

雙表全保留 = 左外 UNION 右外(去重)

進階連接類型

交叉連接 CROSS JOIN(笛卡爾積)

  • 顯式:FROM A CROSS JOIN B
  • 隱式:FROM A, B(無ON/WHERE)
  • 結果:M×N行,WHERE過濾等價於內連接

內連接:顯式 vs 隱式

  • 隱式:FROM A, B WHERE A.id = B.id(中間表=笛卡爾積→WHERE過濾)
  • 顯式:FROM A INNER JOIN B ON A.id = B.id(中間表=ON過濾後笛卡爾積,效能更優)

外連接:ON後條件 vs WHERE條件

語句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寫業務過濾。

全外連接 MySQL 替代方案

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查詢執行原理(優化理論基石)

  1. 單表:WHERE過濾→中間表→SELECT投影
  2. 雙表:笛卡爾積→ON/連接類型過濾→中間表→WHERE過濾→SELECT投影
  3. 多表:遞歸雙表連接→最終中間表→WHERE→SELECT

連接選型決策樹

業務場景選擇
雙表關聯欄位相等匹配內連接
左表關聯欄位 ⊆ 右表右外連接
右表關聯欄位 ⊆ 左表左外連接
雙向有交集但互不包含全外連接
求差集(全外 - 內)聯合連接

掌握連接語義與執行原理,是寫出高效、正確SQL的核心內功。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved