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

SQL Server 交叉連接與內部連接詳解:笛卡兒積、非等值、安全性比較

     編輯:關於SqlServer

連接是多表查詢核心。本文深入講解 交叉連接 (CROSS JOIN) 與 內部連接 (INNER JOIN) 的運作機制、應用場景與寫法安全性。

一、交叉連接:笛卡兒積產生器

  • 邏輯:表 A (m 列) × 表 B (n 列) = m×n 列結果
  • 無 ON 條件,純排列組合
SELECT C.custid, E.empid
FROM Sales.Customers AS C CROSS JOIN HR.Employees AS E
ORDER BY E.empid

91 客戶 × 9 員工 = 819 列。

實戰用途:產生數字輔助表

  1. 建立基礎數字表 Digits(0-9)
  2. 6 次交叉連接產生 0~999,999:
INSERT INTO Nums(n)
SELECT D6.digit*100000 + D5.digit*10000 + D4.digit*1000 
     + D3.digit*100 + D2.digit*10 + D1.digit + 1
FROM Digits D1 CROSS JOIN Digits D2 CROSS JOIN Digits D3
     CROSS JOIN Digits D4 CROSS JOIN Digits D5 CROSS JOIN Digits D6
ORDER BY n

二、內部連接:等值與非等值

1. 等值連接

SELECT f.Col1 FROM FirstTable f INNER JOIN SecondTable s ON s.Col1 = f.Col1

2. 非等值連接

SELECT f.Col1 FROM FirstTable f INNER JOIN SecondTable s ON s.Col1 <> f.Col1

等價於 CROSS JOIN ... WHERE s.Col1 <> f.Col1。

3. 非 DISTINCT 行為:重複列會全部保留

表 A 有 1 列值 2,表 B 有 5 列值 2 → 內部連接產生 5 列結果,非僅 1 列。

三、連接寫法安全性:ANSI SQL-92 vs SQL-89

標準語法缺失 ON 時
SQL-92 (推薦)INNER JOIN ... ON ...語法錯誤,編譯失敗
SQL-89 (舊式)FROM A, B WHERE ...靜默產生交叉連接,結果錯誤難發現

結論:永遠使用 ANSI SQL-92 明確 ON 子句,避免遺漏條件導致資料爆炸。

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