將兩張或多張表按關聯列(通常是外鍵)匹配,組合成寬表輸出。關鍵在於關聯條件與連接類型的選擇。
employee(num, name, d_id, sex, age, address)department(d_id, d_name, function)公共列:d_id(部門ID)
| 類型 | 語法 | 結果集 | 典型場景 |
|---|---|---|---|
| 內連接 | INNER JOIN / JOIN / WHERE | 雙方都匹配的行 | 主流業務,如訂單-用戶 |
| 左外連接 | LEFT JOIN | 左表全量+右表匹配行(無則NULL) | 主表帶從表信息,如用戶-訂單(含無訂單用戶) |
| 右外連接 | RIGHT JOIN | 右表全量+左表匹配行(無則NULL) | 少用,可改為LEFT JOIN交換表順序 |
| 全外連接 | FULL JOIN | 雙方全量(MySQL不支持,用UNION模擬) | 雙向全量保留 |
-- 顯式語法(推薦,語義清晰)
SELECT e.num, e.name, e.d_id, e.sex, d.d_name, d.function
FROM employee e
INNER JOIN department d ON e.d_id = d.d_id;
-- 隱式語法(舊標準,不推薦)
SELECT ... FROM employee e, department d WHERE e.d_id = d.d_id;
結果:3行(僅有部門的員工)
SELECT e.num, e.name, e.d_id, d.d_name, d.function
FROM employee e
LEFT JOIN department d ON e.d_id = d.d_id;
結果:4行(含Aric d_id=1004無對應部門,d_name/function=NULL)
SELECT e.num, e.name, e.d_id, d.d_name, d.function
FROM employee e
RIGHT JOIN department d ON e.d_id = d.d_id;
結果:4行(含銷售部無員工,num/name/d_id=NULL)
SELECT e.num, e.name, e.d_id, e.sex, e.age, e.address
FROM employee e
INNER JOIN department d ON e.d_id = d.d_id
WHERE e.age >= 25; -- 額外業務過濾條件
結果:2行(張三26歲、王五25歲)
LEFT JOIN左表應為小表;INNER JOIN優化器自動選擇驅動表d_id雙方均需索引,否則ALL JOIN全表掃描災難WHERE條件盡量寫在ON子句(外連接語義不同)或WHERE(內連接等價)type=ref/eq_ref:索引查找,良好type=ALL:全表掃描,需加索引Extra=Using where; Using index:覆蓋索引,最優Extra=Using temporary; Using filesort:臨時表+排序,優化GROUP BY/ORDER BY連接查詢是關係型數據庫威力的核心體現,正確選型與索引配合,決定著系統查詢性能的上限。