一、分组函数概述
- 分组函数是对表中一组记录进行操作,每组只返回一个结果,即首先要对表记录进行分组,然后在进行操作汇总,每组返回一个结果,分组时可能是整个表分为一组,也可能根据条件分成多组。
- 分组函数常用到以下5个函数:
- MIN
- MAX
- SUM
- AVG
- COUNT
二、分组函数
- MIN函数和MAX函数
MIN和MAX函数主要是返回每组的最小值和最大值
- MIN([DISTINCT|ALL] 参数)
- MAX([DISTINCT|ALL] 参数)
- MIN和MAX可以用于任何数据类型
- 例如:查询入职最早和最晚的日期
SELECT MIN(hiredate),MAX(hiredate) FROM emp;
- SUM函数和AVG函数
SUM和AVG函数分别返回每组的总和及平均值
- SUM([DISTINCT|ALL] 参数)
- AVG([DISTINCT|ALL] 参数)
- SUM和AVG函数都是只能够对数值类型的列或表达式操作
- 例如:查询职位以SALES开头的所有员工平均工资、最低工资、最高工资、工资和。
SELECT AVG(sal),MAX(sal),MIN(sal),SUM(sal) FROM emp WHERE job LIKE 'SALES%';
- COUNT函数
COUNT函数的主要功能是返回满足条件的每组记录条数
- COUNT(*|{[DISTINCT|ALL] 参数})
- COUNT(*):返回表中满足条件的行记录数
- 例如:查询部门30有多少员工,查询部门30有多少人领取奖金
返回所有满足条件:SELECT COUNT(*) FROM emp WHERE deptno = 30;
返回参数满足非空(NULL)条件下:
SELECT COUNT(comm) FROM emp WHERE deptno = 30;
- 组函数中DISTINCT
- DISTINCT会消除重复记录后在使用组函数
- 例如:查询所有员工的部门数量
SELECT COUNT(DISTINCT deptno) FROM emp;
- 分组函数中的空值处理
- 除了COUNT(*)之外,其他所有分组函数都会忽略列中的空值,然后再进行计算。
SELECT AVG(comm) FROM emp;
- 在分组函数中使用NVL函数
- NVL函数可以使分组函数强制包含含有空值的记录
SELECT AVG(NVL(comm,0)) FROM emp;
三、用GROUP BY子句创建数据组
- 通过GROUP BY子句可将表中满足WHERE条件的记录按照指定的列划分成若干小组
- 在SELECT列表中除了分组函数那些项,所有列都必须包含在GROUP BY子句中。
- 其中GROUP BY子句指定要分组的列
- 查询每个部门的编号,平均工资
SELECT deptno, AVG( sal) FROM emp GROUP BY deptno;
- GROUP BY所指定的列并不是必须出现在SELECT列表中。
SELECT AVG( sal) FROM emp GROUP BY deptno;
四、使用HAVING子句
- 不能再WHERE子句中限制分组
SELECT deptno,max(sal) FROM emp WHERE MAX(sal) > 2900 GROUP BY deptno; //注意:不能使用限制组
- 可以通过HAVING子句限制分组
- 记录已经分组
- 使用过组函数
- 与HAVING子句匹配的结果才输出
SELECT deptno,max(sal) FROM emp GROUP BY deptno HAVING MAX(sal) > 2900;
SELECT job,SUM(sal) PAYROLL FROM emp WHERE job NOT LIKE 'SALES%' GROUP BY job HAVING SUM(sal) > 5000 ORDER BY SUM(sal);
五、SELECT语句的执行过程
- 通过FROM子句中找到需要查询的表;
- 通过WHERE子句进行非分组函数筛选判断;
- 通过GROUP BY子句完成分组操作;
- 通过HAVING子句完成函数筛选判断;
- 通过SELECT子句选择显示的列或表达式及组函数;
- 通过ORDER BY子句进行排序操作。
这个过程非常重要!!!!
六、组函数的嵌套
- 注意:与单行函数不同,组函数只能嵌套两层。
SELECT MAX(AVG(sal)) FROM emp GROUP BY deptno;