select deptno,sum(sal) from emp group by deptno;
篩選結果如下:
DEPTNO SUM(SAL)
------ ----------
30 9400
20 10875
10 8750
可以看出我們想要的結果了。不過現在我們如果想要部門工資總和大於10000的呢?那么想到了對分組統計結果進行篩選的having來幫我們完成。
第二步:
select deptno,sum(sal) from emp group by deptno having sum(sal)>10000;
篩選結果如下:
DEPTNO SUM(SAL)
------ ----------
20 10875
當然這個結果正是我們想要的。
四、下面我們通過where子句和having子句的對比,更進一步的理解它們。
在查詢過程中聚合語句(sum,min,max,avg,count)要比having子句優先執行,簡單的理解為只有有了統計結果后我才能執行篩選。where子句在查詢過程中執行優先級別優先於聚合語句(sum,min,max,avg,count),因為它是一句一句篩選的。HAVING子句可以讓我們篩選成組后的對各組數據篩選。,而WHERE子句在聚合前先篩選記錄。如:現在我們想要部門號不等於10的部門並且工資總和大於8000的部門編號?
我們這樣分析:通過where子句篩選出部門編號不為10的部門,然后在對部門工資進行統計,然后再使用having子句對統計結果進行篩選。
select deptno,sum(sal) from emp
where deptno!='10' group by deptno
having sum(sal)>8000;
篩選結果如下:
DEPTNO SUM(SAL)
------ ----------
30 9400
20 10875
五、異同點
它們的相似之處就是定義搜索條件,不同之處是where子句為單個篩選而having子句與組有關,而不是與單個的行有關。
最后:理解having子句和where子句最好的方法就是基礎select語句中的那些句子的處理次序:where子句只能接收from子句輸出的數據,而having子句則可以接受來自group by,where或者from子句的輸入。
