分组处理函数也叫多行处理函数,输入多行,最终输出一行。必须先分组再使用,如果没有对数据进行分组,整张表默认是一组。
注意
1.分组函数自动忽略null,不需要再用ifnull函数处理。
2.分组函数不能直接使用在where子句中
错误语句:select ename,sal from emp where sal>min(sal); 报错信息为无效使用分组函数
这是因为,在SQL中,语句顺序应该是select...from...where...group by...order by...
以上关键字的顺序不能颠倒,执行顺序是1.from,2.where,3.group by,4.select,5.order by。
由于分组函数在使用前必须先分组,而执行where语句时,还没有执行group by,没有进行分组,因此where子句后面不能使用分组函数。
3.所有分组函数可以组合起来一起用
如:select sum(sal),max(sal),min(sal),count(*) from emp;
4.分组函数不可以嵌套使用
比如错误用法:max(avg(sal))
一、分组函数
1.count 计数
计算共有多少员工?select count(ename) from emp;
count (*)与count (字段名)有区别,count (字段名) 统计的是字段下不为null的元素总数,count(*)统计的是总行数,只要有一行数据,count(*)就+1
2.sum 求和
select sum(sal) from emp;
3.avg 平均数
select avg(sal) from emp;
4.max 最大值
select max(sal) from emp;
5.min 最小值
select min(sal) from emp;
二、分组查询
实际应用中,需要先分组再查询,使用select...from...group by...;
重点强调:在一条select语句中,如果使用group by分组的话,select后面只能跟参加分组的字段以及分组函数,其他一律不能跟。
1.对一个字段分组
按照工作岗位分组,对工资求和?
select job,sum(sal) from emp group by job;
该语句的执行顺序:from,group by,sum(sal)
2.多重分组
找出每个部门,不同工作岗位的最高薪资?
select deptno,job,max(sal) from emp group by deptno,job;
3.having过滤
对分组结果可使用having进一步过滤。having与where不同,必须结合group by一起使用,不能单独使用。
找出每个部门薪资最大值,显示3000以上的薪资?
select deptno,max(sal) from emp group by deptno having max(sal)>3000;
也可将大于3000的先找出来,再分组求最大值:
select deptno,max(sal) from emp where sal>3000 group by depto;
where和having优先选择where,where没办法的再用having