关于sql语句,where,group by,having,order by 优先级的理解

1、先给大家看表

初始化点击:建表初始化工作
字段为学号,课程号,成绩
在这里插入图片描述
总共就两个学生,每个学生3科成绩。

2、测试,并给出结果

a)根据学号分组

select Sno,Cno,Grade 
from sc
group by Sno

在这里插入图片描述
这个时候Cno,和Grade的数据是分组内的多条数据中的第一条数据(这个数据没有意义)

b)根据学号,和课程号分组

select Sno,Cno,Grade 
from sc
group by Sno,Cno

在这里插入图片描述
当以多个字段为条件时,需要满足多个字段的值各个相同才被分为同一组。分组的基本原理先讲到这

c)说说having,

select Sno,Grade,avg(Grade)
from sc
group by Sno

不加having的效果,这个Grade其实就是分组后的第一条数据的Grade
不加having的效果

select Sno,Grade,avg(Grade)
from sc
group by Sno
having  avg(Grade)>=70

加了having的效果
在这里插入图片描述
甚至可以对Grade过滤

select Sno,Grade,avg(Grade)
from sc
group by Sno
having Grade>60

在这里插入图片描述
到这里,大家应该懂了,having的处理过程了。sql执行的过程中先group by进行分组,得出数据,在此基础上进行having过滤,也就是说,having实际上是过滤字段,或者是聚合函数产生的字段。

比如我们给 avg(Grade) 取个别名a,那么 having avg(Grade)>=70 and Grade>95 等价于 having a>=70 and Grade>95

select Sno,Grade,avg(Grade) as a
from sc
group by Sno
#having  avg(Grade)>=70 and Grade>95  #和下面这句是等价的
having  a>=70 and Grade>95

d) 我们再说说 where 和 group by 和 having 的优先级

我这里直接说结论 where 的优先级大于 group by

统计每个学生的记录条数(成绩个数)

select Sno,Count(Sno)
from sc
group by Sno

在这里插入图片描述

统计每个学生及格的记录条数

select Sno,Count(Sno)
from sc
WHERE Grade>=60
group by Sno

在这里插入图片描述

我们假设group by 优先级比where更高,但是 group by 生成的字段并没有Grade,显然不符合情景。反之证明了where的优先级大于group by,where先对记录进行过滤,group by 再对记录进行分组,符合实验结果。
因为group by的优先级大于having ,所以 where 和 having 不需要进行二次比较了 。所以优先级是
where > group by > having

3、关于 order by 的优先级

我看法是这样的,如果是对原有字段排序,思考后会发现,order by 在 group 之前,或者是在group之后排序,实际上最终效果一样,因为分组并没有改变顺序。

稍微继续解释下:

a) 如果没有order by ,group by 之后显示的数据是数据库存储的原有顺序
b) 如果有order by,并且 order by在 group by之前,排序好了+原有顺序=排序好了
c) 如果有order by,并且 order by在 group by之后,原有顺序+排序好了=排序好了

但是换一个思维:order by 可以对分组聚合后的数据排序,从这个角度上看 oder by 的优先级是比group by 的更低的,gruop by更早执行

#学生的所有科目的平均成绩进行排序
select Sno,AVG(Grade) as a
from sc
group by Sno
ORDER BY a DESC

在这里插入图片描述

4、总结

where > group by > having >order by

补:having 和order by的前后关系,无法通过结果测出(我这里也是猜的)

5、其他

a) 执行成功,select 存在Grade字段,having过滤成功

select Sno,Grade,AVG(Grade)
from sc
group by Sno
having  Grade>=1

在这里插入图片描述

b)如果select 没有Grade字段,having过滤失败,执行失败

select Sno,AVG(Grade)
from sc
group by Sno
having  Grade>=1

在这里插入图片描述

c) 需要注意的是,select 没有聚合函数的字段,having 对聚合函数操作依旧可以成功,和普通字段不同

select Sno,AVG(Grade)
from sc
group by Sno
having  Count(Cno)>=3

sql执行成功

d) order by 和having 不同的是

  • having 可以对select不存在的聚合函数操作进行筛选,但是不可以对select不存在的普通字段进行筛选
  • order by 对select不存在的聚合函数和普通字段都可以进行排序
  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值