連接是關聯式資料庫的核心特徵。透過連接運算子,可從多張表組合出完整資訊。SQL-92 標準建議在 FROM 子句指定連接,分離連接邏輯與篩選條件。
FROM join_table join_type join_table [ON (join_condition)]
join_table:參與連接的表(可為同一表 → 自連接)join_type:內連接、外連接、交叉連接ON:連接條件(欄位、比較/邏輯運算子)限制:text/ntext/image 型別不可直接連接,需轉換(如 DATALENGTH())間接比較。
僅回傳符合連接條件的匹配行。
= 比較,結果含重複欄位= 比較 + 選擇清單移除重複欄位>, >=, <, <=, <>, !>, !<-- 等值連接 SELECT * FROM authors AS a INNER JOIN publishers AS p ON a.city = p.city; -- 自然連接(移除重複 city, state) SELECT a.*, p.pub_id, p.pub_name, p.country FROM authors AS a INNER JOIN publishers AS p ON a.city = p.city;
除匹配行外,保留單邊或雙邊所有行,無匹配處以 NULL 填補。
以左表為基準,保留左表所有行。
SELECT field1, field2 FROM table1 LEFT JOIN table2 ON table1.field1 = table2.field2 WHERE table1.field3 = table2.field3;
以右表為基準,保留右表所有行。語法對稱。
保留雙邊所有行。
無 WHERE 條件,回傳笛卡爾積:結果行數 = 左表行數 × 右表行數。
-- 6 類圖書 × 8 家出版社 = 48 行 SELECT type, pub_name FROM titles CROSS JOIN publishers ORDER BY type;
SELECT p1.pub_id, p2.pub_id, p1.pr_info FROM pub_info AS p1 INNER JOIN pub_info AS p2 ON DATALENGTH(p1.pr_info) = DATALENGTH(p2.pr_info);
| 需求 | 推薦連接 |
|---|---|
| 只需雙方都有的資料 | INNER JOIN |
| 保留主表所有資料,附帶從表資料 | LEFT JOIN |
| 保留從表所有資料,附帶主表資料 | RIGHT JOIN |
| 保留雙方所有資料 | FULL JOIN |
| 組合所有排列組合 | CROSS JOIN |
FROM ... JOIN ... ON 語法,可讀性與維護性最佳熟練掌握三種連接類型與適用場景,是寫出高效、正確 SQL 的基石。