分组函数:(多行处理函数)
多行处理函数的特点:输入多行,最终输出一行
5个:
count 计数 select count(ename)from emp;统计员工数量
sum 求和 select sum(sal)from emp;计算工资和
avg 平均值 select avg(sal)from emp;计算平均工资
max 最大值 select max(sal)from emp;找出最高工资
min 最小值 select min(sal)from emp;找出最低工资
注意:分组函数在使用的时候必须先进性分组,然后才能用。
如果你没有对数据进行分组,整张把报表默认为一组。
分组函数在使用的时候要注意什么
1.分组函数自动忽略null,你不需要提前对null进行处理
2.分组函数中count(*)和count(具体字段)有什么区别?
count(具体字段):表示统计该字段下的所有不为null的元素的总数。
count(*):统计表当中的总行数。(只要有一行数据count则++)
因为每一行记录不可能都为null,一行数据中有一列不为null,则这行数据就是有效的。
3.分组函数不能直接使用在where句中
4.所有分组函数可以组合起来一起使用
select sum(sal),min(sal),max(sal),avg(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 排序输出
为什么分组函数不能直接使用在where后面?
select ename,sal from emp where sal > min(sal),//报错
因为分组函数在使用的时候必须先分组之后才能使用。
where执行的时候,还没有分组。所以where后面不能出现分组函数。
select sum(sum) from emp;
这个没有分组,为啥sum()函数可以用?
因为select在group by 之后执行。
找出每个工作岗位的工资和?
实现思路:按照功罪岗位分组,然后对工资求和。
select
job,sum(sal)
from
emp
group by
job;
以上语句的执行顺序
先从emp表中查询数据
根据job字段进行分组
然后对每一组的数据进行sum(sal)
重点结论:
在一条select语句当中,如果有group by 语句的话,
select后面只能跟:参加分组的字段,以及分组函数。
其他一律不能跟。
找出每个部门的最高薪资
实现思路是什么
按照部门编号分组,求每一组的最大值
select后面添加ename字段没有意义,另外oracle会报错。
没意义语句 select ename,deptno,max(sal) from emp group by deptno;
正确语句 select deptno,max(sal) from emp group by deptno;
找出每个部门,不同工作岗位的最高薪资?
技巧:两个字段联合成1个字段看。(两个字段联合分组)
select
deptno, job, max(sal)
from
emp
group by
deptno, job;
找出每个部门最高薪资,要求显示最高薪资大于3000的?
使用having可以对分完组之后的护具进一步过滤。
having不能单独使用,having不能代替where,having必须和group by联合使用
第一步:找出每个部门最高薪资
按照部门编号分组,求每一组最大值。
select deptno,max(sal) from emp group by detno;
第二部:要求显示最高薪资大于3000的
select
deptno,max(sal)
from
emp
group by
heptno
having
max(sal) > 3000;
以上做法效率较低
实际上可以考虑:先将大于3000的都找出来,然后在分组。
select
deptno,max(sal)
from
emp
where
sal > 3000
group by
deptno;
where没办法的?
找出每个部门平均薪资,要求显示平均薪资高于2500的。
第一步:找出每个部门平均薪资
select deptno,avg(sal) from emp group by deptno;
第二步:要求显示平均薪资高于2500的。
select
deptno,avg(sal)
from
emp
group by
deptno
having
avg(sal) > 2500;
优先使用where,用不了在用having
大总结:(单表的查询学完了)
select
...
from
...
where
...
group by
...
having
...
order by
...
执行顺序?
1.from 从某张表中查询数据
2.where 先经过where 条件筛选出有价值的数据
3.group by 对这些有价值的数据进行分组
4.having 分组之后可以使用having继续筛选
5.select 查询出来
6.brder by 最后排序输出
找出每个岗位的平均薪资,要求显示平均薪资大于1500的,除manager岗位之外,要求按照平均薪资降序排
select
job,avg(sal) as avgsal
from 从这张表里查
emp
where 除了这个岗位,
job <> 'manager'
group by 剩下的岗位分组
job
having 分组后找出平均工资大于1500的
avg(sal) > 1500
order by 按照平均工资降序
avgsal desc;