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

SQL LEFT JOIN 左連接詳解:語法、視覺化理解與多表關聯實戰

     編輯:MySQL 綜合教學

核心語義

保留左表所有行,右表無匹配則用 NULL 填充。

SELECT column_list
FROM left_table AS L
LEFT JOIN right_table AS R ON L.join_key = R.join_key;

視覺化:文氏圖

  左表 (L)          右表 (R)          LEFT JOIN 結果
┌─────────┐       ┌─────────┐       ┌─────────────────┐
│ A  ●────┼───────┼─● B     │       │ A  B  (匹配)    │
│ C  ●────┼───────┤         │  →    │ C  NULL (無匹配)│
│ D       │       │         │       │ D  NULL         │
└─────────┘       └─────────┘       └─────────────────┘

經典範例:員工與訂單

-- 表 Persons (Id_P, LastName, FirstName)
-- 表 Orders  (Id_O, OrderNo, Id_P)

SELECT p.LastName, p.FirstName, o.OrderNo
FROM Persons AS p
LEFT JOIN Orders AS o ON p.Id_P = o.Id_P
ORDER BY p.LastName;

結果

LastName | FirstName | OrderNo
Adams    | John      | 22456
Adams    | John      | 24562
Carter   | Thomas    | 77895
Carter   | Thomas    | 44678
Bush     | George    | NULL   -- 無訂單,但保留

LEFT JOIN vs INNER JOIN vs RIGHT JOIN

連接類型結果行數用途
INNER JOIN雙方都有匹配核心業務關聯,雙方必須存在
LEFT JOIN左表全保留主表帶從表屬性,從表可選
RIGHT JOIN右表全保留少用,可改寫為 LEFT JOIN 交換表順序

多表鏈式 LEFT JOIN

SELECT u.name, o.order_no, oi.product_name, oi.qty
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
LEFT JOIN order_items oi ON o.id = oi.order_id
WHERE u.status = 'active';

每個 LEFT JOIN 都以前面結果集為左表,逐步擴展。

性能優化鐵律

  1. ON 條件列雙方必須有索引,否則全表掃描。
  2. WHERE 條件放左表可下推;放右表非 NULL 條件會隱式轉為 INNER JOIN。
  3. 大表驅動小表:用小結果集驅動大表(通過子查詢/臨時表)。
  4. 只需判斷存在性用 EXISTS 替代 LEFT JOIN ... WHERE R.id IS NOT NULL。

常見陷阱

-- 陷阱:右表條件寫在 WHERE 導致 LEFT JOIN 失效
SELECT * FROM a LEFT JOIN b ON a.id = b.a_id WHERE b.status = 'active';
-- 等價於 INNER JOIN,因 b.status=NULL 不滿足條件

-- 正確:右表條件移至 ON
SELECT * FROM a LEFT JOIN b ON a.id = b.a_id AND b.status = 'active';
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved