SQL 連接查詢是關係型數據庫的核心技能。很多初學者對 LEFT JOIN(左連接)和 RIGHT JOIN(右連接)的區別模糊不清,甚至混淆「以誰為主」。本文用通俗易懂的語言、直觀的 Venn 圖邏輯、實戰 SQL 語句,徹底講透左右連接的本質與用法。
NULL。NULL。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 中不存在
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 在左表無匹配,被丟棄。
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 | 性能最好,結果集最小 |
ON 指定連接條件,WHERE 過濾結果集。左連接中,右表列的過濾條件放 WHERE 會隱式轉為內連接,應放入 ON 子句。u, o),提升可讀性。左連接 = 左表全有 + 右表匹配有則顯示無則 NULL
右連接 = 右表全有 + 左表匹配有則顯示無則 NULL
記住「誰在左/右,誰就全保留」,再配合業務語義決定驅動表,連接查詢不再迷茫。