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

SQL 多表連接查詢圖解大全:內連接、外連接、交叉連接、多對多中間表

     編輯:關於SqlServer

範例資料

student 表

IDName
1Alice
2Bob
3Cindy

course 表

IDCName
1Math
2English
4Physics

一、外連接

1. LEFT JOIN (左外連接)

SELECT * FROM student LEFT JOIN course ON student.ID = course.ID;
IDNameIDCName
1Alice1Math
2Bob2English
3CindyNULLNULL

特性:保留左表所有行,右表無匹配則 NULL。一對一時結果行數 = 左表行數。

2. RIGHT JOIN (右外連接)

SELECT * FROM student RIGHT JOIN course ON student.ID = course.ID;
IDNameIDCName
1Alice1Math
2Bob2English
NULLNULL4Physics

特性:保留右表所有行,左表無匹配則 NULL。

3. FULL JOIN (完全外連接)

SELECT * FROM student FULL JOIN course ON student.ID = course.ID;
IDNameIDCName
1Alice1Math
2Bob2English
3CindyNULLNULL
NULLNULL4Physics

特性:雙表所有行,無匹配側為 NULL。

二、內連接

SELECT * FROM student INNER JOIN course ON student.ID = course.ID;
-- 等價舊語法:SELECT * FROM student, course WHERE student.ID = course.ID;
IDNameIDCName
1Alice1Math
2Bob2English

特性:僅返回雙方均匹配的行。

三、交叉連接

SELECT * FROM student CROSS JOIN course;  -- 笛卡爾積 3×3=9 行
SELECT * FROM student CROSS JOIN course WHERE student.ID = course.ID;  -- 等同 INNER JOIN

特性:無 WHERE 時產生笛卡爾積;有條件時退化為內連接。

四、多對多關係:中間表模式

student (Sno, Name) —student_course (Sno, Cno) —course (Cno, CName)

SELECT s.Name, c.CName
FROM student_course sc
LEFT JOIN student s ON s.Sno = sc.Sno
LEFT JOIN course c ON c.Cno = sc.Cno;

結果:每行代表一個學生選課記錄,學生與課程可多對多。

關鍵總結表

連接類型關鍵字保留哪側典型用途
內連接INNER JOIN雙方匹配行主從關聯、明細查詢
左外連接LEFT JOIN左表全保留主表帶明細、報表列表
右外連接RIGHT JOIN右表全保留較少用,可改 LEFT 交換順序
完全外連接FULL JOIN雙表全保留資料對帳、差異比對
交叉連接CROSS JOIN笛卡爾積生成組合、測試資料
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved