LEFT JOIN 是查詢「主表有、從表無」資料的利器。本文以使用者表與使用者資料表為例,展示基本與複雜條件下的左連接寫法。
資料表:user (主表) 、user_profile (從表),以 id 關聯。
SELECT COUNT(*) FROM user LEFT JOIN user_profile ON user.id = user_profile.id WHERE user_profile.id IS NULL;
原理: 左連接保留左表所有列,右表無匹配則為 NULL;WHERE ... IS NULL 即過濾出「只有左表有」的記錄。
SELECT COUNT(*) FROM user LEFT JOIN user_profile ON user.id = user_profile.id WHERE user.level > 1 OR user_profile.money > 10000;
此查詢回傳:等級大於 1 的使用者,或 資料表中金額超過 10000 的使用者(含無資料者,因 NULL > 10000 為 UNKNOWN,需注意三值邏輯)。
| 寫法 | 語意 | 效能備註 |
|---|---|---|
| LEFT JOIN ... WHERE t2.id IS NULL | 左表有、右表無 | 早期版本優化較好 |
| NOT EXISTS (SELECT 1 FROM t2 WHERE t2.id = t1.id) | 不存在滿足條件的右表記錄 | 現代優化器處理相同,語意更清晰 |
| NOT IN (SELECT id FROM t2) | 左表ID不在右表ID集合中 | 若子查詢含NULL會回傳空集合,慎用 |
SELECT 1 或 SELECT COUNT(*) 比 SELECT * 快。EXPLAIN 分析執行計畫,確認用到索引。LEFT JOIN ... WHERE IS NULL 是查找「孤兒記錄」的標準模式;搭配索引與 NOT EXISTS 可應對大多數差集查詢需求。理解三值邏輯 (TRUE/FALSE/NULL) 對複雜條件正確性至關重要。