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

SQL Server JOIN 類型完整對比:Inner/Full/Outer/Cross/Left/Right 實測

     編輯:關於SqlServer

五種 JOIN 語義速查

類型語義結果集
INNER JOIN雙邊皆有匹配交集
FULL OUTER JOIN雙邊全保留,匹配則合併,否則 NULL並集
CROSS JOIN笛卡爾積,無連接條件A × B 所有組合
LEFT JOIN左表全保留,右表匹配則合併,否則 NULL左表為主
RIGHT JOIN右表全保留,左表匹配則合併,否則 NULL右表為主

測試資料建立

CREATE TABLE Consumers (ConsumerId INT NOT NULL, ConsumerName VARCHAR(10) NOT NULL);
CREATE TABLE Orders (ConsumerId INT NOT NULL, OrderId VARCHAR(10) NOT NULL);

INSERT Consumers VALUES (1, 'AA'), (2, 'BB'), (3, 'CC');
INSERT Orders VALUES (2, 'O100001'), (3, 'O100002'), (3, 'O100003'), (4, 'O100004');

實測結果

INNER JOIN:僅 ConsumerId 2、3 有匹配

SELECT * FROM Orders O INNER JOIN Consumers C ON O.ConsumerId = C.ConsumerId;
-- 結果:3 筆(O100001-BB, O100002-CC, O100003-CC)

FULL OUTER JOIN:雙邊全保留

SELECT * FROM Orders O FULL OUTER JOIN Consumers C ON O.ConsumerId = C.ConsumerId;
-- 結果:5 筆(含 Consumer 1 無訂單、Order 4 無消費者)

CROSS JOIN:4 × 3 = 12 筆組合

SELECT * FROM Orders O CROSS JOIN Consumers C;
-- 無連接條件,純排列組合

LEFT JOIN:以 Consumers 為主

SELECT * FROM Consumers C LEFT JOIN Orders O ON C.ConsumerId = O.ConsumerId;
-- 結果:Consumer 1、2、3 全保留,1 的 Order 欄位為 NULL

RIGHT JOIN:以 Orders 為主

SELECT * FROM Consumers C RIGHT JOIN Orders O ON C.ConsumerId = O.ConsumerId;
-- 結果:Order 1~4 全保留,Order 4 的 Consumer 欄位為 NULL

記憶口訣

  • Inner = 交集(都要有)
  • Left = 左表為主(左全保留)
  • Right = 右表為主(右全保留)
  • Full = 雙全保留(並集)
  • Cross = 笛卡爾積(全排列)

總結

掌握五種 JOIN 語義與結果集差異,是 SQL 多表查詢的基石。實務中 LEFT JOIN 最常用(主表帶明細),INNER JOIN 次之,FULL/RIGHT/CROSS 較少見。

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