MySql 别犯糊涂了! LEFT JOIN 的 ON 后接上筛选条件,多个条件会出事!
很多時候我們在使用??LEFT JOIN? ?...... ON .... 時, 除了連接兩個表的字段條件外,我們往往還需要一些等值或者范圍 等等類似的數據篩選條件。
那么對于初學者,往往會犯一個錯誤,就是 想當然 地 認為,?ON 后面的條件是逐一執行的,因為沒有了解清楚 ON 后面接條件的規則。
是個什么樣的場景??
看實例講解:
userinfo 表 :
(找兼職的人員名單信息表)
jobinfo表 :
(兼職工作信息及職業要求表)
業務需求:
根據職業要求 給 找兼職的人員 匹配上 目前 可以做的兼職,輸出數據條。?
例如,李三是一個程序員,他迫于經濟壓力,不得不向社會低頭,想找一些自己能做的兼職。
使用 WHERE
如果我們不用? left join ......?on ... , 僅僅使用 where,那么簡單寫下sql是:
SELECT * FROM userinfo AS u ,jobinfo AS j WHERE u.userProfession=j.professionRequire AND j.professionRequire='程序員'查詢出來的結果如下:
是我們需要的結果,可以看的,程序員李三能做的兼職有,送外賣或者當保安。?
使用?LEFT JOIN?...... ON??......
初學者(罪過)寫的SQL :
想當然地把篩選條件 職業要求為 ‘ 程序員’? 直接?拼接在 ON 后面
SELECT * FROM userinfo AS u LEFT JOIN jobinfo AS j ON u.userProfession=j.professionRequire AND j.professionRequire='程序員'這樣地拼接篩選條件其實是達不到所想要的效果的,先來看看這樣的執行結果:
可以看到查詢出來很多我們不想要的數據,為什么會這樣?
原因:
因為如果直接把關聯表的篩選條件拼接在 ON 后, 執行的順序其實是:
先將?jobinfo 表 按照篩選條件??professionRequire='程序員'? 執行后作為子查詢,再執行?LEFT JOIN?...... ON?。
也就是第一步變成了執行??SELECT * ?FROM jobinfo AS j? WHERE? j.professionRequire='程序員'??
然后再進行連接查詢,也就是?
整個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='程序員'結果:
我們把篩選條件配合where去使用, 執行的邏輯就是:
先執行LEFT JOIN?...... ON??...... ?先將關聯兩個表之后的數據查詢出來;
再按照?professionRequire='程序員'? ?條件,進行數據篩選。
所以這是我們想要得到的結果。
這是一個使用?LEFT JOIN 的 ON? 初學者很容易犯的錯誤,大家稍微注意點。
總結
以上是生活随笔為你收集整理的MySql 别犯糊涂了! LEFT JOIN 的 ON 后接上筛选条件,多个条件会出事!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .net C# 网页播放器 支持多种格式
- 下一篇: 《凡人修仙传》8.25正式上线链游玩家