五、多表连接查询——对分组结果进行过滤

五、多表连接查询——对分组结果进行过滤

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数据过滤,后续步骤相同


解锁课程,学习更多mysql知识:
https://study.163.com/course/courseMain.htm?courseId=1209590958&share=2&shareId=400000000537035

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值