首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle 表連接完全指南:內連接、外連接、自然連接與自連接詳解

     編輯:Oracle 資料庫基礎

前言

在 Oracle 資料庫開發中,表連接是最核心也最常用的操作之一。正確理解並靈活運用各種連接方式,能夠大幅提升查詢效率與資料處理的靈活性。本文將系統梳理 Oracle 中的內連接、外連接(左、右、全)、自然連接以及自連接,並搭配實戰範例說明語法與行為差異。

一、 內連接

1.1 基本概念

內連接只返回兩張表中符合連接條件的匹配行。若某行在另一表中找不到對應記錄,則不會出現在結果集中。標準語法使用 INNER JOIN ... ON,其中 INNER 關鍵字可省略,單寫 JOIN 即預設為內連接。

1.2 實戰範例

建立兩張測試表 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;

三者執行結果完全一致,均返回四筆匹配記錄。

1.3 自然連接

自然連接會自動尋找兩表中「欄位名稱與資料型態皆相同」的欄位作為連接條件,無需顯式指定 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 可省略。

2.1 左外連接

以左表為基準,左表所有行皆顯示,右表僅顯示匹配行。語法:LEFT [OUTER] JOIN ... ON。
Oracle 專有的 (+) 符號寫法:在 WHERE 子句中,將 (+) 標記在右表欄位上(a.id = b.id(+))。

2.2 右外連接

以右表為基準,語法:RIGHT [OUTER] JOIN ... ON。
(+) 寫法:a.id(+) = b.id。

2.3 全外連接

雙邊皆為基準,所有行皆顯示,不匹配處以 NULL 填充。語法:FULL [OUTER] JOIN ... ON。
不支援 (+) 符號實現。

2.4 關鍵限制

  • 使用 FROM ... JOIN 語法時,必須 用 ON 指定條件。
  • 使用 (+) 時,必須 在 WHERE 子句中指定條件。
  • (+) 僅能用於欄位,不可用於運算式;不可與 OR、IN 同用;無法實現全外連接。

三、 自連接

自連接將同一張表視為兩張不同表進行連接,常用於階層式資料(如員工-主管關係)。需給表取別名以區分角色。

3.1 經典範例:查詢員工與其主管名稱

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 / JOINWHERE a.id = b.id僅返回匹配行
左外連接LEFT JOINWHERE a.id = b.id(+)保留左表所有行
右外連接RIGHT JOINWHERE a.id(+) = b.id保留右表所有行
全外連接FULL JOIN不支援保留雙表所有行
自然連接NATURAL JOIN無自動匹配同名同型欄位
自連接表別名 + 任意連接同上同表不同角色連接

掌握這些連接方式,並根據業務場景選擇最合適的寫法,是編寫高效、可維護 SQL 的關鍵基礎。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved