目录
10. group by(分组)
11. having(对分组后的信息过滤)
可能从这里开始,执行顺序越来越显得重要了!!!
10. group by(分组)
·这个查询相比前面会有一些困难;
格式:group by 字段的集合;
功能:把表中的记录按照字段分成不同好的组;
注意: group by a , b , c ;先按 a 分组,在 a 相同的情况下,再按 b 分组,在 b 相同的情况的情况下,再按 c 分组,最后统计的是最小分组的信息;
组的整体信息:经过 “统计” 操作而得到的信息 ;
组的详细信息:比如直接输出的某个字段;
--group by 之后只出现分组后的整体信息,不能出现组内整体信息;
select deptno ,avg(sal) as "部门平均工资"--表示输出编号分别为10,20,30数据的平均数
from emp
group by deptno;
select deptno,avg(sal) as "部门平均工资",ename--报错,ename的数据前面输出三行,而ename输出14行;
from emp
group by deptno; --group by 之后只出现分组后的整体信息,不能出现组内整体信息;
select deptno,job ,avg(sal) as "平均工资"--okok
from emp
group by deptno ,job
order by deptno,job;
select deptno ,job,avg(sal) as "平均工资",count(*)as"部门人数",--集合函数都可以使用
sum(deptno)"总数",max(sal)as"最大值",min(sal)as"最小值"--集合函数操作的都是最小分组信息
from emp
group by deptno,job
order by deptno,job;
11. having(对分组后的信息过滤)
(前面学习的聚合函数功能为将多行记录返回一个值,用于统计分组的信息)
--having(对分组后的数据过滤,一般会先使用group by;倘若没有出现group by,则默认having把整张表当作一组进行过滤)
select max(sal)as"最高工资" from emp;
--输出【平均工资大于2000的】部门平均工资
select deptno,avg(sal)as"平均工资" from emp group by deptno having avg(sal)>2000;
select deptno,avg(sal)as"平均工资" from emp group by deptno;--分组查询编号为10,20,30的部门的平均工资
select deptno,avg(sal) as "平均工资" from emp group by deptno having count(*)>5;--分组查询员工个数大于5的部门的平均工资
--把姓名不包含A的员工按部门编号分组,统计输出部门平均工资大于2000的部门
--where必须写在having的前面,顺序不可颠倒;
select deptno,avg(sal),count(*)from emp
where ename not like '%A%'--对原始的数据过滤,必须放在前面
group by deptno
having avg(sal)>2000;--对分组后的数据过滤
select * from emp;
select deptno,avg(sal) from emp -----------------------------error
group by deptno
having avg(sal)>2000
where ename not like '%A%';
--倘若没有出现 group by,只出现 having,则默认 having 把整张表当作一组进行过滤(很少用)
--where和having一样,都不允许出现字段的别名;
select deptno,avg(sal) as "平均工资" from emp group by deptno having "平均工资">2000--不可以使用别名,与执行顺序有关
select ename as "部门" from emp where ename not like '%A%';
学完group by 和 having 感觉到麻木,无助,痛苦!
希望大家多多留言,指导一下数据库的学习新的和学习经历,感谢啦。