NATURAL JOIN 關鍵字 (SQL NATURAL JOIN) - 自然連接

NATURAL JOIN (自然連接) 會自動根據兩個資料表中名稱相同的欄位進行連接,不需要明確指定 ON 條件。資料庫會自動找出兩個表中所有同名的欄位,並使用這些欄位作為連接條件。

NATURAL JOIN 語法 (Syntax)

SELECT column_list
FROM table1
NATURAL JOIN table2;

NATURAL JOIN 可以與不同的 JOIN 類型結合使用:

  • NATURAL JOIN: 等同於 NATURAL INNER JOIN
  • NATURAL LEFT JOIN: 自然左外連接
  • NATURAL RIGHT JOIN: 自然右外連接

NATURAL JOIN 用法範例 (Example)

customers 資料表:

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

orders 資料表:

O_IdOrder_NoC_Id
125723
273753
375201
410541
512575

兩個資料表中都有 C_Id 欄位。

範例: 使用 NATURAL JOIN 查詢客戶與其訂單。

SELECT customers.Name, orders.Order_No
FROM customers
NATURAL JOIN orders;

結果:

NameOrder_No
李三2572
李三7375
張一7520
張一1054

這個結果與以下 INNER JOIN 查詢完全相同:

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

NATURAL JOIN 的運作方式

當執行 NATURAL JOIN 時,資料庫會:

  1. 找出兩個資料表中所有名稱相同的欄位。
  2. 使用這些同名欄位作為連接條件 (相當於 ON table1.col = table2.col)。
  3. 在結果中,同名欄位只會出現一次 (不會重複)。

範例: 如果兩個表有多個同名欄位。

-- 假設 table1 和 table2 都有 col_a 和 col_b 欄位
SELECT *
FROM table1
NATURAL JOIN table2;

-- 等同於
SELECT *
FROM table1
INNER JOIN table2
ON table1.col_a = table2.col_a AND table1.col_b = table2.col_b;

NATURAL LEFT JOIN 和 NATURAL RIGHT JOIN

你也可以將 NATURAL 與外部連接結合使用:

NATURAL LEFT JOIN:

SELECT customers.Name, orders.Order_No
FROM customers
NATURAL LEFT JOIN orders;

這會返回所有客戶,即使他們沒有訂單。

NATURAL RIGHT JOIN:

SELECT customers.Name, orders.Order_No
FROM customers
NATURAL RIGHT JOIN orders;

這會返回所有訂單,即使找不到對應的客戶。

NATURAL JOIN 的注意事項

⚠️ 使用 NATURAL JOIN 時要特別小心以下幾點:

1. 意外的欄位匹配

如果兩個表意外有同名但意義不同的欄位,NATURAL JOIN 會錯誤地使用這些欄位進行連接。

-- 假設 customers 表有 `Name` 欄位
-- 而 products 表也碰巧有 `Name` 欄位(產品名稱)
-- NATURAL JOIN 會嘗試用 Name 欄位連接,這通常不是你想要的結果

2. 資料表結構變更的風險

當資料表結構改變時 (例如新增同名欄位),NATURAL JOIN 的行為可能會意外改變,導致查詢結果不正確。

3. 可讀性和維護性

使用 NATURAL JOIN 時,連接條件是隱含的,其他開發者可能不清楚實際的連接邏輯。

最佳實踐建議

在大多數情況下,建議使用明確的 INNER JOIN 搭配 ON 條件,而非 NATURAL JOIN:

-- 推薦:明確指定連接條件
SELECT customers.Name, orders.Order_No
FROM customers
INNER JOIN orders ON customers.C_Id = orders.C_Id;

-- 不推薦:隱含的連接條件
SELECT customers.Name, orders.Order_No
FROM customers
NATURAL JOIN orders;

明確指定連接條件的好處:

  • 程式碼更易讀、易維護
  • 不會因資料表結構變更而產生意外行為
  • 連接邏輯清晰明確

資料庫支援

  • MySQL: 支援 NATURAL JOIN
  • PostgreSQL: 支援 NATURAL JOIN
  • Oracle: 支援 NATURAL JOIN
  • SQL Server: 不支援 NATURAL JOIN,需使用明確的 JOIN 條件