FULL JOIN 關鍵字 (SQL FULL OUTER JOIN)

FULL JOIN (也稱為 FULL OUTER JOIN) 是 LEFT JOINRIGHT JOIN 的聯集。它會返回兩個資料表中所有的記錄,無論它們是否在另一個資料表中有匹配的記錄。

  • 對於左表中沒有匹配的記錄,右表的欄位會顯示 NULL
  • 對於右表中沒有匹配的記錄,左表的欄位會顯示 NULL

FULL JOIN 語法 (Syntax)

SELECT column_list
FROM table1
FULL JOIN table2
ON table1.column_name = table2.column_name;

或使用完整名稱:

SELECT column_list
FROM table1
FULL OUTER JOIN table2
ON table1.column_name = table2.column_name;

FULL JOIN 運作原理圖解

想像兩個圓圈代表兩個資料表:

     ┌───────────┐     ┌───────────┐
     │           │     │           │
     │   Left    │     │   Right   │
     │   Table   │     │   Table   │
     │           │     │           │
     └───────────┘     └───────────┘
     ↓ FULL JOIN 返回所有區域 ↓
     ████████████████████████████

FULL JOIN 返回左表的所有記錄 + 右表的所有記錄,並將匹配的記錄合併。

FULL JOIN 用法範例 (Example)

customers 資料表:

C_IdNameCity
1張一台北市
2王二新竹縣
3李三高雄縣

orders 資料表:

O_IdOrder_NoC_Id
125723
273753
375201
410541
512575

注意:訂單 O_Id = 5C_Id = 5customers 表中不存在;而客戶 C_Id = 2 (王二) 沒有任何訂單。

範例: 使用 FULL JOIN 查詢所有客戶與所有訂單的完整資訊。

SELECT customers.Name, orders.Order_No
FROM customers
FULL JOIN orders
ON customers.C_Id = orders.C_Id;

結果:

NameOrder_No
李三2572
李三7375
張一7520
張一1054
NULL1257
王二NULL

結果說明:

  • 李三張一 有匹配的訂單,正常顯示。
  • 訂單 1257 的客戶 ID 為 5,在 customers 表中找不到對應客戶,因此 Name 顯示 NULL
  • 王二 沒有任何訂單,因此 Order_No 顯示 NULL

FULL JOIN vs 其他 JOIN 類型

JOIN 類型返回結果
INNER JOIN僅返回兩表都有匹配的記錄
LEFT JOIN返回左表所有記錄 + 右表匹配的記錄
RIGHT JOIN返回右表所有記錄 + 左表匹配的記錄
FULL JOIN返回兩表的所有記錄

MySQL 中模擬 FULL JOIN

⚠️ 注意: MySQL 資料庫不支援 FULL JOIN 語法。但可以使用 UNION 來模擬相同的效果。

-- 在 MySQL 中模擬 FULL JOIN
SELECT customers.Name, orders.Order_No
FROM customers
LEFT JOIN orders ON customers.C_Id = orders.C_Id

UNION

SELECT customers.Name, orders.Order_No
FROM customers
RIGHT JOIN orders ON customers.C_Id = orders.C_Id;

這個查詢將 LEFT JOIN 和 RIGHT JOIN 的結果合併,並自動去除重複的記錄,達到與 FULL JOIN 相同的效果。

常見使用情境

  1. 資料完整性檢查:找出兩個表之間不匹配的記錄。
  2. 報表生成:需要顯示所有客戶和所有訂單的完整清單。
  3. 資料比對:比較兩個資料集的差異。

範例: 找出沒有訂單的客戶和沒有對應客戶的訂單。

SELECT customers.Name, orders.Order_No
FROM customers
FULL JOIN orders ON customers.C_Id = orders.C_Id
WHERE customers.C_Id IS NULL OR orders.C_Id IS NULL;

這個查詢會返回所有「孤立」的記錄,幫助識別資料中的不一致性。