练习一:统计各个部门的平均工资,且只显示2000以上的
方法一:使用group by
select avg(sal),deptno,max(sal)
from emp
group by deptno
having avg(sal)>2000
order by max(sal) desc;
方法二:使用where子句(不可取,错误的方法,因为where中不能使用多行函数)
select deptno,avg(sal) ,count(1),max(sal)
from emp
where avg(age)>2000 -- 错!!!!!! where子句中不可以使用多行函数
group by deptno
order by max(sal);
练习二:统计各个岗位的平均薪资,除了manager
方法一:
select avg(sal) ,job
from emp
where job!="manager"
group by job
order by avg(sal) desc
方法二:
select job ,avg(sal)
from emp
group by job
having job!="manager"
order by avg(sal)
练习三:统计[人数小于4的]部门的平均工资
select count(1),deptno,avg(sal)
from emp
group by deptno
having count(1)<4
order by count(1) desc
练习四:统计各部门的最高工资,排除最高工资小于3000的部门。
select max(sal),deptno
from emp
group by deptno
having max(sal)>=3000
order by max(sal) desc
注意事项
1.如果没有GROUP BY子句,SELECT列表中不允许出现字段(单行函数)与多行函数混用的情况
2.不允许在WHERE 子句中使用多行函数
3.where子句和having子句联系和区别
联系: 都是筛选记录
区别:where不能出现多行函数,having中可以出现多行函数
4.select语句的执行顺序:from–where – group by– select - having- order by
5.问题:为什么where子句中不可以使用使用多行函数
回答:group by之前的子句不可以使用,group by之后的语句可以使用