oracle数据库学习笔记(二)之分组统计查询

统计函数(分组函数)

在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 ;

提示:分组限制
。统计函数可以不结合GROUP BY单独使用,但是要求此时的SELECT子句中只能出现统计函数,而不能出现其他任何的字段

错误代码 正确代码
SELECT empno,COUNT(*),AVG(sal) FROM emp ; SELECT COUNT(*),AVG(sal) FROM emp ;
。在使用GROUP BY分组时候,SELECT子句中只能出现分组字段和统计函数,其他任何字段都不允许 出现

。分组时的统计函数可以嵌套使用,但是一旦嵌套使用则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 ;

HAVING子句

oracle数据库学习笔记(二)之分组统计查询_第1张图片

此时执行顺序为

⑤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 ;



你可能感兴趣的:(数据库,数据库,oracle)