CREATE TABLE Table1 (id INT, name VARCHAR(10));
CREATE TABLE Table2 (id INT, score INT);
INSERT INTO Table1 VALUES (1, 'Lee'), (2, 'Zhang'), (4, 'Wang');
INSERT INTO Table2 VALUES (1, 90), (2, 100), (3, 70);
資料內容:
| Table1 | Table2 | ||
|---|---|---|---|
| id | name | id | score |
| 1 | Lee | 1 | 90 |
| 2 | Zhang | 2 | 100 |
| 4 | Wang | 3 | 70 |
SELECT * FROM Table1 LEFT JOIN Table2 ON Table1.id = Table2.id;
| id | name | id | score |
|---|---|---|---|
| 1 | Lee | 1 | 90 |
| 2 | Zhang | 2 | 100 |
| 4 | Wang | NULL | NULL |
→ 保留 Table1 全部 3 列,Table2 無對應者為 NULL。
SELECT * FROM Table1 RIGHT JOIN Table2 ON Table1.id = Table2.id;
| id | name | id | score |
|---|---|---|---|
| 1 | Lee | 1 | 90 |
| 2 | Zhang | 2 | 100 |
| NULL | NULL | 3 | 70 |
→ 保留 Table2 全部 3 列,Table1 無對應者為 NULL。
SELECT * FROM Table1 FULL JOIN Table2 ON Table1.id = Table2.id;
| id | name | id | score |
|---|---|---|---|
| 1 | Lee | 1 | 90 |
| 2 | Zhang | 2 | 100 |
| 4 | Wang | NULL | NULL |
| NULL | NULL | 3 | 70 |
→ 兩表聯集,無對應雙邊 NULL。
SELECT * FROM Table1 JOIN Table2 ON Table1.id = Table2.id;
| id | name | id | score |
|---|---|---|---|
| 1 | Lee | 1 | 90 |
| 2 | Zhang | 2 | 100 |
→ 僅保留雙方皆有對應的 2 列 (id=1,2)。
SELECT * FROM Table1 CROSS JOIN Table2;
| id | name | id | score |
|---|---|---|---|
| 1 | Lee | 1 | 90 |
| 1 | Lee | 2 | 100 |
| 1 | Lee | 3 | 70 |
| 2 | Zhang | 1 | 90 |
| 2 | Zhang | 2 | 100 |
| 2 | Zhang | 3 | 70 |
| 4 | Wang | 1 | 90 |
| 4 | Wang | 2 | 100 |
| 4 | Wang | 3 | 70 |
→ 3 × 3 = 9 列笛卡爾積。
| 標準 JOIN | 舊式 WHERE | CROSS JOIN + WHERE |
|---|---|---|
JOIN ... ON | FROM A,B WHERE A.id=B.id | CROSS JOIN ... WHERE A.id=B.id |
| 內聯接 | 內聯接 | 內聯接 (僅支援 WHERE) |
LEFT JOIN 最常用 (主表帶明細),RIGHT JOIN 可改寫為交換表順序的 LEFT JOIN。FULL JOIN 適用雙向差異比對 (如對帳)。CROSS JOIN 極少直接用於業務,注意避免誤寫成無條件 CROSS JOIN 導致效能災難。透過具體資料與輸出對照,直觀理解五大 JOIN 行為差異。實務開發建議:預設用 LEFT JOIN,僅在確定雙方必有資料時用 INNER JOIN,特殊比對需求用 FULL JOIN,謹慎使用 CROSS JOIN。