分組統計查詢
統計函數(分組函數)
count函數的主要作用是統計一張資料表之中資料量的個數。與它功能類似的常用函數有五個:
- COUNT():計數,根據表中實際的資料量傳回結果;
- SUM():求和,針對數字的統計;
- AVG():平均值,針對數字的統計;
- MIN():最小值,支援各種資料類型;
- MAX():最大值,支援各種資料類型;
範例:
SELECT COUNT(*) 人數, AVG(sal) 員工平均工資, SUM(sal) 每月總支出, MAX(sal) 最高工資, MIN(sal) 最低工資
FROM EMP;
- 這些函數都支援嵌套。
- 當表中沒有資料時,隻有COUNT()函數會傳回值(0),而其他四個都傳回NULL。
COUNT()的三種使用方式
- COUNT(*):傳回表中的全部記錄數;
- COUNT(字段):傳回表中指定字段的記錄數;
- COUNT(DISTINCT 字段):傳回消除重複資料之後的字段記錄數。
分組統計(GROUP BY)
根據部門編号分組,查詢出每個部門的編号、人數、平均工資,并按平均工資排序。
SELECT DEPTNO, COUNT(*), AVG(SAL)
FROM EMP
GROUP BY DEPTNO
ORDER BY AVG(SAL) DESC;
ORDER BY放置在GROUP BY子句後。
使用注意
- 如果查詢不使用GROUP BY子句,那麼SELECT子句中隻允許出現統計函數;
- 如果查詢中使用了GROUP BY子句,那麼SELECT子句中隻允許出現分組字段、統計函數;
- 統計函數允許嵌套,但是嵌套之後的SELECT子句裡隻允許出現嵌套函數,不允許出現任何字段。
多表查詢與分組統計
單子段分組
查詢每個部門的名稱、部門人數、平均工資:
SELECT D.DNAME, COUNT(E.EMPNO), AVG(E.SAL)
FROM EMP E, DEPT D
WHERE E.DEPTNO(+) = D.DEPTNO
GROUP BY D.DNAME;
多字段分組
查詢出每個部門的編号、名稱、位置、部門人數、平均工資:
SELECT D.DEPTNO, D.DNAME, D.LOC, COUNT(E.EMPNO), AVG(E.SAL)
FROM EMP E, DEPT D
WHERE E.DEPTNO(+) = D.DEPTNO
GROUP BY D.DEPTNO, D.DNAME, D.LOC;
總結
對比以上單子段分組與多字段分組可以發現,查詢中使用了GROUP BY子句,那麼SELECT子句中隻允許出現分組字段、統計函數;是以查詢中的除統計函數以外,其他字段都必須出現在GROUP BY中。
分組過濾HAVING
概念
由于GROUP BY在WHERE子句之後執行,是以無法再WHERE條件中進行統計條件的限定。而可以使用HAVING實作對分組過後的資料進行過濾。
HAVING隻能不出現或與GROUP BY成對出現。
執行個體
查詢出每個職位的名稱,職位的平均工資大于2000:
SELECT JOB, AVG(SAL)
FROM EMP
GROUP BY JOB
HAVING AVG(SAL) > ;
WHERE與HAVING 的差別
- WHERE子句是在GROUP BY 分組之前進行篩選,用于選出可以用于分組的資料,并且WHERE子句中不允許使用統計函數。
- HAVING子句實在GROUP BY分組之後執行的,是以可以使用統計函數。