首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

SQL 左連接與右連接:核心區別、適用場景與實戰示例

     編輯:程式設計疑難解答

SQL 連接查詢是關係型數據庫的核心技能。很多初學者對 LEFT JOIN(左連接)和 RIGHT JOIN(右連接)的區別模糊不清,甚至混淆「以誰為主」。本文用通俗易懂的語言、直觀的 Venn 圖邏輯、實戰 SQL 語句,徹底講透左右連接的本質與用法。

核心定義:以「驅動表」為主,保留其所有行

  • LEFT JOIN:左表為主表(驅動表)。返回左表所有行,右表匹配的列;無匹配則右表列為 NULL。
  • RIGHT JOIN:右表為主表。返回右表所有行,左表匹配的列;無匹配則左表列為 NULL。
  • INNER JOIN(內連接):僅返回雙方都匹配的行。
  • FULL JOIN(全連接):返回雙方所有行,無匹配處填 NULL(MySQL 不支持,可用 UNION 模擬)。

經典示例:用戶表 & 訂單表

-- 用戶表 users
id | name
---|-----
1  | Alice
2  | Bob
3  | Charlie

-- 訂單表 orders
id | user_id | amount
---|---------|-------
101| 1       | 99.00
102| 1       | 149.00
103| 4       | 50.00  -- user_id=4 在 users 中不存在

LEFT JOIN:查所有用戶及其訂單(含無訂單用戶)

SELECT u.name, o.amount
FROM users u
LEFT JOIN orders o ON u.id = o.user_id;
結果:
name    | amount
--------|-------
Alice   | 99.00
Alice   | 149.00
Bob     | NULL
Charlie | NULL

解釋:Bob、Charlie 無訂單,但作為左表主表被保留,amount 為 NULL。訂單 103 的 user_id=4 在左表無匹配,被丟棄。

RIGHT JOIN:查所有訂單及其用戶(含無用戶訂單)

SELECT u.name, o.amount
FROM users u
RIGHT JOIN orders o ON u.id = o.user_id;
結果:
name    | amount
--------|-------
Alice   | 99.00
Alice   | 149.00
NULL    | 50.00   -- 訂單103 對應用戶不存在

解釋:右表 orders 所有行保留。訂單 103 保留,但 users 無匹配,name 為 NULL。Bob、Charlie 無訂單,不在右表中,被丟棄。

實戰選擇指南

業務場景推薦連接理由
主表數據不能丟,從表可選(如:用戶-訂單、商品-評論)LEFT JOIN符合直覺:從主表出發,習慣將主表寫在左邊
從表數據不能丟,主表可選(少見,如:日誌-用戶信息)RIGHT JOIN或交換表順序用 LEFT JOIN,可讀性更好
只需雙方都存在的數據INNER JOIN性能最好,結果集最小

最佳實踐建議

  1. 統一使用 LEFT JOIN:將「主表/驅動表」放左邊,「從表」放右邊。避免 RIGHT JOIN 降低代碼可讀性(大多數開發者習慣從左到右閱讀)。
  2. ON 條件 vs WHERE 條件:ON 指定連接條件,WHERE 過濾結果集。左連接中,右表列的過濾條件放 WHERE 會隱式轉為內連接,應放入 ON 子句。
  3. 別名簡寫:大表連接必加別名(u, o),提升可讀性。

總結

左連接 = 左表全有 + 右表匹配有則顯示無則 NULL
右連接 = 右表全有 + 左表匹配有則顯示無則 NULL
記住「誰在左/右,誰就全保留」,再配合業務語義決定驅動表,連接查詢不再迷茫。

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