上一次筆記學習了,多表查詢,本次筆記來學習Oracle中的分組函數。
首先來了解一下什麼是組函數:
組函數:作用於一組數據,並對一組數據返回一個值。
SQl中組函數的類型:
COUNT():求出全部的記錄數。
MAX():求出一組數據中的最大值。
MIN():求出最小值。
AVG():求平均值。
SUM():求和。
數值型數據可以使用AVG()和SUM()函數;MIN()和MAX()函數適用於任意數據類型,但是一般應用在數值類型上。
基本語法:
SELECT [column], group_function(column), ...
FROM table
[WHERE condition]
例:使用count()函數,求出雇員表中記錄總數。
SQL> select count(*) from emp ;
COUNT(*)
----------
14
SQL> select count(deptno ) from emp ;
COUNT(EMPNO)
------------
14count()函數括號中,可以使用*,*表示返回所有記錄的總數。可以使用列名,列名表示返回該列記錄中不為空的記錄總數。在上面的結果中,查詢部門號,在結果中顯示有14條數據,在部門表中只有4條數據,那麼返回的查詢結果中存在重復的情況。可以使用distinct 關鍵字,來去重。即:select count(distinct deptno ) from emp ; , 返回的結果為3。
例:使用MAX 、MIN,求雇員表中,員工的最高工資和最低工資。
SQL> select max(sal) , min(sal ) from emp ;
MAX(SAL) MIN(SAL)
---------- ----------
5000 800
例:使用AVG、SUM函數,求雇員表中,30號部門的工資平均值和工資總和。
SQL> select sum(sal) ,avg(sal) from emp where deptno = 30 ;
SUM(SAL) AVG(SAL)
---------- ----------
9400 1566.66666
使用group by 字句,來為數據分組。
基本語法:
SELECT [column,] group_function(column), ...
FROM table
[WHERE condition]
[GROUP BY column]
[ORDER BY column asc | desc];
例:求雇員表中每一個部門的雇員數量
SQL> select deptno , count(deptno)
2 from emp
3 group by deptno ;
DEPTNO COUNT(DEPTNO)
------ -------------
30 6
20 5
10 3按照deptno對數據進行分組,之後統計每一個分組中的記錄總數。並將結果返回。
例:求每個部門的平均工資,結果取整。
SQL> select round(avg(sal)) , deptno from emp group by deptno ;
ROUND(AVG(SAL)) DEPTNO
--------------- ------
1567 30
2175 20
2917 10
注意:
跟在select後面的字句,除了函數外,也可以跟列名。如果跟列名那麼應該和group by後面的列名一致。否則出現ORA-00979: 不是 GROUP BY 表達式錯誤。
例:
select deptno ,empno ,count(empno)
from emp
group by deptno
ORA-00979: 不是 GROUP BY 表達式 ,empno 為多余的列。
而
select deptno , count(empno)
from emp
group by deptno ; 正確執行。
例:求平均工資大於200 的部門
select deptno
from emp
where avg(sal) > 2000
group by deptno
ORA-00934: 此處不允許使用分組函數當我們執行,上面的sql語句的時候提示,where後面不允許使用分組函數。即:分組函數不允許在where語句之後出現。如果要對分組函數加入限制條件,使用HAVING 子句。HAVING子句必須與GROUP BY 子句連用,可以放在GROUP BY之前,也可以房子之後。GROUP BY可以單獨使用。
即:
select deptno
from emp
having avg(sal) > 2000
group by deptno結果為:
DEPTNO
------
20
10
例:查詢部門平均工作中最大的工資
SQL> select max(avg(sal)) from emp group by deptno ;
MAX(AVG(SAL))
-------------
2916.66666666
通過上面的結果,說明組函數可以嵌套使用。但是select 後面不能再出現 deptno字段名,否則出現ORA-00937: 不是單組分組函數提示。