在 Oracle 資料庫操作中,連接查詢是多表關聯的核心技術。無論是 Oracle 還是其他主流資料庫(如 MySQL、PostgreSQL、SQL Server),都支援三種基本連接方式:內連接、外連接、全連接。掌握它們的差異與適用場景,能讓你撰寫出更精準、高效的 SQL。
內連接是最常用的查詢方式,只返回兩張表中符合連接條件的匹配記錄。若某筆資料在另一張表找不到對應值,則不會出現在結果集中。
-- ANSI SQL-92 標準語法(推薦)
SELECT * FROM dept d INNER JOIN employee e ON d.deptid = e.deptid;
-- Oracle 傳統語法
SELECT * FROM dept d, employee e WHERE d.deptid = e.deptid;
外連接分為左外連接、右外連接,核心在於保留主表的所有記錄,即使從表無匹配資料,主表欄位仍會顯示,從表欄位則填充 NULL。
假設有兩張表:
注意:職工表中 deptid=5 的部門在部門表不存在;部門表中 deptid=3(人事部)無對應職工。
SELECT * FROM dept d LEFT OUTER JOIN employee e ON d.deptid = e.deptid;
結果:列出所有部門,人事部會顯示,職工欄位為 NULL;張學友因部門不存在,不會出現。
SELECT * FROM dept d RIGHT OUTER JOIN employee e ON d.deptid = e.deptid;
結果:列出所有職工,張學友會顯示,部門欄位為 NULL;人事部無職工,不會出現。
全連接是左外連接與右外連接的並集,會返回兩張表所有的記錄,無論是否匹配。
SELECT * FROM dept d FULL OUTER JOIN employee e ON d.deptid = e.deptid;
結果:包含人事部(無職工)、張學友(無部門)、以及匹配的開發部與職工。
| 連接類型 | 保留資料 | 適用場景 |
|---|---|---|
| INNER JOIN | 僅匹配行 | 雙方必須有資料的強關聯 |
| LEFT JOIN | 左表全部 | 主表為主,從表可能為空(如:部門-員工) |
| RIGHT JOIN | 右表全部 | 從表為主,主表可能為空 |
| FULL JOIN | 雙表全部 | 需完整保留雙方資料,做差異比對 |
/*+ LEADING */ 等 Hint 引導執行計畫。