在 MySQL 中,多表查詢主要分為四大類:內連接、外連接(左/右)、交叉連接與全連接。本文將透過實際數據範例,深入解析左外連接、右外連接與內連接的運作機制與差異,幫助你精準掌握多表查詢技巧。
建立兩張測試表 t1 與 t2,數據如下:
-- 表 t1
ID | NAME
---|-----
1 | aaa
2 | bbb
-- 表 t2
ID | AGE
---|----
1 | 20
3 | 30
語法: SELECT * FROM t1 LEFT JOIN t2 ON t1.id = t2.id;
結果:
ID | NAME | ID | AGE
---|------|----|----
1 | aaa | 1 | 20
2 | bbb | NULL | NULL
解析: 以左表(t1)為基準,左表所有行全部顯示。右表中與左表 ID 匹配的行「拼接」上去;若無匹配(如 t1 的 ID=2),右表欄位顯示 NULL。
語法: SELECT * FROM t1 RIGHT JOIN t2 ON t1.id = t2.id;
結果:
ID | NAME | ID | AGE
---|------|----|----
1 | aaa | 1 | 20
NULL | NULL | 3 | 30
解析: 以右表(t2)為基準,右表所有行全部顯示。左表無匹配行(如 t2 的 ID=3)則顯示 NULL。運作邏輯與左外連接完全相反。
語法: SELECT * FROM t1 INNER JOIN t2 ON t1.id = t2.id;
結果:
ID | NAME | ID | AGE
---|------|----|----
1 | aaa | 1 | 20
解析: 僅返回兩表中連接條件(t1.id = t2.id)同時滿足的行。等價於舊式寫法:SELECT * FROM t1, t2 WHERE t1.id = t2.id。內連接不會保留無匹配的行。
| 連接類型 | 關鍵字 | 返回結果特徵 |
|---|---|---|
| 內連接 | INNER JOIN | 僅返回雙方匹配的行 |
| 左外連接 | LEFT [OUTER] JOIN | 左表全量 + 右表匹配行(無匹配則 NULL) |
| 右外連接 | RIGHT [OUTER] JOIN | 右表全量 + 左表匹配行(無匹配則 NULL) |
| 全外連接 | FULL [OUTER] JOIN | 雙表全量,無匹配處填 NULL(MySQL 不直接支援,可用 UNION 模擬) |
| 交叉連接 | CROSS JOIN | 笛卡爾積:左表每行與右表每行組合 |
LEFT JOIN UNION RIGHT JOIN 模擬 FULL JOIN。