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

SQL 連接查詢完全圖解:INNER / LEFT / RIGHT / FULL JOIN 差異與實戰

     編輯:MySQL 資料庫相關知識

測試資料

-- table1
id | name    | qq       | phone
1  | 秦雲    | 10102800 | 13500000
2  | 在路上  | 10378    | 13600000
3  | LEO     | 10000    | 13900000
4  | 秦雲    | 0241458  | 54564512

-- table2
id | name    | sjsj                  | gly
1  | 秦雲    | 2004-01-01 00:00:00   | 李大偉
2  | 秦雲    | 2005-01-01 00:00:00   | 馬化騰
3  | 在路上  | 2005-01-01 00:00:00   | 馬化騰
4  | 秦雲    | 2005-01-01 00:00:00   | 李大偉
5  | 在路上  | 2005-01-01 00:00:00   | 李大偉

1. INNER JOIN(內連接)

僅返回兩表都滿足連接條件的行。

SELECT * FROM table1 t1 INNER JOIN table2 t2 ON t1.name = t2.name;

結果:8 行(秦雲 2×3=6 行 + 在路上 1×2=2 行),LEO 無對應被過濾。

2. LEFT JOIN(左外連接)

以左表為主,右表無匹配則 NULL 填充。

SELECT * FROM table1 t1 LEFT JOIN table2 t2 ON t1.name = t2.name;

結果:10 行(內連接 8 行 + LEO 1 行 NULL + 秦雲第 4 行匹配 3 行)。
等價:table2 RIGHT JOIN table1(表順序互換)。

3. RIGHT JOIN(右外連接)

以右表為主,左表無匹配則 NULL。

SELECT * FROM table1 t1 RIGHT JOIN table2 t2 ON t1.name = t2.name;

結果:8 行(同內連接,因右表所有 name 在左表都有匹配)。

4. FULL JOIN(全外連接)

MySQL 不直接支援,需 UNION 模擬:

SELECT * FROM table1 t1 LEFT JOIN table2 t2 ON t1.name = t2.name
UNION
SELECT * FROM table1 t1 RIGHT JOIN table2 t2 ON t1.name = t2.name;

結果:10 行(含 LEO 左表獨有、右表若有獨有也會保留)。

結果集行數推導公式

連接類型行數公式
INNER JOINΣ (左表某值行數 × 右表同值行數)
LEFT JOIN左表總行數 + Σ (左表某值行數 × (右表同值行數 - 1))
RIGHT JOIN右表總行數 + Σ (右表某值行數 × (左表同值行數 - 1))
FULL JOINLEFT JOIN 行數 + 右表獨有值行數

效能建議

  • 小表驅動大表:將結果集較小的表放在驅動位置(LEFT JOIN 左表 / RIGHT JOIN 右表)
  • 連接欄位加索引、型別一致、字元集一致
  • 避免 SELECT *,只取需要欄位減少網路傳輸
  • 大表關聯考慮 STRAIGHT_JOIN 強制順序或應用層分批

記憶口訣

內連:雙方都有才顯示
左連:左表全保留,右表配不上填 NULL
右連:右表全保留,左表配不上填 NULL
全連:左右全保留,MySQL 用 UNION 模擬

掌握四種連接語義與行數推導,複雜報表 SQL 寫得快、改得準。

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