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

SQL Server Inner Join 與 Outer Join 深度解析

     編輯:關於SqlServer

在正規化資料庫中,跨表查詢是常態。Join 操作決定了如何組合多張表的資料,理解 Inner Join(內連接)與 Outer Join(外連接)的語義差異,是撰寫正確且高效查詢的關鍵。

核心概念對比

特性Inner JoinLeft/Right Outer Join
語義排他性 - 僅回傳符合條件的配對列包容性 - 保留主表所有列,次表無配對則填 NULL
結果筆數≤ 兩表較小筆數≥ 主表筆數
典型用途主外鍵關聯、維度查詢報表顯示所有主記錄、找出孤兒資料

Northwind 範例資料庫實戰

場景:產品清單需顯示供應商名稱

-- 僅顯示有供應商的產品
SELECT ProductId, ProductName, Suppliers.SupplierId, CompanyName
FROM Products
INNER JOIN Suppliers ON Products.SupplierId = Suppliers.SupplierId

若 Products 中有 SupplierId = 50 但 Suppliers 無此記錄,該產品不會出現。

Left Outer Join:保留所有產品

-- 顯示所有產品,無供應商者 CompanyName 為 NULL
SELECT ProductId, ProductName, Suppliers.SupplierId, CompanyName
FROM Products
LEFT OUTER JOIN Suppliers ON Products.SupplierId = Suppliers.SupplierId

Right Outer Join:保留所有供應商

-- 顯示所有供應商,無產品者 ProductName 為 NULL
SELECT ProductId, ProductName, Suppliers.SupplierId, CompanyName
FROM Products
RIGHT OUTER JOIN Suppliers ON Products.SupplierId = Suppliers.SupplierId

實作步驟:建立測試資料

-- 1. 移除外鍵約束(僅為示範)
EXEC sp_helpconstraint Products
ALTER TABLE Products DROP CONSTRAINT FK_Products_Suppliers

-- 2. 插入無對應供應商的產品
INSERT INTO Products (ProductName, SupplierId, CategoryId)
VALUES ('Test Product', 50, 1)

-- 3. 執行 Left Join 驗證
SELECT ProductId, ProductName, Suppliers.SupplierId, CompanyName
FROM Products
LEFT OUTER JOIN Suppliers ON Products.SupplierId = Suppliers.SupplierId
WHERE Products.ProductName = 'Test Product'

進階 Join 模式

Full Outer Join

保留兩張表所有列,無配對處填 NULL。SQL Server 7.0+ 支援。

SELECT * FROM TableA
FULL OUTER JOIN TableB ON TableA.Id = TableB.Id

Cross Join(笛卡兒積)

無 ON 條件,產生兩表列數乘積。慎用!

SELECT * FROM Colors CROSS JOIN Sizes

Self Join(自我連接)

同一張表扮演不同角色,如員工-主管關係。

SELECT E.Name AS Employee, M.Name AS Manager
FROM Employees E
LEFT JOIN Employees M ON E.ReportsTo = M.EmployeeId

效能與最佳實務

  1. 索引策略:Join 條件欄位(外鍵)必須建立索引
  2. 篩選下推:優先在 Join 前用 WHERE 縮小結果集
  3. 避免隱性轉換:確保 Join 欄位資料型別一致
  4. 統計資料更新:定期 UPDATE STATISTICS 讓優化器選擇最佳 Join 順序
  5. Outer Join 條件放置:次表的篩選條件放在 ON 子句,而非 WHERE,否則退化為 Inner Join

口訣:Inner 找共同,Left 保左邊,Right 保右邊,Full 都要。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved