• 〖Python 数据库开发实战 - MySQL篇⑲〗- Having子句的使用


    万叶集
    🎉 隐约雷鸣,阴霾天空。 🎉
    🎉 但盼风雨来,能留你在此。 🎉


    前言
    ✌ 作者简介:渴望力量的哈士奇 ✌,大家可以叫我 🐶哈士奇🐶 ,一位致力于 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” 子句要和 “GROUP BY” 联合起来才能够使用,不能单独使用 “HAVING” 子句。接下来我们就看一看为什么要在分组中引入 “HAVING” 的语法。



    🐳 分组查询遇到的困难


    其实,引入 “HAVING” 子句也是出于一种无奈,因为有些条件查询在使用 “GROUP BY” 的时候并不能满足要求。就比如下面这个查询语句。

    查询部门平均底薪超过2000的部门的编号,按照正常的逻辑应该这样写,见下方 SQL:

    SELECT deptno
    FROM t_emp
    WHERE AVG(sal) >= 2000
    GROUP BY deptno;
    
    • 1
    • 2
    • 3
    • 4

    PS:从语法上来看,没有什么问题。但是执行的时候,一定会报错语法是有错误的。这又是怎么一回儿事儿呢?

    PS:这是因为 "WHERE" 子句的执行顺序优先级是高于 "GROUP BY" 的,一但 "WHERE" 子句中出现了聚合函数,那么 MySQL 根本就不知道这个聚合函数按照什么样的范围去统计汇总数值,所以说呢语法上就是有错误的。

    PS:只有在 "GROUP BY" 执行完了之后,聚合函数才能确定下来范围,然后统计出需要聚合计算的结果。所以上述的 SQL语句 错就错在了 WHERE 子句出现了聚合函数。


    那么如何解决这个问题呢?这个时候就该引入 “HAVING” 子句了。

    SELECT deptno
    FROM t_emp
    GROUP BY deptno HAVING AVG(sal);
    
    • 1
    • 2
    • 3

    就是因为 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 去掉。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7


    🐳 HAVING 子句的特殊用法


    在使用 "GROUP BY" 子句的时候,按照数字 "1" 分组。MySQL 会依据 "SELECT" 子句中的第一个列的字段进行分组,这是的 "HAVING" 子句也可以正常使用。

    SQL 语句演示案例如下:

    SELECT deptno, COUNT(*)
    FROM t_emp 
    GROUP BY 1 ;
    
    • 1
    • 2
    • 3

    SELECT deptno, COUNT(*)
    FROM t_emp 
    GROUP BY 1 
    HAVING deptno IN(10, 20);
    
    -- 正常情况下,如果不用 "HAVING" 子句的时候,我们是可以使用 "WHERE" 子句的。
    -- 虽然 "WHERE" 子句 与 "HAVING" 子句功能相近都是可以过滤筛选条件的,但是不推荐使用 "HAVING" 子句进行这样的条件过滤。
    -- 因为 "WHERE" 子句是先于 "GROUP BY" 子句去执行的,先筛选出一部分数据,然后再针对符合条件的数据去做分组、聚合的统计计算。
    -- 如此一来,数据量就变少了很多。但是如果将筛选条件写在 "HAVING" 子句里面,这个数据量在很大的时候,使用 "HAVING" 筛选是很不值得的。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    PS:所以说呢,"WHERE" 子句是不能够被 "HAVING" 替代的,引入 "HAVING" 子句的目的就是使用聚合函数和普通的数据进行条件判断的时候,必须使用 "HAVING" 子句,在其他情况下,该使用 "WHERE" 子句,还是使用 "WHERE" 子句的好。

  • 相关阅读:
    【Seata】04 - Seata TCC 模式 Demo 调用流程分析
    百度上海智能研发中心一面
    Android源码下载
    排序算法:选择排序(直接选择排序、堆排序)
    基于PHP的人才招聘网站设计
    Go2Shell安装在 Finder 中打开当前目录的终端窗口
    案例+图解带你一文读懂Canvas【2W字,建议收藏】
    数据结构复盘——第一章:绪论
    Vue 项目部署到GitHub Pages
    索引(3)
  • 原文地址:https://blog.csdn.net/weixin_42250835/article/details/126046069