group by:按照某个字段或某些字段进行分组。

having:    对分组之后的数据进行再次过滤。

 

一 查询语句的执行顺序

select    5
    ....
form      1
    ....
where     2
    ....
group by  3
    ....
having    4
    ....
order by  6
    ....
limit.... 7

总结:from - where - group by - having - select - order by - limit
      1      2        3         4        5         6       7

where和having都是过滤数据。where是分组前过滤,having是分组后过滤。

首先我是不是需要知道从哪个表去获取我想要的数据,也就是from;现在我知道从哪个表获取了,可是并不是这个表里面所有的信息都是我需要的,我需要把一些不需要的去掉(比如测试订单),或是把一些我需要的筛选出来,这就是where;现在我把需要的订单明细筛选出来,可是我想要每个品类的订单量,这个时候是不是需要做一个分组聚合,也就是group by;分组聚合后的结果也并不是我们全部都要,我们只要大于10的品类,所以需要把大于10的筛选出来,非大于10的品类过滤掉,这就是having;现在我们想要的大部分信息都已经出来了,我们就可以用select把他们查询出来了;因为我们最后需要取前三的品类,所以我们需要把查询出来的结果进行一个降序排列,即order by;最后一步就是只把前三显示出来,做一个限制就行,也就是limit。

 

 二 分组函数要点

1 分组函数一般都会和group by 联合使用,这也是为什么叫分组函数的原因。

2 分组函数永远都是在分组group by 完成后执行的。组都没有分好呢,分组函数怎么可能指向呢。

3 当一条SQL语句中没有group by 的话,整张表的数据自成一组。

4 当一条SQL语句中有group by的时候,select后面只能跟:分组函数和参与分组的字段

 

三 多个字段联合起来分组

//找出不同事业部不同岗位的最高薪资
//教育事业部:销售 文员 会计 技术
//建筑事业部:销售 文员 会计 技术
select deptno,job,max(sal) from emp1 group by deptno,job;//把多个字段当成一个字段理解就可以
select 部门编号字段,岗位字段,max(工资字段) from emp1 group by 部门编号字段,岗位字段;

 

 四 where和 having的选择

分组前可以等到的数据用where过滤

//1 找出每个部门的最高薪资 要求显示薪资大于2900的数据
分析需求:最高数据是原本存在的 所以用where就可以过滤
select deptno,max(sal) from emp1 where sal>2900 group by deptno;//最佳写法  能用where的尽量用where
select deptno,max(sal) from emp1 group by deptno having max(sal)>2900;//执行效率低 where解决不了的再用having

 分组后才可以得到的数据 用having

//2 找出每个部门的平均薪资 要求显示薪资大于2000的数据
分析需求:平均工资是需要分组后再计算才可以得到,所以用having
select deptno,avg(sal) from emp1 group by deptno;//求出各部门的平均薪资

select deptno,avg(sal) from emp1 group by deptno having avg(sal)>2000; //这里用where就搞不定了  只能用having来过滤

 

五 实战练习

1)找出工资高于平均工资的员工

//select avg(sal) from emp; //1 先查出平均工资 得到2073.2143

select name,sal from emp where sal>2073.2143; //2 找出高于平均工资的员工

select name,sal from emp where sal>(select avg(sal) from emp);//3 把1和2组装一下

//select 中嵌套 select,用到了子查询  括号里的优先级高先执行

2) 每个工作岗位的平均薪资

SELECT job,AVG(sal) FROM emp GROUP BY job;

3)找出不同工作岗位的最高薪资

select max(sal),job from emp group by job;