在 Oracle 資料庫開發中,表連接是最核心也最常用的操作之一。正確理解並靈活運用各種連接方式,能夠大幅提升查詢效率與資料處理的靈活性。本文將系統梳理 Oracle 中的內連接、外連接(左、右、全)、自然連接以及自連接,並搭配實戰範例說明語法與行為差異。
內連接只返回兩張表中符合連接條件的匹配行。若某行在另一表中找不到對應記錄,則不會出現在結果集中。標準語法使用 INNER JOIN ... ON,其中 INNER 關鍵字可省略,單寫 JOIN 即預設為內連接。
建立兩張測試表 dave 與 bl 並插入資料:
-- dave 表
ID NAME
1 dave
2 bl
1 bl
2 dave
-- bl 表
ID NAME
1 dave
2 bl
三種等價的內連接寫法:
-- 標準寫法
SELECT a.id, a.name, b.name
FROM dave a INNER JOIN bl b ON a.id = b.id;
-- 省略 INNER
SELECT a.id, a.name, b.name
FROM dave a JOIN bl b ON a.id = b.id;
-- 舊式 WHERE 寫法
SELECT a.id, a.name, b.name
FROM dave a, bl b
WHERE a.id = b.id;
三者執行結果完全一致,均返回四筆匹配記錄。
自然連接會自動尋找兩表中「欄位名稱與資料型態皆相同」的欄位作為連接條件,無需顯式指定 ON 子句。例如:
SELECT id, name FROM dave a NATURAL JOIN bl b;
上述語句實際相當於:
SELECT dave.id, bl.name
FROM dave JOIN bl ON dave.id = bl.id AND dave.name = bl.name;
注意事項:
外連接除了返回匹配行,還會保留基準表中不符合條件的行,缺失側以 NULL 填充。分為左、右、全外連接,關鍵字 OUTER 可省略。
以左表為基準,左表所有行皆顯示,右表僅顯示匹配行。語法:LEFT [OUTER] JOIN ... ON。
Oracle 專有的 (+) 符號寫法:在 WHERE 子句中,將 (+) 標記在右表欄位上(a.id = b.id(+))。
以右表為基準,語法:RIGHT [OUTER] JOIN ... ON。
(+) 寫法:a.id(+) = b.id。
雙邊皆為基準,所有行皆顯示,不匹配處以 NULL 填充。語法:FULL [OUTER] JOIN ... ON。
不支援 (+) 符號實現。
FROM ... JOIN 語法時,必須 用 ON 指定條件。(+) 時,必須 在 WHERE 子句中指定條件。(+) 僅能用於欄位,不可用於運算式;不可與 OR、IN 同用;無法實現全外連接。自連接將同一張表視為兩張不同表進行連接,常用於階層式資料(如員工-主管關係)。需給表取別名以區分角色。
SELECT work.ename AS worker, mgr.ename AS manager
FROM scott.emp work, scott.emp mgr
WHERE work.mgr = mgr.empno(+)
ORDER BY work.ename;
此處使用左外連接((+)),確保無主管的員工(如 KING)仍會出現在結果中,主管欄位顯示 NULL。
| 連接類型 | 標準語法 | Oracle (+) 寫法 | 特點 |
|---|---|---|---|
| 內連接 | INNER JOIN / JOIN | WHERE a.id = b.id | 僅返回匹配行 |
| 左外連接 | LEFT JOIN | WHERE a.id = b.id(+) | 保留左表所有行 |
| 右外連接 | RIGHT JOIN | WHERE a.id(+) = b.id | 保留右表所有行 |
| 全外連接 | FULL JOIN | 不支援 | 保留雙表所有行 |
| 自然連接 | NATURAL JOIN | 無 | 自動匹配同名同型欄位 |
| 自連接 | 表別名 + 任意連接 | 同上 | 同表不同角色連接 |
掌握這些連接方式,並根據業務場景選擇最合適的寫法,是編寫高效、可維護 SQL 的關鍵基礎。