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

SQL Server 連接查詢完全指南:內連接、外連接、交叉連接實戰範例

     編輯:關於SqlServer

前言:多表查詢的核心——JOIN 機制

實務開發中,單表無法滿足業務需求,必須透過關聯鍵(PK/FK)將多表組合。SQL Server 提供豐富的 JOIN 語法,本文以「學生借書」經典範例,詳細解析各類連接的語法、語意與結果差異。

範例資料準備

Student 表(學生基本資料)

StudentIDStudentNameStudentAge
1張三25
2李四26
3王五27
4趙六28
5無名氏27

BorrowBook 表(借閱記錄)

BorrowBookIDBorrowBookNameStudentIDBorrowBookPublish
1馬克思主義政治經濟學1電子工業出版社
2毛澤東思想概論2高等教育出版社
3鄧小平理論3人民郵電出版社
4大學生思想道德修養4中國鐵道出版社
5C語言程序設計NULL高等教育出版社

關聯鍵:Student.StudentID = BorrowBook.StudentID

一、內連接 —— 僅保留雙邊匹配行

-- ANSI SQL-92 標準寫法(推薦)
SELECT s.StudentName, s.StudentAge, b.BorrowBookName, b.BorrowBookPublish
FROM Student s
INNER JOIN BorrowBook b ON s.StudentID = b.StudentID;

-- 舊式 WHERE 連接寫法(等價,不推薦新代碼使用)
SELECT s.StudentName, s.StudentAge, b.BorrowBookName, b.BorrowBookPublish
FROM Student s, BorrowBook b
WHERE s.StudentID = b.StudentID;

結果(4 筆)

StudentNameStudentAgeBorrowBookNameBorrowBookPublish
張三25馬克思主義政治經濟學電子工業出版社
李四26毛澤東思想概論高等教育出版社
王五27鄧小平理論人民郵電出版社
趙六28大學生思想道德修養中國鐵道出版社

特徵:StudentID=5(無名氏)無借書紀錄 → 排除;BorrowBookID=5(C語言)StudentID 為 NULL → 排除。內連接等同於集合論的交集。

內連接三細分

  • 等值連接:ON 子句使用 =,結果保留所有欄位(含重複鍵欄)。
  • 非等值連接:使用 >, >=, <, <=, <>, != 等比較運算子。
  • 自然連接:等值連接 + 選擇清單移除重複鍵欄(SQL Server 無 NATURAL JOIN 關鍵字,需手工列欄位)。

二、外連接 —— 保留單邊/雙邊所有行

1. 左外連接 (LEFT [OUTER] JOIN)

SELECT s.StudentName, s.StudentAge, b.BorrowBookName, b.BorrowBookPublish
FROM Student s
LEFT JOIN BorrowBook b ON s.StudentID = b.StudentID;

結果(5 筆)

StudentNameStudentAgeBorrowBookNameBorrowBookPublish
張三25馬克思主義政治經濟學電子工業出版社
李四26毛澤東思想概論高等教育出版社
王五27鄧小平理論人民郵電出版社
趙六28大學生思想道德修養中國鐵道出版社
無名氏27NULLNULL

語意:以左表為主,右表無匹配則以 NULL 填補。常用於「主表全保留、明細表可選」場景(如:所有學生及其借書情況,含未借書者)。

2. 右外連接 (RIGHT [OUTER] JOIN)

SELECT s.StudentName, s.StudentAge, b.BorrowBookName, b.BorrowBookPublish
FROM Student s
RIGHT JOIN BorrowBook b ON s.StudentID = b.StudentID;

結果(5 筆)

StudentNameStudentAgeBorrowBookNameBorrowBookPublish
張三25馬克思主義政治經濟學電子工業出版社
李四26毛澤東思想概論高等教育出版社
王五27鄧小平理論人民郵電出版社
趙六28大學生思想道德修養中國鐵道出版社
NULLNULLC語言程序設計高等教育出版社

語意:以右表為主,左表無匹配則 NULL。實務較少用,可改寫為 LEFT JOIN 交換表順序以利閱讀。

3. 完整外連接 (FULL [OUTER] JOIN)

SELECT s.StudentName, s.StudentAge, b.BorrowBookName, b.BorrowBookPublish
FROM Student s
FULL OUTER JOIN BorrowBook b ON s.StudentID = b.StudentID;

結果(6 筆)

StudentNameStudentAgeBorrowBookNameBorrowBookPublish
NULLNULLC語言程序設計高等教育出版社
張三25馬克思主義政治經濟學電子工業出版社
李四26毛澤東思想概論高等教育出版社
王五27鄧小平理論人民郵電出版社
趙六28大學生思想道德修養中國鐵道出版社
無名氏27NULLNULL

語意:左右表全保留,匹配則合併,否則 NULL。等同於 LEFT JOIN UNION RIGHT JOIN。適用於「雙邊資料完整性稽核」。

三、交叉連接 —— 笛卡兒積

SELECT s.StudentName, s.StudentAge, b.BorrowBookName, b.BorrowBookPublish
FROM Student s
CROSS JOIN BorrowBook b;
-- 等價於
SELECT s.StudentName, s.StudentAge, b.BorrowBookName, b.BorrowBookPublish
FROM Student s, BorrowBook b;  -- 無 WHERE 條件

結果(25 筆 = 5 × 5)

每位學生配對每本書,產生所有可能組合。極少直接用於業務查詢,常見於:

  • 測試資料生成(組合維度值)
  • 數學/統計計算需全排列時
  • 誤寫 WHERE 導致效能災難的反面教材

四、進階應用技巧

多表連接順序與優化

  • 優化器會自動重排 JOIN 順序,但統計資訊過期可能導致錯誤計畫。
  • 大表驅動小表:優先 JOIN 篩選度高的表,減少中間結果集。
  • 使用 OPTION (FORCE ORDER) 強制順序僅限除錯,生產環境慎用。

連接條件 vs 篩選條件

-- 正確:ON 只放關聯邏輯
SELECT * FROM Student s
LEFT JOIN BorrowBook b ON s.StudentID = b.StudentID
WHERE b.BorrowBookPublish = '高等教育出版社';  -- 篩選放 WHERE

-- 錯誤:篩選放 ON 會改變外連接語意(等同內連接)
SELECT * FROM Student s
LEFT JOIN BorrowBook b ON s.StudentID = b.StudentID 
                       AND b.BorrowBookPublish = '高等教育出版社';

總結對照表

連接類型關鍵字保留左表保留右表典型用途
內連接INNER JOIN / JOIN否否主從關聯、明細查詢
左外連接LEFT [OUTER] JOIN是否主表全保留、可選明細
右外連接RIGHT [OUTER] JOIN否是同左連接,表順序互換
完整外連接FULL [OUTER] JOIN是是雙邊完整性比對、資料稽核
交叉連接CROSS JOIN全排列全排列測試資料、維度組合、極少業務
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved