關於Mysql中ON與Where區別問題詳解
今天工作的時候編寫瞭一個SQL,大傢一起來看一下
SELECT * FROM user user LEFT JOIN user_message msg ON user.id = msg.user_id AND user.name = '張三'
我們有一張user表
我們還有一張user_message表
我們執行上面的SQL後,查詢結果如下
並不如我們所想的,隻出現張三的結果,這是為什麼呢?
經過我的整理發現查詢是如下原因
關聯的時候ON條件是在合並兩張表形成臨時表前進行的條件篩選,所以在使用 JOIN 關鍵字進行關聯的時候,尤其是左關聯或右關聯的時候,不要使用 字段 = '定值' 這種篩選方式
在內關聯(inner join)中,Mysql判斷 字段 = '定值' 如果為false,會被篩選掉,如果為true,則會正確顯示數據。
在左關聯(left join)中,Mysql判斷 字段 = '定值' 如果為false,會返回左表的數據,如果為true,則會正確顯示顯示數據。
在右關聯(right join)中,Mysql判斷 字段 = '定值' 如果為false,會返回右表的數據,如果為true,則會正確顯示顯示數據。
所以我上述的SQL會返回張三的全部數據,除張三外的所有數據隻會返回左表數據,右表全部為null,無論是否可以匹配到。
where是在臨時表創建成功後,再次對臨時表進行篩選的,所以此時我們可以對關聯後的數據隨意進行篩選。
區別總結:
先執行on,後執行where;on是建立關聯關系,where是對關聯關系的篩選。
比如兩個表進行left join連接查詢結果,where會對查詢的結果進行過濾, on會返回驅動表的所有數據。
left join按照條件關聯,不管是否為真,都返回左邊表的數據。
總結
到此這篇關於關於Mysql中ON與Where區別問題的文章就介紹到這瞭,更多相關Mysql ON與Where區別內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- MySQL優化之如何寫出高質量sql語句
- MySQL 那些常見的錯誤設計規范,你都知道嗎
- 詳解Mysql兩表 join 查詢方式
- MySQL數據庫連接查詢 join原理
- 一文教你MySQL如何優化無索引的join