FROM a, b WHERE a.id = b.id(舊式,僅支持內連接)。FROM a INNER JOIN b ON a.id = b.id(標準,支持內/外/交叉連接,推薦)。兩者經優化器處理後執行計劃完全一致,差異在於可讀性、可維護性與外連接表達能力。
-- 等值連接(最常用)
SELECT a.*, b.OrderDate
FROM Customers a INNER JOIN Orders b ON a.CustomerID = b.CustomerID;
-- 自然連接:隱式去重公共列(SQL Server 不直接支持 NATURAL JOIN,需顯式列名)
SELECT a.CustomerID, a.CompanyName, b.OrderDate
FROM Customers a INNER JOIN Orders b ON a.CustomerID = b.CustomerID;
-- 不等連接:非 = 條件
SELECT e1.Name AS Emp1, e2.Name AS Emp2
FROM Employees e1 INNER JOIN Employees e2 ON e1.Salary > e2.Salary;
| 類型 | 語法 | 語義 | 典型場景 |
|---|---|---|---|
| 左外連接 | LEFT [OUTER] JOIN | 保留左表所有行,右表無匹配則 NULL | 主表查明細(客戶-訂單、部門-員工) |
| 右外連接 | RIGHT [OUTER] JOIN | 保留右表所有行,左表無匹配則 NULL | 少用,可改 LEFT 互換表順序 |
| 全外連接 | FULL [OUTER] JOIN | 保留兩表所有行,無匹配雙向 NULL | 雙向對賬、合併異構數據源 |
-- 左連接:所有客戶及其訂單(無訂單客戶也顯示)
SELECT c.CustomerID, c.CompanyName, o.OrderID, o.OrderDate
FROM Customers c LEFT JOIN Orders o ON c.CustomerID = o.CustomerID;
-- 全外連接:城市表與用戶表雙向對賬
SELECT c.CityName, u.UserName
FROM Cities c FULL OUTER JOIN Users u ON c.CityID = u.CityID;
-- 無 ON 條件,返回 M x N 行
SELECT t.Type, p.PubName
FROM Titles t CROSS JOIN Publishers p;
-- 6 類圖書 × 8 家出版社 = 48 行
⚠️ 極易產生海量結果集導致 OOM,僅用於受控小表組合(如生成日期維度、參數網格)。
-- 員工-經理關係
SELECT e.Name AS Employee, m.Name AS Manager
FROM Employees e LEFT JOIN Employees m ON e.ManagerID = m.EmployeeID;
UPDATE STATISTICS。VARCHAR vs NVARCHAR、INT vs BIGINT)導致掃描,統一類型或顯式 CAST。ON 決定如何匹配,WHERE 過濾最終結果。LEFT JOIN ... ON ... WHERE right.col = 'x' 會把外連接退化為內連接,條件應放在 ON 中。| ANSI-92 | Oracle (+) 兼容 | SQL Server 舊式 |
|---|---|---|
LEFT JOIN | WHERE a.id = b.id(+) | WHERE a.id *= b.id (已棄用) |
RIGHT JOIN | WHERE a.id(+) = b.id | WHERE a.id =* b.id (已棄用) |
現代開發統一使用 ANSI-92,跨平台遷移零改動。