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

SQL 多表聯結查詢完全指南:內聯結、外聯結、交叉聯結與多對多關聯實戰

     編輯:關於SqlServer

範例資料準備

建立兩張示範表 student、course(一對一關係),以及三表 student/course/student_course(多對多關係)。圖片展示樣本資料:

student 表範例資料

course 表範例資料

一、外聯結

1. 左聯結 (LEFT JOIN / LEFT OUTER JOIN)

SELECT * FROM student LEFT JOIN course ON student.ID = course.ID;

左聯結結果

  • 保留左表 (student) 所有列;右表無對應時以 NULL 填充。
  • 結果筆數 ≥ 左表筆數(一對多時可能更多)。

2. 右聯結 (RIGHT JOIN / RIGHT OUTER JOIN)

SELECT * FROM student RIGHT JOIN course ON student.ID = course.ID;

右聯結結果

  • 保留右表 (course) 所有列;左表無對應時以 NULL 填充。

3. 完全外聯結 (FULL JOIN / FULL OUTER JOIN)

SELECT * FROM student FULL JOIN course ON student.ID = course.ID;

完全外聯結結果

  • 兩表所有列皆保留;任一邊無對應皆以 NULL 填充。
  • 相當於 LEFT JOIN UNION RIGHT JOIN。

二、內聯結 (INNER JOIN / JOIN)

SELECT * FROM student INNER JOIN course ON student.ID = course.ID;

內聯結結果

  • 僅回傳雙方皆符合條件的列。
  • 等同於舊式語法:SELECT * FROM student, course WHERE student.ID = course.ID。

三、交叉聯結 (CROSS JOIN)

SELECT * FROM student CROSS JOIN course;

交叉聯結結果

  • 產生笛卡兒積:左表行數 × 右表行數。
  • 若加上 WHERE student.ID = course.ID,結果等同 INNER JOIN。
  • 實務常用於生成測試資料、報表矩陣座標。

四、一對多 / 多對一 / 多對多關聯查詢

1. 一對多(學生-選課)

調整結構:student(Sno, Name, Cno)、course(Cno, CName)。聯結語法不變,結果呈現一生多課。

2. 多對多(學生-課程-中間表)

student 表

course 表

student_course 中間表

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;

多對多查詢結果

  • 中間表 student_course 至少包含兩張主表的主鍵(Sno, Cno),可擴充屬性如 Score、Semester。
  • 雙向 LEFT JOIN 確保即使學生未選課/課程無學生也能列出(若需僅列有配對改用 INNER JOIN)。

效能與最佳實務提示

場景建議聯結類型索引策略
主表查明細(一對多)LEFT JOIN明細表外鍵欄位建非叢集索引
多對多關聯查詢INNER JOIN(中間表)中間表雙欄位建複合叢集索引 (FK1, FK2)
需保留無配對主記錄LEFT/RIGHT JOIN被保留側主鍵已為叢集索引
報表矩陣/全排列CROSS JOIN小資料集(<1 萬列)可接受

掌握各類聯結語意與適用場景,配合正確索引設計,即能撰寫高效、正確的多表查詢 SQL。

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