五、多表连接查询——对分组结果进行过滤
五、多表连接查询——对分组结果进行过滤
1.什么是对分组结果进行过滤?
我们在对数据进行分组之后,得到了一张表,但是表内的数据如果不全是我们想要的,那该怎么办呢?数据过滤可以使用where关键字,但是这个where关键字的动作发生在数据分组汇总之前,此时如果想要对分组汇总之后的数据进行过滤的话,必须使用having关键字【在此处相当于where关键字的作用,但是where发生在数据分组汇总前,having发生在数据分组汇总后】。
2.示例:
(1)示例1
将分组汇总后的成绩高于80分的班级取出。
select class,avg(score) as avg_score from grade_score group by class having avg_score>60;
select class,avg(score) as avg_score from grade_score group by class having avg_score>80;
(2)示例2
将成绩大于80的同学进行分组统计平均分数并且取出平均成绩大于88分的班级与成绩。
第一层过滤where:过滤掉低于80分的同学的成绩。
第二层过滤having:对最终结果过滤掉低于88分的班级。
select class,avg(score) as avg_score from grade_score
where score>80 group by class having avg_score>88;
3.where和having的比较
where子句 | having |
不能使用聚合函数 | 可以使用聚合函数 |
group by分组汇总之前的过滤操作 | group by分组汇总之后的过滤操作 |
限制的行数据 | 限制的是分的组 |
4.MySQL的执行顺序
(1)一个完整的MySQL语法
select [列名/聚合函数(列名)]
from 表名1,表名2,...[可以使用内连接或者外连接]
where [分组前过滤条件]
group by [分组列]
having [分组后过滤条件]
order by [列(排序条件)];
(2)示例
select class,sum(score) as total_score
from grade_score
where score>80
group by class
having total_score>300
order by total_score desc;
执行顺序:
<1>执行from子句,找到grade_score这张表;
<2>执行where子句,将grade_score表中符合score>80这个条件的数据给取出;
<3>执行group by子句,将数据根据class列分组汇总;
<4>执行having子句,将分组汇总后的数据根据total_score>300这个条件进行过滤;
<5>执行order by子句,把最终结果根据total_score的值由大到小进行排序;
<6>执行select子句,选择出所有数据。
注意:如果存在多表连接,那么在第一步就先找到对应的表,先执行多表连接,再进行where数据过滤,后续步骤相同。
还没有评论,来说两句吧...