grouop by: 按照某个字段或者某些字段进行分组。
having”:having是对分组之后的数据进行再次过滤。
having 是group by 的搭档。没有后者就没有前者
、
、
**注意:**分组函数一般都会和group by联合使用。这也是分组函数名字的由来。
、
当一条sql语句没有group by的话,整张表的数据就会自成一组。
因为group by是在where执行之后才会执行的,所以where语句不能使用分组函数,要分完组之后才能使用分组函数。
例子:
、
第一步:找出平均工资
select avg(sal) from emp;
第二部:找出高于平均工资的员工。
select ename,sal from emp where sal > 2073.214286;
二合一:
select ename,sal from emp where sal > (select avg(sal) from emp;);
查出每个工种的最高薪资:
select max(sal),job from emp group by job;
/
重点!:当一条sql语句包含group by分组语句的话,select后面必须跟参加分组的字段!或者分组函数
每个岗位的平均薪资:
select job,avg(sal) from emp group by job;
.
.
多个字段能不能联合起来一块分组?
**案例:**找出每个部门不同工作岗位的最高薪资。
select deptno,job,max(sal) from emp group by deptno ,job;
/
案例:找出每个部门的最高薪资,要求显示大于2500的数据 :
select deptno,max(sal) from emp group by deptno having max(sal) > 2900;//效率低
select deptno,max(sal) from emp where sal > 2900 group by deptno;
效率高,因为上面那条是分好组然后去掉低于2900的,下面这个是直接把低于2900的过滤掉了,所以高效。 但是结果都是一样的。
所以建议能使用where 过滤的,就是用where过滤
。
。
案例:找出每个部门的平均薪资,要求显示薪资大于2000的数据。
select deptno,avg(sal) from emp group by deptno having avg(sal) > 2000;
这条就不能用 where ,因为这是求平均数,where会在group by 之前执行会提前过滤数据,所以会造成求得平均数不对。