SQL表與表連接關系


一、SQL連接方式

left join :左連接,返回左表中所有的記錄以及右表中連接字段相等的記錄。

right join :右連接,返回右表中所有的記錄以及左表中連接字段相等的記錄。

inner join: 內連接,又叫等值連接,只返回兩個表中連接字段相等的行。

full join:外連接,返回兩個表中的行:left join + right join。

cross join:結果是笛卡爾積,就是第一個表的行數乘以第二個表的行數。

二、關鍵字ON與WHERE執行順序(LEFT JOIN 與 INNER JOIN 區別)

如:Department表

Employee表

LEFT JOIN兩條SQL語句:

執行結果如下:

發現數據有很大差別 返回的結果集不一樣

INNER JOIN兩條SQL

 

相信大家已經清楚兩者的數據差異了吧,接下來和大家分析一下產生此問題的原因:

1、數據庫中表與表關聯都會組合成一張臨時表,並將臨時表的結果集返回給用戶(Worktable)。

2、LEFT JOIN 與 REGIN JOIN 下的On條件是在生成臨時表時使用的條件,無論條件是否為真都會篩選左(右)表中全部數據,然而FULL JOIN 具備LEFT JOIN 與 RIGHT JOIN的全部特性並集,INNER JOIN 沒有這個特性放在ON 后面與WHERE 一樣

eg:Left JOIN 下ShowPlan_text 文本, 去除了ON后面針對Department表過濾條件 返回Department 全部數據

 

3、ON是生成臨時表時使用的條件 ,WHERE 對中間表數據過濾(多表關聯時ON會在WHERE之前執行 生成中間表 在進行條件過濾

SQL執行執行計划如下:

4、 SQL Server有幾種方式查找數據記錄

[Table Scan] 表掃描(最慢),對表記錄逐行進行檢查

[Clustered Index Scan] 聚集索引掃描(較慢),按聚集索引對記錄逐行進行檢查

[Index Scan] 索引掃描(普通),根據索引濾出部分數據在進行逐行檢查

[Index Seek] 索引查找(較快),根據索引定位記錄所在位置再取出記錄

[Clustered Index Seek] 聚集索引查找(最快),直接根據聚集索引獲取記錄

5、沒有主鍵的表查詢就會進行表掃描

6、有主鍵的表查詢就會進行聚集索引掃描

7、創建非聚集索引的表查詢[索引掃描+書簽查找]

書簽查找:通過非聚集索引找到所求的行,但這個索引並不包含顯示的列,因此還要額外去基本表中找到這些列,所以要進行鍵查找,如果基本表在堆中則Key Lookup會變成RID查找,這兩個查找統稱為書簽查找。

即: CREATE INDEX XXXX ON TABLE(CREATEDATE)

8、創建非聚集索引包含其他顯示列[索引查找]

即: CREATE INDEX XXXX ON TABLE(CREATEDATE) INCLUDE (A,B,C)

9、創建非聚集索引包含其他顯示列 並把聚集索引列當作條件[聚集索引查找]

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM