在oracle里面对于统计函数提供有很多种,下面主要介绍标准的五个统计函数:
- 统计表中的数据量:COUNT(* | 字段 | DISTINCT 字段)
- 统计平均值: AVG(列)
- 求和:SUM(列)
- 最大值 :MAX(列)
- 最小值:MIN(字段)
对于以上的统计函数理论上是不区分数据类型的,但是实际来讲希望记住以下原则:
。COUNT():是作为数据表的记录数量统计的,一般情况下建议这个函数只设置不为空的列
。AVG()、SUM(): 是作为数据的统计结果的,所以建议使用数字咧
。MAX()、MIN():可以使用数字、字符串、日期完成统计
示例:统计所有雇员的数量、总工资、平均工资
SELECT COUNT(*),SUM(sal+NVL(comm,0)),AVG(sal+NVL(comm,0)) FROM emp ;
示例:统计出最早和最晚的雇用日期
SELECT MAX(hiredate),MIN(hiredate) FROM emp ;
思考题:请解释COUNT(*)、COUNT(字段)、COUNT(DISTINCT 字段)的区别?
|-在使用COUNT()函数的时候最简化的做法就是写上一个“*”,如果COUNT()使用的字段上不为null,那么COUNT(*)和COUNT(字段)没有区别
SELECT COUNT(*),COUNT(empno) FROM emp ;
|-如果字段上有null时候,使用COUNT(字段),则null的数据不进行统计,只统计出有数据的
SELECT COUNT(*),COUNT(comm) FROM emp;
|-如果不想统计重复数据的时候,使用COUNT(DISTINCT 字段)可以消除重复
SELECT COUNT(*),COUNT(mgr),COUNT(DISTINCT job) FROM emp ;
④SELECT 列 [别名],列 [别名],列 [别名],... | 统计函数 , ....
①FROM 表1 [别名],表2 [别名],.....
②[WHERE 过滤条件(s)]
③[GROUP BY 分组字段 , ....]
⑤[ORDER BY 字段 [ASC | DESC],字段 [ASC | DESC],...]
示例:按照部门进行分组,统计出每个部门的人数,平均工资
SELECT deptno,COUNT(*),AVG(sal) FROM emp GROUP BY deptno ;
错误代码 | 正确代码 |
SELECT empno,COUNT(*),AVG(sal) FROM emp ; | SELECT COUNT(*),AVG(sal) FROM emp ; |
。分组时的统计函数可以嵌套使用,但是一旦嵌套使用则SELECT子句中不允许再出现任何的字段,包括分组字段
错误代码 | 正确代码 |
SELECT deptno,MAX(AVG(sal)) FROM emp GROUP BY deptno ; |
SELECT MAX(AVG(sal)) FROM emp GROUP BY deptno ; |
示例:查询出每个部门的名称、雇员人数、平均工资、最高工资
SELECT d.dname,COUNT(*),AVG(e.sal) FROM emp e,dept d WHERE e.deptno(+)=d.deptno GROUP BY d.dname ;
此时执行顺序为
⑤SELECT 列 [别名],列 [别名],列 [别名],... | 统计函数 , ....
①FROM 表1 [别名],表2 [别名],.....
②[WHERE 过滤条件(s)]
③[GROUP BY 分组字段 , ....]
④[HAVING 分组过滤]
⑥[ORDER BY 字段 [ASC | DESC],字段 [ASC | DESC],...]
思考:关于HAVING 和WHERE 的区别
|- WHERE子句是在GROUP BY之前执行,而HAVING是在GROUP BY之后执行
|- WHERE可以单独使用,而HAVING必须结合GROUP BY一起使用
|- WHERE不允许使用统计函数,而HAVING可以使用统计函数
示例:查询出所有非销售人员的工资总和,并且要求满足从事同一工作的雇员工资的总和大于5000,显示的结果按照降序排列。
SELECT job,SUM(sal) sum
FROM emp WHERE job<>'SALESMAN'
GROUP BY job
HAVING SUM(sal)>5000 ORDER BY sum DESC ;