| 万叶集 |
|---|
| 隐约雷鸣,阴霾天空。 |
| 但盼风雨来,能留你在此。 |
前言:
✌ 作者简介:渴望力量的哈士奇 ✌,大家可以叫我 哈士奇 ,一位致力于 TFS - 全栈 赋能的博主 ✌
CSDN博客专家认证、新星计划第三季全栈赛道 top_1 、华为云享专家、阿里云专家博主
如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步
人生格言:优于别人,并不高贵,真正的高贵应该是优于过去的自己。
如果感觉博主的文章还不错的话,还请关注、点赞、收藏三连支持一下博主哦
专栏系列(点击解锁) 学习路线(点击解锁) 知识定位 Python全栈白皮书 零基础入门篇 以浅显易懂的方式轻松入门,让你彻底爱上Python的魅力。 语法进阶篇 主要围绕多线程编程、正则表达式学习、含贴近实战的项目练习 。 自动化办公篇 实现日常办公软件的自动化操作,节省时间、提高办公效率。 自动化测试实战篇 从实战的角度出发,先人一步,快速转型测试开发工程师。 数据库开发实战篇 掌握关系型与非关系数据库知识,提升数据库实战开发能力。 爬虫入门与实战 更新中 数据分析篇 更新中 前端入门+flask 全栈篇 更新中 django+vue全栈篇 更新中 拓展-人工智能入门 更新中 网络安全之路 踩坑篇 记录学习及演练过程中遇到的坑,便于后来居上者 网安知识扫盲篇 三天打鱼,不深入了解原理,只会让你成为脚本小子。 vulhub靶场漏洞复现 让漏洞复现变得简单,让安全研究者更加专注于漏洞原理本身。 shell编程篇 不涉及linux基础,最终案例会偏向于安全加固方向。 [待完结] WEB漏洞攻防篇 2021年9月3日停止更新,转战先知社区等安全社区及小密圈 渗透工具使用集锦 2021年9月3日停止更新,转战先知社区等安全社区及小密圈 点点点工程师 测试神器 - Charles 软件测试数据包抓包分析神器 测试神器 - Fiddler 一文学会 fiddle ,学不会倒立吃翔,稀得! 测试神器 - Jmeter 不仅是性能测试神器,更可用于搭建轻量级接口自动化测试框架。 RobotFrameWork Python实现的自动化测试利器,该篇章仅介绍UI自动化部分。 Java实现UI自动化 文档写于2016年,Java实现的UI自动化,仍有借鉴意义。 MonkeyRunner 该工具目前的应用场景已不多,文档已删,为了排版好看才留着。
文章目录
- 分组查询遇到的困难
- HAVINg 子句的用途
- HAVINg 子句的特殊用法
该章节我们来学习 “HAVINg” 子句,这个 “HAVINg” 子句要和 “GROUP BY” 联合起来才能够使用,不能单独使用 “HAVINg” 子句。接下来我们就看一看为什么要在分组中引入 “HAVINg” 的语法。
分组查询遇到的困难
其实,引入 “HAVINg” 子句也是出于一种无奈,因为有些条件查询在使用 “GROUP BY” 的时候并不能满足要求。就比如下面这个查询语句。
查询部门平均底薪超过2000的部门的编号,按照正常的逻辑应该这样写,见下方 SQL:
SELECt deptno FROM t_emp WHERe AVG(sal) >= 2000 GROUP BY deptno;PS:从语法上来看,没有什么问题。但是执行的时候,一定会报错语法是有错误的。这又是怎么一回儿事儿呢?
PS:这是因为 "WHERe" 子句的执行顺序优先级是高于 "GROUP BY" 的,一但 "WHERe" 子句中出现了聚合函数,那么 MySQL 根本就不知道这个聚合函数按照什么样的范围去统计汇总数值,所以说呢语法上就是有错误的。
PS:只有在 "GROUP BY" 执行完了之后,聚合函数才能确定下来范围,然后统计出需要聚合计算的结果。所以上述的 SQL语句 错就错在了 WHERe 子句出现了聚合函数。
那么如何解决这个问题呢?这个时候就该引入 “HAVINg” 子句了。
SELECt deptno FROM t_emp GROUP BY deptno HAVINg AVG(sal);就是因为 WHERe 子句在 GROUP BY 子句之前,这时候 WHERe 子句的聚合函数不知道按照什么范围去统计数据,所以必须要将 WHERe 子句的聚合函数拿走,放在 GROUP BY 函数后面等待得出统计范围之后,再来计算统计数据。
PS:"HAVINg 子句是紧跟着 "GROUP BY" 使用的,它不能独立使用。在使用 "HAVINg" 进行聚合函数统计的时候,"GROUP BY" 已经确定好统计范围了。
HAVINg 子句的用途
“HAVINg” 子句与 “WHERe” 子句的用途差不多,也是用来做条件筛选的。只是 "HAVINg 子句是写在 “GROUP BY” 后面使用的,“GROUP BY” 执行完之后, “HAVINg” 子句才会执行,所以 “HAVINg” 子句中我们就可以使用 聚合函数 做条件判断了。
SQL 语句 "GROUP_CONCAT" 示例如下:(查询每个部门中,1982年以后入职的员工超过2个人的部门编号)
SELECt deptno FROM t_emp WHERe hiredate >= "1982-01-01" GROUP BY deptno HAVINg COUNT(*) >= 2 ORDER BY deptno ASC; -- 结果集如果是无序的,可以使用 ORDER BY 进行排序,如果是有序的,也可以将 ORDER BY 去掉。
HAVINg 子句的特殊用法
在使用 "GROUP BY" 子句的时候,按照数字 "1" 分组。MySQL 会依据 "SELECt" 子句中的第一个列的字段进行分组,这是的 "HAVINg" 子句也可以正常使用。
SQL 语句演示案例如下:
SELECT deptno, COUNT(*) FROM t_emp GROUP BY 1 ;
SELECt deptno, COUNT(*) FROM t_emp GROUP BY 1 HAVINg deptno IN(10, 20); -- 正常情况下,如果不用 "HAVINg" 子句的时候,我们是可以使用 "WHERe" 子句的。 -- 虽然 "WHERe" 子句 与 "HAVINg" 子句功能相近都是可以过滤筛选条件的,但是不推荐使用 "HAVINg" 子句进行这样的条件过滤。 -- 因为 "WHERe" 子句是先于 "GROUP BY" 子句去执行的,先筛选出一部分数据,然后再针对符合条件的数据去做分组、聚合的统计计算。 -- 如此一来,数据量就变少了很多。但是如果将筛选条件写在 "HAVINg" 子句里面,这个数据量在很大的时候,使用 "HAVINg" 筛选是很不值得的。PS:所以说呢,"WHERe" 子句是不能够被 "HAVINg" 替代的,引入 "HAVINg" 子句的目的就是使用聚合函数和普通的数据进行条件判断的时候,必须使用 "HAVINg" 子句,在其他情况下,该使用 "WHERe" 子句,还是使用 "WHERe" 子句的好。



