where子句和having子句區別
where子句和having子句的區別:
1.where 不能放在group by後面
2.having 是跟group by連在一起用的,放在group by 後面,此時的作用相當於where
3.where 後面的條件中不能有聚集函式,比如SUM(),AVG()等,而HAVING可以。
一、where子句
where子句:where子句僅僅用於從from子句中返回的值,from子句返回的每一行資料都會用where子句中的條件進行判斷篩選,where子句中允許使用比較運算子和邏輯運算子
二、having子句
having子句:having子句通常是與order by子句一起使用的,因為having的作用是對使用group by 進行分組統計後的結果進行進一步的篩選。
三、下面通過where子句和having子句的對比,更進一步的理解他們
在查詢過程中聚合函式(SUM,MIN,MAX,AVG,COUNT)要比having子句優先執行,簡單的理解為只有有了統計結果後我才能執行篩選。where子句在查詢過程中執行優先級別優先於聚合函式(SUM,MIN,MAX,AVG,COUNT),因為他是一句一句篩選的,HAVING子句可以讓我們篩選成組後的對各組資料篩選。而WHERE子句在聚合前篩選記錄,如:現在我們想要部門號不等於10的部門並且工資總和大於8000的部門編號?
分析:通過where子句篩選除部門編號不為10的部門,然後對部門工資進行統計,然後使用having子句對統計結果進行篩選。
select deptno,sum(sa1) from emp
where deptno!='10' group by deptno
having sum(sa1)>8000;
四、異同點
他們的相同之處就是定義搜尋條件,不同之處是where子句為單個篩選而having子句和組有關,而不是與單個的行有關
最後:理解having子句和where子句最好的方法就是基礎select 語句中的那些句子的處理次序:where子句只能接受from子句輸出的資料,而having子句則可以接受來自group by ,where或者from子句的輸入。
having子句會在分組後對分組形成的結果進行過濾。
這個過程需要聚合、排序、因此如果通過where子句限制記錄而省略掉having子句,是可以提升效能的。