關於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!

推薦閱讀: