三大連接類型語義核心
| 連接類型 | 關鍵字 | 結果集包含 | 典型場景 |
| 內連接 | `INNER JOIN` / `JOIN` | **兩表均匹配**的行 | 主從表關聯、維度查詢 |
| 外連接 | `LEFT/RIGHT/FULL OUTER JOIN` | 匹配行 + **單側/雙側不匹配行** (另側 NULL) | 報表保留主表、差異對比 |
| 交叉連接 | `CROSS JOIN` | **笛卡爾積** (M × N 行) | 生成網格、測試數據構造 |
語法規範 (ANSI SQL-92 推薦)
-- 內連接
SELECT o.OrderID, c.CustomerName
FROM Orders o
INNER JOIN Customers c ON o.CustomerID = c.CustomerID;
-- 左外連接 (保留 Orders 所有行)
SELECT o.OrderID, c.CustomerName
FROM Orders o
LEFT OUTER JOIN Customers c ON o.CustomerID = c.CustomerID;
-- 多表連接
SELECT o.OrderID, c.CustomerName, p.ProductName
FROM Orders o
INNER JOIN Customers c ON o.CustomerID = c.CustomerID
INNER JOIN OrderDetails od ON o.OrderID = od.OrderID
INNER JOIN Products p ON od.ProductID = p.ProductID;
隱式 vs 顯式連接 (舊式寫法已棄用)
-- 隱式內連接 (WHERE 過濾) — 不推薦
SELECT * FROM Orders o, Customers c WHERE o.CustomerID = c.CustomerID;
-- 隱式交叉連接 (無 WHERE) — 極度危險
SELECT * FROM Orders, Customers; -- 笛卡爾積
性能優化核心原則
- 連接列建索引:FK 列、PK 列必須有索引
- 小表驅動大表:優化器通常自動選擇,但統計信息準確是前提
- 減少連接表數:單查詢 ≤ 5-6 表,超過考慮拆分/物化中間結果
- 避免外連接後再內連接同表:導致外連接語義失效 (隱式轉內連接)
- 使用表別名:可讀性、消除歧義、優化器提示
執行計劃運算子識別
| 運算子 | 連接類型 | 適用條件 |
| Nested Loops | 小外部 + 大內部有索引 | 外部行少 (<1000)、內部有索引 |
| Hash Match | 大表連接、無索引/非等值 | 大數據集、內存足夠 |
| Merge Join | 兩輸入均有序 | 已排序輸入、聚集索引掃描 |
進階模式
- APPLY (CROSS/OUTER APPLY):行級表值函數調用、動態 Top-N
- 半連接 (SEMI JOIN):`EXISTS` / `IN` 邏輯,只返回左表列
- 反半連接 (ANTI SEMI JOIN):`NOT EXISTS` / `NOT IN`