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 JOINNATURAL LEFT JOIN: 自然左外連接NATURAL RIGHT JOIN: 自然右外連接
NATURAL JOIN 用法範例 (Example)
customers 資料表:
| C_Id | Name | City |
|---|---|---|
| 1 | 張一 | 台北市 |
| 2 | 王二 | 新竹縣 |
| 3 | 李三 | 高雄縣 |
orders 資料表:
| O_Id | Order_No | C_Id |
|---|---|---|
| 1 | 2572 | 3 |
| 2 | 7375 | 3 |
| 3 | 7520 | 1 |
| 4 | 1054 | 1 |
| 5 | 1257 | 5 |
兩個資料表中都有 C_Id 欄位。
範例: 使用 NATURAL JOIN 查詢客戶與其訂單。
SELECT customers.Name, orders.Order_No
FROM customers
NATURAL JOIN orders;
結果:
| Name | Order_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 時,資料庫會:
- 找出兩個資料表中所有名稱相同的欄位。
- 使用這些同名欄位作為連接條件 (相當於
ON table1.col = table2.col)。 - 在結果中,同名欄位只會出現一次 (不會重複)。
範例: 如果兩個表有多個同名欄位。
-- 假設 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 條件