以前學習sqlserver join的時候以為連接都是笛卡爾積方式連接。后面看到經典的SQL Server join連接的算法。
感覺有疑問,故查閱資料並做測試整理下:
一、(多表)連接方式分類
T-SQL提供兩種連接方式:傳統方式和SQL連接方式
1.傳統方式:SELECT 列1,列2,列3.... FROM 表1,表2,表3... WHERE condition
這種方式會把表1,2,3做笛卡爾積(根據測試結果推測,不一定准確)
2.SQL連接方式:
1>.INNER JOIN,內聯,系統默認,相當於JOIN 。返回多表之間完全匹配的結果。
2>.LETF JOIN ,左聯,返回除了有完全匹配的結果還有左表所有行。
3>.RIGHT JOIN ,右聯,返回除了有完全匹配的結果還有右表所有行。
4>.Full JOIN ,完全外鏈接,返回除了有完全匹配的結果還有左右表所有行。
其中LETF JOIN、RIGHT JOIN和Full JOIN 均屬於外連接(OUTER JOIN)
5>.CROSS JOIN,交叉連接,又稱為自然連接,即生成一個笛卡爾積。(應該類似於傳統方式)
二、SQL Server JOIN 內部實現的三種算法:
1. Loop join(嵌套循環), 即首先遍歷 A,將A表中的每一條記錄與 B表進行連接比較,如果滿足A.di=B.id,則返回記錄;
2. Merge join(合並連接), 即首先對A,B表進行排序,然后同時遍歷A和B表,進行A.id=B.id的驗證,直到遍歷到A和B表結束;
3. Hash join(哈希連接), 即首先對A表所有記錄的id進行hash計算,最終形成一個hash表,然后join時,遍歷B表,對B表每條記錄的id進行hash運算,然后在A的Hash表中驗證是否一致,最后得出結果。
個人分析,SQL連接方式只是技術和SQL Server交互的連接方式。內部實現的三種算法是根據T-SQL分析並選擇具體的實現算法,僅個人理解。