JOIN 是多表關聯查詢核心,理解三種基本連接類型的語義差異,是寫出正確 SQL 的關鍵。
| 表 A | 表 B | ||
|---|---|---|---|
| aID | aNum | bID | bName |
| 1 | a20050111 | 1 | 2006032401 |
| 2 | a20050112 | 2 | 2006032402 |
| 3 | a20050113 | 3 | 2006032403 |
| 4 | a20050114 | 4 | 2006032404 |
| 5 | a20050115 | 8 | 2006032408 |
關聯條件:A.aID = B.bID
SELECT * FROM A
INNER JOIN B ON A.aID = B.bID;
| aID | aNum | bID | bName |
|---|---|---|---|
| 1 | a20050111 | 1 | 2006032401 |
| 2 | a20050112 | 2 | 2006032402 |
| 3 | a20050113 | 3 | 2006032403 |
| 4 | a20050114 | 4 | 2006032404 |
特性:僅回傳 **雙方都符合條件** 的列。不以哪張表為基準,純粹取交集。
A 的 5、B 的 8 均無對應 → 不出現。
SELECT * FROM A
LEFT JOIN B ON A.aID = B.bID;
| aID | aNum | bID | bName |
|---|---|---|---|
| 1 | a20050111 | 1 | 2006032401 |
| 2 | a20050112 | 2 | 2006032402 |
| 3 | a20050113 | 3 | 2006032403 |
| 4 | a20050114 | 4 | 2006032404 |
| 5 | a20050115 | NULL | NULL |
特性:以 **左表(A)為基準**,左表所有列皆保留;右表無對應處以 NULL 填補。
適用:「主表帶明細」,如「所有客戶及其訂單(無訂單也要列出)」。
SELECT * FROM A
RIGHT JOIN B ON A.aID = B.bID;
| aID | aNum | bID | bName |
|---|---|---|---|
| 1 | a20050111 | 1 | 2006032401 |
| 2 | a20050112 | 2 | 2006032402 |
| 3 | a20050113 | 3 | 2006032403 |
| 4 | a20050114 | 4 | 2006032404 |
| NULL | NULL | 8 | 2006032408 |
特性:以 **右表(B)為基準**,右表所有列保留;左表無對應處以 NULL 填補。
LEFT JOIN 與 RIGHT JOIN 互換表順序即可轉換,實務多統一用 LEFT JOIN 以降低認知負荷。
STRAIGHT_JOIN 強制按 FROM 順序連接(慎用)。LATERAL JOIN / CTE 簡化複雜邏輯。