LEFT JOIN 是最常用的外聯接,核心語意:「保留左表所有資料列,右表匹配則顯示,不匹配則填 NULL」。本文以最小資料集 (3 列 vs 3 列) 逐步演示 INNER JOIN、LEFT JOIN、RIGHT JOIN 三種結果差異,幫助初學者建立直觀心智模型。
| 表 A | 表 B | ||
|---|---|---|---|
| AID | ADATE | BID | BDATE |
| 1 | A1 | 1 | B1 |
| 2 | A2 | 2 | B2 |
| 3 | A3 | 4 | B4 |
SELECT * FROM A INNER JOIN B ON A.AID = B.BID;
| AID | ADATE | BID | BDATE |
|---|---|---|---|
| 1 | A1 | 1 | B1 |
| 2 | A2 | 2 | B2 |
列 3 (AID=3) 與列 4 (BID=4) 均被捨棄。
SELECT * FROM A LEFT JOIN B ON A.AID = B.BID;
| AID | ADATE | BID | BDATE |
|---|---|---|---|
| 1 | A1 | 1 | B1 |
| 2 | A2 | 2 | B2 |
| 3 | A3 | NULL | NULL |
列 3 保留,右表欄位填 NULL。
SELECT * FROM A RIGHT JOIN B ON A.AID = B.BID;
| AID | ADATE | BID | BDATE |
|---|---|---|---|
| 1 | A1 | 1 | B1 |
| 2 | A2 | 2 | B2 |
| NULL | NULL | 4 | B4 |
列 4 保留,左表欄位填 NULL。
LEFT JOIN → 左表全保留,右表匹配補齊,不匹配填 NULL。
RIGHT JOIN → 右表全保留,左表匹配補齊,不匹配填 NULL。
INNER JOIN → 只保留雙邊都有的交集。
SELECT C.NAME, O.ORDER_DATE, OD.QTY, P.PRODUCT_NAME
FROM CUSTOMERS C
LEFT JOIN ORDERS O ON C.CUST_ID = O.CUST_ID
LEFT JOIN ORDER_DETAILS OD ON O.ORDER_ID = OD.ORDER_ID
LEFT JOIN PRODUCTS P ON OD.PROD_ID = P.PROD_ID;
若客戶無訂單 → 訂單/明細/產品欄位全 NULL;若訂單無明細 → 明細/產品 NULL。每一層 LEFT JOIN 都以左側累積結果為基準。
| 錯誤寫法 | 現象 | 修正 |
|---|---|---|
| LEFT JOIN ... WHERE B.COL = 'X' | 隱性轉為 INNER JOIN | 條件移至 ON: LEFT JOIN ... ON A.ID=B.ID AND B.COL='X' | SELECT A.*, B.* FROM A LEFT JOIN B ON ... WHERE B.ID IS NULL | 正確:找出左表無匹配右表的列 (反向查詢) | 此用法正確,常用於差異比對 |
| 以為 LEFT JOIN 會過濾左表 | 誤解語意 | 左表列數永遠 ≥ 原左表列數 |