首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 連接查詢通俗解析:INNER/LEFT/RIGHT JOIN 圖解與實戰

     編輯:MySQL 綜合教學

MySQL 連接查詢通俗解析:INNER/LEFT/RIGHT JOIN 圖解與實戰

JOIN 是多表關聯查詢的核心。本文以兩張簡單表為例,通過數據演示直觀解析 INNER JOIN、LEFT JOIN、RIGHT JOIN 的結果差異,並給出 Venn 圖思維模型與實戰場景。

一、樣本數據

-- 表 a
aid | adate
1   | a1
2   | a2
3   | a3

-- 表 b
bid | bdate
1   | b1
2   | b2
4   | b4

二、三種 JOIN 執行結果對比

JOIN 類型SQL結果集通俗理解
INNER JOINSELECT * FROM a INNER JOIN b ON a.aid = b.bid 1 a1 b1
2 a2 b2
僅返回雙方都匹配的行 (交集)
LEFT JOINSELECT * FROM a LEFT JOIN b ON a.aid = b.bid 1 a1 b1
2 a2 b2
3 a3 NULL
返回左表所有行,右表無匹配則填 NULL
RIGHT JOINSELECT * FROM a RIGHT JOIN b ON a.aid = b.bid 1 a1 b1
2 a2 b2
NULL NULL b4
返回右表所有行,左表無匹配則填 NULL

三、Venn 圖思維模型

INNER JOIN = A ∩ B
LEFT JOIN  = A ∪ (A ∩ B)  → 所有 A
RIGHT JOIN = B ∪ (A ∩ B)  → 所有 B

四、實戰案例:用戶與訂單

-- Persons 表
Id_P | LastName | FirstName | Address      | City
1    | Adams    | John      | Oxford St    | London
2    | Bush     | George    | Fifth Ave    | New York
3    | Carter   | Thomas    | Changan St   | Beijing

-- Orders 表
Id_O | OrderNo | Id_P
1    | 77895   | 3
2    | 44678   | 3
3    | 22456   | 1
4    | 24562   | 1
5    | 34764   | 65  -- 孤兒訂單

-- 需求:列出所有人及其訂單 (無訂單也顯示)
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
LEFT JOIN Orders ON Persons.Id_P = Orders.Id_P
ORDER BY Persons.LastName;

結果:

Adams  John  22456
Adams  John  24562
Bush   George NULL
Carter Thomas 77895
Carter Thomas 44678

關鍵點:LEFT JOIN 保證左表 (Persons) 所有行出現,右表無匹配顯示 NULL。若改為 INNER JOIN,Bush 將消失。

五、進階技巧

  • 多表鏈式 JOIN:a LEFT JOIN b ON ... LEFT JOIN c ON ...,以第一張表為基準。
  • 條件下推:LEFT JOIN b ON a.id=b.id AND b.status=1 (ON 中過濾) vs WHERE b.status=1 (WHERE 中過濾會將 LEFT JOIN 退化為 INNER JOIN)。
  • USING 簡寫:同名列可用 JOIN b USING (id)。
  • 性能:驅動表 (外層循環) 應為小結果集,被驅動表關聯列需有索引。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved