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

SQL Server 聯結查詢完全指南:內聯結、外聯結、交叉聯結圖解與實戰

     編輯:關於SqlServer

什麼是聯結查詢?

聯結查詢是關聯式資料庫的核心特徵,根據兩個或多個表的欄位關係,從這些表中查詢資料,實現多表查詢操作。掌握各類聯結的語意差異與適用場景,是寫出正確且高效 SQL 的基礎。

標準語法格式(SQL-92)

FROM join_table join_type join_table [ON (join_condition)]
  • join_table:參與聯結的表名,可為同一表(自聯結)
  • join_type:聯結類型
  • join_condition:聯結條件

三大聯結類型詳細解析

一、內聯結:僅返回符合條件的匹配行

使用比較運算子(=、>、<、<> 等)進行表間比較。

1. 等值聯結

使用 = 運算子,結果包含所有欄位(含重複欄位)。

-- 舊語法
SELECT * FROM T_student s, T_class c WHERE s.classId = c.classId

-- 標準語法
SELECT * FROM T_student s INNER JOIN T_class c ON s.classId = c.classId

2. 不等聯結

使用 >、<、<> 等非等值運算子。

SELECT * FROM T_student s INNER JOIN T_class c ON s.classId <> c.classId

3. 自然聯結

聯結條件同等值聯結,但移除重複欄位(如只保留一個 classId)。

SELECT s.*, c.className FROM T_student s INNER JOIN T_class c ON s.classId = c.classId

二、外聯結:保留單邊所有行

1. 左聯結

返回左表所有行,右表無匹配則顯示 NULL。

SELECT * FROM T_student s LEFT JOIN T_class c ON s.classId = c.classId

口訣:左表全保留,右表看匹配。

2. 右聯結

返回右表所有行,左表無匹配則顯示 NULL。

SELECT * FROM T_student s RIGHT JOIN T_class c ON s.classId = c.classId

3. 全聯結

返回兩表所有行,無匹配處填 NULL。

SELECT * FROM T_student s FULL JOIN T_class c ON s.classId = c.classId

三、交叉聯結:笛卡爾積

無 WHERE 條件時,返回兩表行數乘積(4×4=16 行)。有 WHERE 時等同內聯結。

-- 笛卡爾積
SELECT * FROM T_student s CROSS JOIN T_class c

-- 加 WHERE 等同等值聯結
SELECT * FROM T_student s CROSS JOIN T_class c WHERE s.classId = c.classId

注意:CROSS JOIN 後只能用 WHERE,不能用 ON。

實戰練習腳本


-- 內聯結系列
SELECT * FROM Territories t INNER JOIN Region r ON t.RegionID = r.RegionID;
SELECT * FROM Territories t INNER JOIN Region r ON r.RegionID <> t.RegionID; -- 不等值
SELECT t.*, r.RegionDescription FROM Territories t INNER JOIN Region r ON r.RegionID = t.RegionID; -- 自然聯結

-- 外聯結系列
SELECT * FROM Region LEFT JOIN Territories ON Territories.TerritoryDescription = Region.RegionDescription;
SELECT * FROM Region RIGHT JOIN Territories ON Territories.TerritoryDescription = Region.RegionDescription;
SELECT * FROM Region FULL JOIN Territories ON Territories.TerritoryDescription = Region.RegionDescription;

-- 交叉聯結
SELECT * FROM Region CROSS JOIN Territories;

總結對照表

聯結類型結果集特徵典型應用場景
INNER JOIN雙邊都有匹配的行主從表關聯、維度表查詢
LEFT JOIN左表全保留 + 右表匹配主表帶明細、報表列表
RIGHT JOIN右表全保留 + 左表匹配較少用,可改寫為 LEFT JOIN
FULL JOIN雙表全保留資料對帳、差異比對
CROSS JOIN笛卡爾積生成測試資料、組合分析

最佳實踐建議

  1. 優先使用 ANSI SQL-92 標準語法(INNER JOIN ... ON),可讀性與可維護性更佳
  2. 聯結條件欄位務必建立索引,特別是大表聯結
  3. 避免不必要的 FULL JOIN 與 CROSS JOIN,結果集易失控
  4. 多表聯結時,小表驅動大表,利用統計資訊引導優化器
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved