多行处理函数
- 多行处理函数的特点:输入多行,最终输出一行
- count 计数
- sum 求和
- avg 平均值
- max 最大值
- min 最小值
注意:
分组函数在使用的时候必须先进行分组,然后才能用
如果你没有对数据进行分组,整张表默认为一组 - 找出最高工资:
select max(sal) from emp;
分组函数在使用的时候需要注意哪些:
- 第一点:分组函数自动忽略NULL,你不需要提前对NULL进行处理
- 第二点:分组函数中count( * )和count(具体字段)有什么区别
count(具体字段):表示统计该字段下所有补位NULL的元素的总数
count( * ):统计表当中的总行数。(只要有一行数据count则++)
因为每一行记录不可能都为NULL,一行数据中有一列不为NULL,则这行数据就是有效的 - 第三点:分组函数不能够直接使用在where子句中
- 找出比最低工资高的员工信息:
select ename,sal from emp where sal>min(sal);//报错
因为分组函数在使用的时候必须先分组之后才能使用
where 执行的时候,还没有分组。所以where后面不能出现分组函数
- 找出比最低工资高的员工信息:
- 第四点:所有的分组函数可以组合起来一起用
select sum(sal),avg(sal),max(sal),min(sal),count(*) from emp; - 分组查询
- 什么是分组查询
在实际的应用中,可能有这样的需求,需要先进行分组,然后对每一组的数据进行操作
这个时候我们需要使用分组查询,怎么进行分组查询呢?
select ... from ... group by ... - 计算每个部门的工资和?
- 计算每个工作岗位的平均薪资?
- 找出每个工作岗位的最高薪资?
- 什么是分组查询
- 将之前的关键字全部组合在一起,来看一下他们的执行顺序
select .. from .. group by .. order by ..
以上关键字的顺序不能颠倒,需要记忆
1.from
2.where
3.group by
4.select
5.order by- 找出每个工作岗位的工资和
实现思路:按照工作岗位分组,然后对工资求和
select job,sum(sal) from emp group by job;
重点结论:
在一条select语句当中,如果有group by语句的话,
select后面只能跟:参加分组的字段,以及分组函数。其他的一律不能跟
- 找出每个工作岗位的工资和
- 使用having可以对分完组之后的数据进行进一步过滤
having不能单独使用,having不能代替where,having必须和group by联合使用 - 找出每个部门的最高薪资
按照部门编号分组,求每一组的最大值
select deptno,max(sal) from emp group by deptno; - 找出每个部门不同岗位的最高薪资
select deptno,job,max(sal) from emp group by deptno,job; - 找出每个部门的最高薪资,要求显示最高薪资大于3000的
- 第一步:找出每个部门最高薪资
select deptno,max(sal) from emp group by deptno; - 第二步:要求显示最高薪资大于3000的
select deptno,max(sal) from emp group by deptno having max(sal) > 3000;
思考一个问题:以上的SQL语句执行效率是不是低?
实际上可以这样考虑:先将大于3000的都找出来,然后在分组
select deptno,max(sal) from emp where sal > 3000 group by deptno;
优化策略:where 和 having,优先选择where,where实在完成不了了,再选择having
- 第一步:找出每个部门最高薪资
- where没办法的
找出每个部门平均薪资,要求显示平均薪资高于2500的
select deptno,avg(sal) from emp group by deptno having avg(sal)>2500;
总结
select ... from ... where ...group by ... having ... order by ...
执行顺序:
1.from
2.where
3.group by
4.having
5.select
6.order by
- 找出每个岗位的平均薪资,要求显示平均薪资大于1500的,除MANAGER之外,要求按照平均薪资降序排
select job,avg(sal) from emp where job !='MANAGER' group by job having avg(sal)>1500 order by avg(sal) desc;