您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關sql連接查詢語句中on、where篩選的區別是什么,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
來看一個示例,有兩張數據表,結構和數據如圖所示
表main
表ext
可以把這兩張表看作是用來存放用戶信息的, main放置主要信息,ext表放置附加信息,兩張表的關系是1對1的,以id字符作為對應關系鍵。現在我們需要將地址不為杭州的所有用戶信息篩選出來,結果中需要包含main表和ext表的所有字段數據。
select * from main left JOIN exton main.id = ext.id and address <> '杭州'
閉上眼睛, 請用大腦人肉運行一下這段SQL, 想象一下是什么結果。
當把address <> '杭州'
這個篩選條件放在on之后,查詢得到的結果似乎跟我們預料中的不同,從結果中能看出,這個篩選條件好像只過濾掉了ext表中對應的記錄,而main表中的記錄并沒有被過濾掉,也就是上圖中標記為紅色的那條記錄。outer join
相對于inner join
的一個主要特性就是以一側的表為基礎,但是在這里以左表為基這一點卻可以無視篩選條件,這未免也太霸道了一些。
把查詢語句稍微改動一下,將地址的篩選條件從on轉移至where
select * from main left JOIN ext on main.id = ext.id where address <> '杭州'
結果就如我們預期的那樣了
造成這種結果上的差異要從outer join
查詢的邏輯查詢的各個階段說起。
總的來說,outer join 的執行過程分為4步
1、先對兩個表執行交叉連接(笛卡爾積)
2、應用on篩選器
3、添加外部行
4、應用where篩選器
就拿上面不使用where篩選器的sql來說,執行的整個詳細過程如下
第一步,對兩個表執行交叉連接,結果如下,這一步會產生36條記錄(此圖顯示不全)
第二步,應用on篩選器。篩選器中有兩個條件,main.id = ext.id and address<> '杭州'
,符合要求的記錄如下
這似乎正是我們期望中查詢的結果,然而在接下來的步驟中這個結果會被打亂
第三步,添加外部行。outer join
有一個特點就是以一側的表為基,假如另一側的表沒有符合on篩選條件的記錄,則以null替代。在這次的查詢中,這一步的作用就是將那條原本應該被過濾掉的記錄給添加了回來
是不是不種畫蛇添足的感覺, 結果就成了這樣
第四步,應用where篩選器
在這條問題sql中,因為沒有where篩選器,所以上一步的結果就是最終的結果了。
而對于那條地址篩選在where條件中的sql,這一步便起到了作用,將所有地址不屬于杭州的記錄篩選了出來
通過上面的講解,已經能反應出在outer join
中的篩選條件在on中和where中的區別,開發人員如能詳細了解之中差別,能規避很多在編寫sql過程中出現的莫名其妙的錯誤。
關于“sql連接查詢語句中on、where篩選的區別是什么”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。