目录
聚合函数
count([distinct] column)
sum([distinct] column)
avg([distinct] column)
max([distinct] column)
min([distinct] column)
group by子句
1.如何显示每个部门的平均薪资和最高薪资
2.显示每个部门每种岗位的平均薪资和最低薪资
3.显示平均工资低于2000的部门和该部门的工资
having
4.显示平均工资低于2000的部门和该部门的工资,姓名为SMITH的雇员不参与统计
where和having有什么区别?
聚合函数
count([distinct] column)
返回查询数据的数量
sum([distinct] column)
返回查询到的数据的总和
avg([distinct] column)
返回查询到数据的平均值
max([distinct] column)
返回查询到数据的最大值
min([distinct] column)
返回查询到数据的最小值
group by子句
现在有一个雇员表,包含empno(雇员编号)、ename(雇员姓名)、job(岗位)、sal(薪资)、deptno(部门)。
1.如何显示每个部门的平均薪资和最高薪资
select deptno, max(sal) 最高,avg(sal) 平均 from EMP group by deptno;
//这里的group by语句是将部门分组,进而再通过聚合函数avg、max计算出各部门的平均薪资和最高薪资
//select 后跟depton
2.显示每个部门每种岗位的平均薪资和最低薪资
select deptno,job,avg(sal) 平均, min(sal) 最低 from emp group by deptno,job;
//group by子句后可跟多个列进行分组
这样写可以吗?不可以
select ename,deptno,job,avg(sal) 平均, min(sal) 最低 from emp group by deptno,job;
这句指令的意思是显示各部门每种岗位的薪资平均值,并显示雇员姓名,这在逻辑上是行不通的,
在使用group by子句时,select后只能跟,group by后的字段名(列名),如果select后出现其他列名,mysql会报错。
3.显示平均工资低于2000的部门和该部门的工资
select deptno, avg(sal) depavg from emp group by deptno having depavg<2000;
having
having与group by配合使用,用于对分组后聚合统计后的数据进行筛选。
4.显示平均工资低于2000的部门和该部门的工资,姓名为SMITH的雇员不参与统计
select deptno,job, avg(sal) myavg from emp where rename != 'SMITH' group buy deptno,job having myavg<2000;
where和having有什么区别?
执行顺序不一样,对数据筛选的阶段不同。