left join on後面 加條件和where後面加條件的區別 inner join 與 left join 和right join之間的區別

上一篇對三個join的語句作了一個區別,若是連最基礎的都不清楚,那麼請先參考:inner join 與 left join 和right join之間的區別html

碰巧在項目中遇到了一個sql,是left join和where的條件限制的區別,想了好半天,這裏作一下筆記,萬一之後忘記了方便查看。sql

話很少說,直接上測試數據和sql,而後對個人理解進行分析下。post

student表和grade表測試

 

簡單提一個需求是:我須要統計全部有成績的學生信息。項目遇到那個問題比這個複雜,可是最終須要篩選的條件和這個大體相同,這裏就舉個栗子。url

這裏分析一下,既然是學生信息,那麼,確定就是以student爲主表,關聯的爲grade表,寫出下面條件。spa

SELECT
    stu.*
FROM
    student stu
 LEFT JOIN grade gra on stu.id = gra.c_stuId AND gra.c_fs IS NOT NULL

查詢結果以下:3d

仔細看看上面的sql,和需求,好像也沒有什麼錯誤呀,分數不爲空,個人確是加了限制條件了啊, LEFT JOIN grade gra on stu.id = gra.c_stuId AND gra.c_fs IS NOT NULLcode

 可是看看需求,是分數不爲空的學生,可是李四的成績的確是空的,結果仍是查出來了,咦,那麼就奇怪了,問題出在哪裏了呢。htm

這就回到以前咱們所說的,left join並不會影響主表,也就是說,不管LEFT JOIN  on後面什麼條件,主表學生成績都會被查出來,因此說,這裏的限制條件沒用。blog

這時候就須要where這個老大上場了。將上面查詢sql修改以下:

SELECT
    stu.*
FROM
    student stu
 LEFT JOIN grade gra on stu.id = gra.c_stuId
WHERE gra.c_fs is NOT null

查詢結果以下:

咦,是吧,達到了預期的目的,id爲3的學生分數是空的,那麼最後查詢出來的也沒有包含他。這就是where的厲害之處。

那麼,究竟是爲何呢,咱們說下,on只是對局部條件作限制,而where是對全局作限制,什麼是全局作限制呢,也就是至關於,對最後查詢出來的整個結果作限制。其實咱們能夠把

全部的字段都查出來,而後看一下,就一目瞭然了。

爲了方便我就直接截圖說明:

加上gra.*一看就知道,查詢出來的整個數據就是如上所示,而where的做用是什麼呢,是對全局進行限制,就至關於上面查詢出來的又是一個新的表,我來對這個作限制。

如圖所示:

where加上就至關於對這個結果集再次進行限制,把分數爲空的去掉了,最終結果以下:

 

可是由於咱們查詢的時候,如上圖所示紅色方框所顯示的,並無查詢出來,因此並不能一目瞭然的看到分數這個字段,所以會產生一開始所看到的那種狀況,另外也是由於之間沒接

觸過,之前覺得where條件只能針對主表字段去作一個篩選,並不能篩選從表的,如今通過上面一個小案例以後,算是有了一個大概的理解了,不知道有沒有對你產生幫助,歡迎下方

評論,一塊兒探討。!!

相關文章
相關標籤/搜索