-- 寫法 1: 基表連接 (SQL-89 標準, 逗號分隔 + WHERE 條件)
SELECT A.id, B.name
FROM tableA A, tableB B
WHERE A.id = B.Aid;
-- 寫法 2: 內連接 (SQL-92 標準, 顯式 JOIN ... ON)
SELECT A.id, B.name
FROM tableA A
INNER JOIN tableB B ON A.id = B.Aid;
對於內連接,兩者語義完全等價,查詢優化器生成的執行計劃通常相同。結果均為「兩表在連接條件上匹配的行的笛卡爾積子集」。
**基表連接語法不支持標準外連接 (LEFT/RIGHT/FULL JOIN)**。
| 優勢 | 說明 |
|---|---|
| 可讀性 | 連接條件 (`ON`) 與篩選條件 (`WHERE`) 分離,邏輯清晰 |
| 可維護性 | 修改連接類型 (INNER→LEFT) 僅改關鍵字,無需重構 WHERE |
| 避免笛卡爾積 | 忘寫 `ON` 會語法錯誤;舊語法忘寫 `WHERE` 產生笛卡爾積卻不報錯 |
| 外連接支持 | 原生支持 LEFT/RIGHT/FULL,語法統一 |
| 標準化 | ANSI SQL-92 標準,跨數據庫移植性最好 |
| 優化器提示 | 部分數據庫可在 JOIN 上加 Hint (如 `INNER LOOP JOIN`) |
-- 顯式 JOIN: 一目瞭然
SELECT o.OrderID, c.CustomerName, p.ProductName, s.ShipperName
FROM Orders o
INNER JOIN Customers c ON o.CustomerID = c.CustomerID
LEFT JOIN OrderDetails od ON o.OrderID = od.OrderID
LEFT JOIN Products p ON od.ProductID = p.ProductID
LEFT JOIN Shippers s ON o.ShipperID = s.ShipperID
WHERE o.OrderDate > '2023-01-01';
-- 舊語法: 連接條件與篩選條件混雜在 WHERE,極難維護
SELECT o.OrderID, c.CustomerName, p.ProductName, s.ShipperName
FROM Orders o, Customers c, OrderDetails od, Products p, Shippers s
WHERE o.CustomerID = c.CustomerID
AND o.OrderID = od.OrderID (+)
AND od.ProductID = p.ProductID (+)
AND o.ShipperID = s.ShipperID (+)
AND o.OrderDate > '2023-01-01';