萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

SQL Server 2012 多表連接查詢完整實例:INNER/OUTER/CROSS/UNION/EXCEPT/INTERSECT

連接類型總覽

類型關鍵字結果集特徵
交叉連接CROSS JOIN笛卡爾積 (M×N),無 ON 條件
內連接[INNER] JOIN僅返回符合 ON 條件的匹配行
左外連接LEFT [OUTER] JOIN保留左表所有行,右表無匹配則 NULL
右外連接RIGHT [OUTER] JOIN保留右表所有行,左表無匹配則 NULL
全外連接FULL OUTER JOIN保留兩表所有行,無匹配處填 NULL
自連接JOIN 同表別名表關聯自身(如員工-主管、分類層級)

實戰範例(Student 學生表、ClassInfo 班級表)

1. 交叉連接

-- 寫法 1
SELECT * FROM Student CROSS JOIN dbo.ClassInfo;

-- 寫法 2 (舊語法)
SELECT * FROM Student, ClassInfo;

2. 內連接

-- 基本內連接
SELECT * 
FROM Student
JOIN dbo.ClassInfo ON dbo.Student.Class = dbo.ClassInfo.ID;

-- 多條件:ON 條件 + 額外篩選
SELECT * 
FROM Student
INNER JOIN dbo.ClassInfo ON dbo.Student.Class = dbo.ClassInfo.ID
AND dbo.Student.Class IN (1,2); -- 僅查班級 1、2

-- 不等值連接(罕用)
SELECT * 
FROM Student
INNER JOIN dbo.ClassInfo ON dbo.Student.Class <> dbo.ClassInfo.ID;

3. 自連接:查詢班級所屬系別

SELECT T1.*, T2.ClassName AS DeptName
FROM dbo.ClassInfo AS T1
INNER JOIN dbo.ClassInfo AS T2 ON T1.PID = T2.ID;

4. 外連接對比

-- Left Join:所有學生,無班級則 ClassInfo 欄位為 NULL
SELECT * FROM Student LEFT JOIN dbo.ClassInfo ON Student.Class = ClassInfo.ID;

-- Right Join:所有班級,無學生則 Student 欄位為 NULL
SELECT * FROM Student RIGHT JOIN dbo.ClassInfo ON Student.Class = ClassInfo.ID;

-- Full Outer Join:學生+班級全保留
SELECT * FROM Student FULL OUTER JOIN dbo.ClassInfo ON Student.Class = ClassInfo.ID;

5. 集合運算

-- UNION:縱向合併,去重
SELECT StuID, StuName FROM Student WHERE StuID <= 2
UNION
SELECT StuID, StuName FROM Student WHERE StuID > 2;

-- UNION ALL:合併不去重(效能較好)
SELECT StuSex FROM Student WHERE StuID <= 2
UNION ALL
SELECT StuSex FROM Student WHERE StuID > 2;

-- EXCEPT:差集(第一個結果集減去第二個)
SELECT * FROM Student
EXCEPT
SELECT * FROM Student WHERE StuID <= 2;

-- INTERSECT:交集
SELECT * FROM Student WHERE StuID >= 2
INTERSECT
SELECT * FROM Student WHERE StuID <= 3;

關鍵差異總結

  • 內連接 vs 外連接:內連接過濾不匹配行;外連接以保留表為主,不匹配處顯示 NULL
  • UNION vs UNION ALL:UNION 執行去重排序,UNION ALL 直接合併,效能優於 UNION
  • ON vs WHERE:外連接中 ON 條件決定如何匹配,WHERE 條件在連接後過濾,影響保留行

效能建議

  • 優先使用內連接,必要時才用外連接
  • 連接欄位建立索引(特別是外鍵)
  • 大表連接考慮分頁、限制欄位、避免 SELECT *
  • EXCEPT/INTERSECT 需兩結果集欄位數、型態完全一致
copyright © 萬盛學電腦網 all rights reserved