老杜带你学的课堂笔记
分组函数(多行处理函数)的特点:
输入多行,最终输出一行。
count 计数
sum 求和
avg 平均值
max 最大值
min 最小值
注意:分组函数在使用时必须先进行分组,然后才能用
如果没有对数据进行分组,整张表默认为一组
分组函数的注意事项:
1. 分组函数自动忽略 null,不需要提前对null进行处理
2. count(具体字段):表示统计该字段下所有不为 null 的元素的总数
count(*):统计表中的总行数,只要有一行数据 count 则++
3. 分组函数不能直接使用在 where 子句中
4. 所有的分组函数可以组合起来一起用
5. 在一句 select 语句当中,如果有 group by 语句的话,select 后面只能跟:参加分组的字段,以及分组函数,其他的一律不能跟。
分组查询(五颗星)
什么是分组查询?
实际应用中,可能有这样的需求,需要先进行分组,然后对每一组的数据进行操作。
这个时候我们需要使用分组查询
select。。。from。。。group by。。。
顺序
select......from......where......group by......having.......order by......
顺序不可以颠倒,需要记忆
执行顺序:
1. from 从某张表中查询数据
2. where 先经过 where 条件筛选出有价值的数据
3. group by 对这些有价值的数据进行分组
4. having 分组之后可以使用 having 继续筛选
5. select select 查询出来
6. order by 最后排序输出
为什么分组函数不能直接用在where后面:
比如说:
select sal from ... where sal>min(sal); // 报错
因为分组函数在使用的时候必须先分组之后才能使用
where 执行的时候,还没有分组,所以where后面不能出现分组函数。
分组函数实例
找出每个工作岗位的工资和
实现思路:按照工作岗位分组,然后对工资求和
select sum(sal) from ... group by job;
找出每个部门的最高薪资
实现思路:按照部门编号分组,求每一组的最大值
select deptno, max(sal) from ... group by deptno;
找出每个部门,不同工作岗位的最高薪资
实现思路:两个字段联合成一个字段去看
select deptno , job , max(sal)
from ?
group by
deptno , job;
找出每个部门最高薪资,要求显示最高薪资大于3000的
实现思路:按照部门编号求每一组的最大值,要求显示最高薪资大于3000
select deptno , max(sal) from ... group by deptno having max(sal)>3000;
使用 having 可以对分完组之后的数据进一步过滤,having 不能单独使用,having 不能完全代替 where,having 必须和 group by 联合使用。
思考:以上的语句执行效率或许比较低,实际上可以这么考虑,先将大于3000的都找出来,
select deptno , max(sal) from ? where sal>3000 group by deptno;
优化策略:where 和 having ,优先选择 where,where 实在完成不了了,再选择 having
要求显示平均薪资高于2500的
select deptno , avg(sal) from ... group by dentno having avg(sal)>2500;
找出每个岗位的平均薪资,要求显示平均薪资大于1500的,除了 manager 岗位之外,要求按照平均薪资降序排
select
job , avg(sal) as avgsal
from
...
where
job<>'manager'
group by
job
having
avg(sal)>1500
order by
avgsal desc;