首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL 表連接完全指南:內連接、交叉連接、外連接 (左/右/全) 語法、語義、執行計劃與性能最佳實踐

     編輯:關於SqlServer

三大連接類型語義核心

連接類型關鍵字結果集包含典型場景
內連接`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;  -- 笛卡爾積

性能優化核心原則

  1. 連接列建索引:FK 列、PK 列必須有索引
  2. 小表驅動大表:優化器通常自動選擇,但統計信息準確是前提
  3. 減少連接表數:單查詢 ≤ 5-6 表,超過考慮拆分/物化中間結果
  4. 避免外連接後再內連接同表:導致外連接語義失效 (隱式轉內連接)
  5. 使用表別名:可讀性、消除歧義、優化器提示

執行計劃運算子識別

運算子連接類型適用條件
Nested Loops小外部 + 大內部有索引外部行少 (<1000)、內部有索引
Hash Match大表連接、無索引/非等值大數據集、內存足夠
Merge Join兩輸入均有序已排序輸入、聚集索引掃描

進階模式

  • APPLY (CROSS/OUTER APPLY):行級表值函數調用、動態 Top-N
  • 半連接 (SEMI JOIN):`EXISTS` / `IN` 邏輯,只返回左表列
  • 反半連接 (ANTI SEMI JOIN):`NOT EXISTS` / `NOT IN`
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved