萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 網路安全 >  >> 網路基礎知識

Oracle 連接查詢完整指南:CROSS JOIN、內連接、外連接、自連接語法與範例

SQL 連接查詢是關聯式資料庫核心技能。以經典 `emp`(14 筆)、`dept`(4 筆)、`salgrade`(5 筆)範例資料為基礎,詳細解析交叉連接、內連接、外連接(左/右/完整)、自連接的語法、語意差異與結果集特徵。

emp/dept/salgrade 範例資料表

一、交叉連接

無 `ON` 條件,回傳兩表笛卡兒積。顯式與隱式語法結果相同(14 × 4 = 56 筆)。

-- 隱式
SELECT empno, ename, sal, dname, loc FROM emp, dept;

-- 顯式 (ANSI SQL:1999)
SELECT empno, ename, sal, dname, loc FROM emp CROSS JOIN dept;

用途:生成測試資料組合、全排列矩陣;實務極少直接使用。

二、內連接

依 `ON`/`WHERE` 條件比對,僅回傳符合條件的資料列。最常用、效能最佳。

-- ANSI 92 (舊式)
SELECT e.empno, e.ename, e.sal, d.dname, d.loc
FROM emp e, dept d
WHERE e.deptno = d.deptno;

-- ANSI 99 (推薦)
SELECT e.empno, e.ename, e.sal, d.dname, d.loc
FROM emp e INNER JOIN dept d ON e.deptno = d.deptno;

結果:14 筆(每位員工對應其部門)。若員工 `deptno` 為 NULL 或部門表無對應部門,該列不會出現。

三、外連接

左外連接

保留左表所有列,右表無對應則填 NULL。

SELECT e.empno, e.ename, d.dname
FROM emp e LEFT OUTER JOIN dept d ON e.deptno = d.deptno;

若有員工無部門,`dname` 顯示 NULL。

右外連接

保留右表所有列,左表無對應則填 NULL。

SELECT e.empno, e.ename, d.dname
FROM emp e RIGHT OUTER JOIN dept d ON e.deptno = d.deptno;

若有部門無員工,`empno/ename` 顯示 NULL。

完整外連接

左右表皆保留,無對應處填 NULL(Oracle 支援 `FULL OUTER JOIN`)。

SELECT e.empno, e.ename, d.dname
FROM emp e FULL OUTER JOIN dept d ON e.deptno = d.deptno;

四、自連接

同一資料表自我連接,需使用別名區分角色。經典案例:查詢員工及其主管姓名。

SELECT e.ename AS 員工, m.ename AS 主管
FROM emp e LEFT JOIN emp m ON e.mgr = m.empno;

KING 為社長無主管,左連接保留其列,主管欄位為 NULL。

五、非等值連接

連接條件為範圍比較而非等號。例:依薪資等級表 `salgrade` 判定員工薪資等級。

SELECT e.ename, e.sal, s.grade
FROM emp e JOIN salgrade s ON e.sal BETWEEN s.losal AND s.hisal;

六、多表連接最佳實務

  • 永遠使用 ANSI 99 顯式 JOIN 語法(`INNER/LEFT/RIGHT/FULL JOIN ... ON`),可讀性高、不易寫錯、支援完整外連接。
  • 為每個表指定簡短別名(`e`、`d`、`s`),欄位前綴表別名避免歧義。
  • 連接欄位建立索引(外鍵欄位),大幅提升查詢效能。
  • 避免在 `ON` 條件中使用函數或運算導致索引失效。
  • 大表連接小表時,小表驅動大表(Oracle CBO 通常自動最佳化,必要時用 `/*+ LEADING(d e) */` Hint 指定)。

掌握上述連接類型與寫法,配合 `EXPLAIN PLAN` 分析執行計畫,即能應對多數實務報表與商業智慧查詢需求。

copyright © 萬盛學電腦網 all rights reserved