很多時候我們在使用 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去使用, 執行的邏輯就是: