1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 关于sql语句 where group by having order by 优先级的理解

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

时间:2022-12-22 19:50:07

相关推荐

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

文章目录

1、先给大家看表2、测试,并给出结果a)根据学号分组b)根据学号,和课程号分组c)说说having,d) 我们再说说 where 和 group by 和 having 的优先级 3、关于 order by 的优先级4、总结where > group by > having >order by 5、其他a) 执行成功,select 存在Grade字段,having过滤成功b)如果select 没有Grade字段,having过滤失败,执行失败c) 需要注意的是,select 没有聚合函数的字段,having 对聚合函数操作依旧可以成功,和普通字段不同d) order by 和having 不同的是

1、先给大家看表

初始化点击:建表初始化工作

字段为学号,课程号,成绩

总共就两个学生,每个学生3科成绩。

2、测试,并给出结果

a)根据学号分组

select Sno,Cno,Grade from scgroup by Sno

这个时候Cno,和Grade的数据是分组内的多条数据中的第一条数据(这个数据没有意义)

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

select Sno,Cno,Grade from scgroup by Sno,Cno

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

c)说说having,

select Sno,Grade,avg(Grade)from scgroup by Sno

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

select Sno,Grade,avg(Grade)from scgroup by Snohaving avg(Grade)>=70

加了having的效果

甚至可以对Grade过滤

select Sno,Grade,avg(Grade)from scgroup by Snohaving 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 afrom scgroup 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 scgroup by Sno

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

select Sno,Count(Sno)from scWHERE Grade>=60group 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 afrom scgroup by SnoORDER BY a DESC

4、总结

where > group by > having >order by

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

5、其他

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

select Sno,Grade,AVG(Grade)from scgroup by Snohaving Grade>=1

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

select Sno,AVG(Grade)from scgroup by Snohaving Grade>=1

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

select Sno,AVG(Grade)from scgroup by Snohaving Count(Cno)>=3

sql执行成功

d) order by 和having 不同的是

having 可以对select不存在的聚合函数操作进行筛选,但是不可以对select不存在的普通字段进行筛选order by 对select不存在的聚合函数和普通字段都可以进行排序

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。