文章目录

  • 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 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

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不存在的聚合函数和普通字段都可以进行排序

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

  1. SQL语句where,Group By,having order by 的详细使用方法

    为什么80%的码农都做不了架构师?>>>    1. Group By 语句简介: Group By语句从英文的字面意义上理解就是"根据(by)一定的规则进行分组(Grou ...

  2. mysql groupby having_浅谈sql语句中GROUP BY 和 HAVING的使用方法

    在介绍GROUP BY 和 HAVING 子句前,我们必需先讲讲sql语言中一种特殊的函数:聚合函数, 例如SUM, COUNT, MAX, AVG等.这些函数和其它函数的根本区别就是它们一般作用在多 ...

  3. 为什么使用@tablename起别名产生的sql语句不能用_10个简单步骤,完全理解SQL

    多年前收藏在笔记中的一篇文章,今天偶然翻出,重读了一遍,依然大有收获.分享出来,大家一起探讨. 以本文是为了以下读者而特地编写的: 1. 在工作中会用到 SQL 但是对它并不完全了解的人. 2. 能够 ...

  4. 【Elasticsearch】Elasticsearch如何实现 SQL语句中 Group By 和 Limit 的功能

    1.概述 转载:https://elasticsearch.cn/article/629 有 SQL 背景的同学在学习 Elasticsearch 时,面对一个查询需求,不由自主地会先思考如何用 SQ ...

  5. 玩转SQL语句之group by 多字段分组查询与having子句,一篇解决你的疑惑!

    sql语句group by使用详解 group by的基本语法 基本语法 什么是分组查询(一个字段) 多个字段的分组查询 1.两个字段的分组查询 2.三个字段及N个字段进行分组查询 having子句的 ...

  6. group by 和 order by 的区别 + 理解过程

    order by 和 group by 的区别 order by 和 group by 的区别: 1,order by 从英文里理解就是行的排序方式,默认的为升序. order by 后面必须列出排序 ...

  7. sql语句中GROUP BY 和 HAVING的使用 count()

    在介绍GROUP BY 和 HAVING 子句前,我们必需先讲讲sql语言中一种特殊的函数:聚合函数,  例如SUM, COUNT, MAX, AVG等.这些函数和其它函数的根本区别就是它们一般作用在 ...

  8. mysql分页查询limit_MySQL查询语句(where,group by,having,order by,limit)

    Ⅰ where语句 -- 条件语句 where -- 条件判断 查询id值大于3,且小于5的记录 -- 字段>3 and 字段< 5; mysql 查询id值大于等于3,且小于等于5的记录 ...

  9. 查询limit_MySQL查询语句(where,group by,having,order by,limit)

    Ⅰ where语句 -- 条件语句 where -- 条件判断 查询id值大于3,且小于5的记录 -- 字段>3 and 字段< 5; mysql> select * from wo ...

最新文章

  1. RNN,LSTM,GRU简单图解:
  2. html 动态创建表格,jquery动态创建表格
  3. 分享一个多线程实现[冒泡][选择][二分法]排序的例子
  4. 2020年哪个pe启动盘干净好用_2020年电压力锅哪个牌子好用又安全?电压力锅什么样的品牌好?每月更新!...
  5. 2018/Province_Java_A/2/星期一
  6. linux设置光标位置,linux下光标定位和输出颜色设置
  7. Stack Overflow 2021开发者调查报告 - 数据库篇!
  8. JAVA环境变量JAVA_HOME、CLASSPATH、PATH设置详解
  9. L2-018. 多项式A除以B -PAT团体程序设计天梯赛GPLT
  10. [Oracle]Oracle表权限小结
  11. 【LeetCode】【字符串】题号:242. 有效的字母异位词
  12. JavaScript高级教程(函数进阶、闭包、正则表达式、ES6新增语法、新增扩展方法)
  13. Unity创建字体库给TextMeshPro
  14. endnote 参考文献加序号_EndNote插入文献序号排序混乱怎么破 | 科研动力
  15. 网站被挂马实用怎么解决的办法之一
  16. oracle挂载磁盘组,Oracleasm添加磁盘组
  17. python 制作 多种 词云
  18. 我的世界服务器末地文件在哪,我的世界:找不到末地城怎么办?巧用2个操作,就能瞬间找到!...
  19. 如何制定个人学习计划?
  20. 一个博弈游戏,据说智商130才看的懂

热门文章

  1. 集成测试 - 增量测试与非增量测试
  2. 奇虎聚客---2006最激动人心的互联网应用
  3. 当面对无法决定的选择时,我的思路和方案
  4. Wannafly挑战赛21 - B灯塔
  5. SpringCloud 必知的18道面试题
  6. 1200plc通过pn总线控制v90程序 此程序是关于西门子1200PLC以profernet方式式控制V90伺服的的功能块程序
  7. caj文件转换成word文档的软件
  8. 完全图(二分,图论)
  9. Spring Boot + Vue前后端分离项目,Maven自动打包整合
  10. 无人驾驶实战第二课--七月在线