on和where
所有的查詢都回產生一個中間臨時報表,查詢結果就是從返回臨時報表中得到。on和where后面所跟限制條件的區別,主要與限制條件起作用的時機有關,on根據限制條件對數據庫記錄進行過濾,然后生產臨時報表;而where是在臨時報表生產之后,根據限制條件從臨時報表中篩選結果。
總結:在左外連接中,on會返回左表中的所有記錄;而where中,此時相當於inner join,只會返回滿足條件的記錄。
速度:因為on限制條件發生時間較早,產生的臨時報表數據集要小,因此on的性能要優於where。
having和where
having和where的區別也是與限制條件起作用時機有關,having是在聚集函數計算結果出來之后篩選結果,查詢結果只返回符合條件的分組,having不能單獨出現,只能出現在group by子句中。而where是在計算之前篩選結果,如果聚集函數使用where,那么聚集函數只計算滿足where子句限制條件的數據。
總結:where即可以和select等其他子句搭配使用,也可以和group by子句搭配使用,where的優先級要高於having。
速度:因為where在聚集函數之前篩選數據,having在計算之后篩選分組,因此where的性能要優於having。