一、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、創建非聚集索引包含其他顯示列 並把聚集索引列當作條件[聚集索引查找]