天天看點

MySql 别犯糊塗了! LEFT JOIN 的 ON 後接上篩選條件,多個條件會出事!

很多時候我們在使用  LEFT JOIN   ...... ON .... 時, 除了連接配接兩個表的字段條件外,我們往往還需要一些等值或者範圍 等等類似的資料篩選條件。

那麼對于初學者,往往會犯一個錯誤,就是 想當然 地 認為, ON 後面的條件是逐一執行的,因為沒有了解清楚 ON 後面接條件的規則。

是個什麼樣的場景? 

看執行個體講解:

userinfo 表 :

(找兼職的人員名單資訊表)

MySql 别犯糊塗了! LEFT JOIN 的 ON 後接上篩選條件,多個條件會出事!

jobinfo表 :

(兼職工作資訊及職業要求表)

MySql 别犯糊塗了! LEFT JOIN 的 ON 後接上篩選條件,多個條件會出事!

業務需求:

根據職業要求 給 找兼職的人員 比對上 目前 可以做的兼職,輸出資料條。 

例如,李三是一個程式員,他迫于經濟壓力,不得不向社會低頭,想找一些自己能做的兼職。

使用 WHERE

如果我們不用  left join ...... on ... , 僅僅使用 where,那麼簡單寫下sql是:

SELECT * 
FROM userinfo AS u ,jobinfo AS j 
WHERE u.userProfession=j.professionRequire
AND j.professionRequire='程式員'      

查詢出來的結果如下:

MySql 别犯糊塗了! LEFT JOIN 的 ON 後接上篩選條件,多個條件會出事!

是我們需要的結果,可以看的,程式員李三能做的兼職有,送外賣或者當保安。 

使用 LEFT JOIN ...... ON  ......

初學者(罪過)寫的SQL :

想當然地把篩選條件 職業要求為 ‘ 程式員’  直接 拼接在 ON 後面

SELECT * 
FROM userinfo AS u 
LEFT JOIN   
jobinfo AS j 
ON u.userProfession=j.professionRequire
AND j.professionRequire='程式員'      

這樣地拼接篩選條件其實是達不到所想要的效果的,先來看看這樣的執行結果:

MySql 别犯糊塗了! LEFT JOIN 的 ON 後接上篩選條件,多個條件會出事!

可以看到查詢出來很多我們不想要的資料,為什麼會這樣?

原因:

因為如果直接把關聯表的篩選條件拼接在 ON 後, 執行的順序其實是:

先将 jobinfo 表 按照篩選條件  professionRequire='程式員'  執行後作為子查詢,再執行 LEFT JOIN ...... ON 。

也就是第一步變成了執行  SELECT *  FROM jobinfo AS j  WHERE  j.professionRequire='程式員'  

MySql 别犯糊塗了! LEFT JOIN 的 ON 後接上篩選條件,多個條件會出事!

然後再進行連接配接查詢,也就是 

整個sql語句其實變成了:

SELECT * 
FROM userinfo AS u 
LEFT JOIN   
(SELECT *  FROM jobinfo  WHERE jobinfo.professionRequire='程式員') AS j 
ON 
u.userProfession=j.professionRequire      

 這樣查詢出來,顯然不是我們想要的結果。

那麼我們在使用 LEFT JOIN ...... ON  ...... 拼接篩選條件時,我們應該怎麼做?

配合 WHERE

SELECT * 
FROM userinfo AS u 
LEFT JOIN   jobinfo AS j 
ON u.userProfession=j.professionRequire
WHERE j.professionRequire='程式員'      

結果:

MySql 别犯糊塗了! LEFT JOIN 的 ON 後接上篩選條件,多個條件會出事!

我們把篩選條件配合where去使用, 執行的邏輯就是:

這是一個使用 LEFT JOIN 的 ON  初學者很容易犯的錯誤,大家稍微注意點。