MySql 連接查詢時,on 后面跟的是連接條件,再跟 and 關鍵就可以繼續加過濾條件,這樣看來是不是可以免用 where 增加過濾條件了呢?開始我也是這樣以為的(老師是這么教的,且使用 on 的情況下不能使用 where)
當時存疑但沒有深究,多次網上看帖寫的連接查詢用了 on,還用 where,所以了解了一下,現在做一個輸出:
首先,老師教錯了...(diss~)on 和 where 之間並沒有沖突,隨都用作設立條件,但有區別:
-
on 后跟連接條件,這是規范。其次,如果再加篩選條件只針對關聯表!沒錯,是關聯表的篩選條件
執行順序:從表按照條件篩選,然后再進行連接;即先篩選再連接
-
where 則針對連接后產生的臨時表進行篩選
執行順序:先連接再篩選
所以,on 后跟關聯表(從表)的過濾條件,where 后跟主表或臨時表的篩選條件(左連接為例,主表的數據都會查詢到,所以臨時表中必定包含主表所有的字段,需要給主表加什么篩選條件,直接給臨時表加效果相同)
注意:所有的連接條件都必須放在 on 后面,否則無論是 left 還是 right 連接都將不起作用(where 作用的是連接后的臨時表,與連接已經無關)
因為 on 會首先過濾掉不符合條件的行,然后再進行其他運算,按理說 on 更快,允許的條件下,用 on 進行最大限度的篩選,后面 where 就避免重復篩選重復的數據,從而提升效率。還有一個重要特征:on 后的篩選條件篩選掉不符要求的字段后,對於主表中 null 結果的記錄是沒辦法篩選掉的;而 where 則可以(關鍵就是 on 的篩選條件先篩選再連接,篩選時還不知道主表中的一些數據,自然沒辦法篩選)