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

JOIN 聯接大全:從第三正規化到內/外/交叉聯接完整語法與範例

     編輯:關於SqlServer

資料庫設計常遵循 3NF (第三正規化),消除傳遞相賴,但查詢時需跨表組合資料。JOIN 即是關聯多張邏輯相依表的核心工具。

3NF 快速回顧

學生資料表 S1(SNO, SNAME, DNO, DNAME, LOCATION) 存在傳遞相賴:SNO → DNO → DNAME/LOCATION。拆分為 S(SNO, SNAME, DNO) + D(DNO, DNAME, LOCATION),透過外鍵 DNO 關聯。

指定聯接位置:FROM vs WHERE

  • WHERE 子句:舊式語法,簡單聯接尚可,不推薦
  • FROM 子句:SQL-92 標準,聯接條件與篩選條件分離,可讀性/維護性優
-- FROM 子句標準寫法
SELECT A.SYMBOL, A.SNAME, B.TDATE, B.CLOSE
FROM SECURITYCODE A
JOIN DAYQUOTE B ON A.SYMBOL = B.SYMBOL
WHERE B.TDATE >= A.LISTDATE
  AND A.SYMBOL LIKE '600%'
ORDER BY A.SYMBOL, B.TDATE;

聯接類型完整對照

類型關鍵字結果集特徵典型用途
內聯接[INNER] JOIN僅返回雙方符合條件的列主流業務查詢
左外聯接LEFT [OUTER] JOIN左表所有列 + 右表匹配列 (無匹配則 NULL)主表帶明細、可選關聯
右外聯接RIGHT [OUTER] JOIN右表所有列 + 左表匹配列較少用,可改 LEFT 交換順序
完整外聯接FULL [OUTER] JOIN雙表所有列,無匹配處填 NULL雙向全量對比、差異分析
交叉聯接CROSS JOIN笛卡兒積:左表每列 × 右表每列生成測試資料、排列組合

關鍵差異口訣

  • 內聯接:有匹配才出現
  • 外聯接:至少保留一方所有列
  • LEFT/RIGHT 只看保留哪側;FULL = LEFT ∪ RIGHT (去重)
  • OUTER 關鍵字可省略

交叉聯接大小估算

無 WHERE 時:結果列數 = 左表列數 × 右表列數。例:3 列 × 6 列 = 18 列。

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