74 mysql having 的实现

前言

这里 我们主要是 看一下 having 的相关实现 

having 经常是配合 group by 这边进行使用, 进行一个基于 group by 之后的结果的一个, 条件限定

我们这里 以最简单的 group by + having 来进行调试, 他会分为 两个阶段, 一个阶段是 group by 之后的结果输出到临时表, 另外一个阶段是基于这个临时表的一个 条件查询

然后 我们之后再来看一下 它的这边查询的一个 转换

 

 

测试用例

测试数据表如下 

CREATE TABLE `tz_test` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `field1` varchar(128) DEFAULT NULL,
  `field2` varchar(128) DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE KEY `field_1_2` (`field1`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8

 

测试数据如下 

ba5051582ab6ccc5d41ab1995f8d8e48.png

 

测试 sql 以及执行结果如下 

7a6235f99c8627d900e62e97160268da.png

 

 

group by 的查询

这是 group by 的迭代的处理 

这里是第一条记录, field2 为 1, 目前的 count(*) 为 1, 然后 写入数据到 临时表  

141c5ada81ca65c7a526533879dd72d3.png

 

数据写出到 临时表 “/tmp/#sql_16fb4_0”

43a7b37819ca5aabcaaa35a4dafa0f29.png

 

然后接着 会向该临时文件添加 (2, 1), (3, 1) , (4, 1) , (5, 1) , (6, 1) , (7, 1) , (8, 1) , (9, 1) , (10, 1)

320e7cdce15c5e9ba54cd955eebfff80.png

 

然后最后一条记录, field2 为 1 的记录已经存在, 为 (1, 1), 这里会进行 merge, 将新的 (1, 2) 替换掉原来的 (1, 1)

bafef1a8fa2de34318e3093218439ed1.png

 

 

having 条件的过滤

having 的过滤是在 基于 group by 的临时表进行的过滤 

fe471f64e539b31943fe53e1078a11b3.png

 

然后 后面的比较如下, 右值为 我们输入的常量 2, 左值为我们临时表的 keyField 值为 count(*)

d7123bbf57c18f02463d9c7b25478c23.png

 

然后 外层就是遍历临时表的核心处理

如果不满足 having 的条济, 则跳过, 否则 写出到临时文件 执行下一个阶段的处理

d8faa2a699712851389a79f52eab618a.png

 

 

having 条件查询更新为子查询

假设我们将 上面查询更新为如下子查询, 我们来调试一下 这个过程

select * from (
select field2, count(*) as count from tz_test group by field2
) as tmp 
where tmp.count = 2;

 

这个过程会比 上面的直接 group by + having 会更加复杂一些 

这里是 group by 之后的结果输出到一个临时表 “/tmp/#sql16fb4_1”

85d4a13db978d64a6548befa19d6d0c7.png

 

然后外层是查询 tz_test 做 group by 之后将数据输出到临时表 “/tmp/#sql16fb4_1”

d7975ed91642d6d2d514e16aebfc5b00.png

 

 

然后更外层是我们的 tmp 临时表, 它的数据来源是临时表 “/tmp/#sql16fb4_1”

678c26531ddff5bddb2cb747c1b12ad1.png

 

整体数据传输流程如下 

tz_test 做 group by 之后将结果输出到临时表 “/tmp/#sql16fb4_1” 的流程 

27a13f8f76e79417217e739d2c7a39f5.png

 

临时表 “/tmp/#sql16fb4_1” 传输到 临时表tmp 的过程, 可以看到源表为 临时表 “/tmp/#sql16fb4_1”

fbc5b3eb6187b98db4ceb84f9cc0da7b.png

 

目标表为 临时表tmp 

66a4dd359371e38fb1b70d4c3825122b.png

 

然后查询的时候 field2 上面创建了索引, 直接根据 索引进行查询

然后这里的 索引查询的过程中就已经执行了 “where tmp.count = 2;” 的逻辑处理了 

766c4177ab7d2830dbd2a7af34e43ff5.png

 

 

综上 转换为了子查询之后, 多了一步 数据的从临时表 到 临时表tmp 的传输

但是 临时表tmp 这边的查询 在一定的条件下增加了索引

 

 

完 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/951976.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PyCharm+RobotFramework框架实现UDS自动化测试——(一)python-can 库的安装与环境配置

从0开始学习CANoe使用 从0开始学习车载测试 相信时间的力量 星光不负赶路者,时光不负有心人。 文章目录 1. 概述2.安装 python-can 库—基于pycharm在对应的工程下3. 在任意盘中安装环境4. 导入 can 模块语法5. 配置 CAN 接口6.CANoe设备连接语法 1. 概述 本专栏主…

Java Spring Boot实现基于URL + IP访问频率限制

点击下载《Java Spring Boot实现基于URL IP访问频率限制(源代码)》 1. 引言 在现代 Web 应用中,接口被恶意刷新或暴力请求是一种常见的攻击手段。为了保护系统资源,防止服务器过载或服务不可用,需要对接口的访问频率进行限制。本文将介绍如…

从CentOS到龙蜥:企业级Linux迁移实践记录(系统安装)

引言: 随着CentOS项目宣布停止维护CentOS 8并转向CentOS Stream,许多企业和组织面临着寻找可靠替代方案的挑战。在这个背景下,龙蜥操作系统(OpenAnolis)作为一个稳定、高性能且完全兼容的企业级Linux发行版&#xff0…

现代企业架构白皮书(可以在线阅读完整PDF文件)

数据架构元模型综述 数据架构的内容元模型包括“结构”、“端口”两个部分,如下图所示: 结构部分用来对数据模型、数据处理建模,其中包括数据对象、数据组件 端口部分用来对数据模型的边界建模,其中包括数据服务 数据架构元模型…

【面试题】技术场景 7、定位系统瓶颈

系统瓶颈定位方法总述 面试官询问如何快速定位系统瓶颈,旨在考察线上调试经验。主要方法包括: 压测:在项目上线前找出系统瓶颈并修复。监控工具或链路追踪工具:项目上线后用于实时监控或评测找瓶颈。Arthas(原阿尔萨…

某漫画网站JS逆向反混淆流程分析

文章目录 1. 写在前面1. 接口分析2. 反混淆分析 【🏠作者主页】:吴秋霖 【💼作者介绍】:擅长爬虫与JS加密逆向分析!Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致力于Pyth…

124.【C语言】数据结构之快速排序的小区间优化和非递归的解决方法

目录 1.小区间优化 测试代码 运行结果 2.非递归的解决方法(重要!) 递归产生的问题 一般来说,递归改非递归有两种方法 算法分析 递归产生的二叉树 栈的示意图 先写代码框架 再填写细节部分 1.小区间优化 回顾121.【C语言】数据结构之快速排序(未优化的Hoare排序存在…

赛车微型配件订销管理系统(源码+lw+部署文档+讲解),源码可白嫖!

摘要 赛车微型配件行业通常具有产品多样性、需求不确定性、市场竞争激烈等特点。配件供应商需要根据市场需求及时调整产品结构和库存,同时要把握好供应链管理和销售渠道。传统的赛车微型配件订销管理往往依赖于人工经验和简单的数据分析,效率低下且容易…

Java一个简单的反弹动画练习

文章目录 说明代码详解创建窗体代码创建绘图板创建线程 运行结果完整代码 说明 做了一个小球和星型做反弹动画的窗体作为练习,分享给大家,为了方便和我一样的小白可以看的比较明白,所以尽量详细的标注了注释,希望能帮到同样在学习…

基于YOLOv8的车辆跟踪、车速计算和车辆统计应用

1、环境搭建 通过conda创建一个python≥3.8环境,激活环境后安装ultralytics8.2、python-opencv、shapely>2.0.0: conda create -n yolov8 python3.10 conda activate yolov8 pip install ultralytics8.2 pip install python-opencv pip install shapely>2.0…

如何提升scrapy的效率

如何提升scrapy的效率 在settings配置文件中修改CONCURRENT_REQUESTS 100 scrapy默认开启的线程数量为32个,这样设置可以使其线程数量为100个在运行scrapy时,会有大量的日志信息输出,为了减少cpu的使用率,可以设置log输出信息为WORNING或者…

网络安全 | 网络安全法规:GDPR、CCPA与中国网络安全法

网络安全 | 网络安全法规:GDPR、CCPA与中国网络安全法 一、前言二、欧盟《通用数据保护条例》(GDPR)2.1 背景2.2 主要内容2.3 特点2.4 实施效果与影响 三、美国《加利福尼亚州消费者隐私法案》(CCPA)3.1 背景3.2 主要内…

HarmonyOS(ArkUI框架介绍)

ArkUI框架介绍 ArkUI简介 基本概念 UI: 即用户界面。开发者可以将应用的用户界面设计为多个功能页面,每个页面进行单独的文件管理,并通过页面路由API完成页面间的调度管理如跳转、回退等操作,以实现应用内的功能解耦。 组件&…

EasyExcel(二)导出Excel表自动换行和样式设置

EasyExcel(一)导出Excel表列宽自适应 背景 在上一篇文章中解决导出列宽自适应,然后也解决了导出列宽不可超过255的问题。但是实际应用场景中仍然会有导出数据的长度超过列宽255。这时导出效果就会出现如下现象: 多出列宽宽度的内容会浮出来,影响后边列数据的显示。 解决…

记录一下vue2项目优化,虚拟列表vue-virtual-scroll-list处理10万条数据

文章目录 封装BrandPickerVirtual.vue组件页面使用组件属性 select下拉接口一次性返回10万条数据,页面卡死,如何优化??这里使用 分页 虚拟列表(vue-virtual-scroll-list),去模拟一个下拉的内容…

迅为RK3568开发板篇OpenHarmony配置HDF驱动控制LED-配置创建私有配置文件

接 下 来 新 建 vendor/hihope/rk3568/hdf_config/khdf/topeet/topeet_config.hcs 文 件 ,topeet_config.hcs 为驱动私有配置文件,用来填写一些驱动的默认配置信息。HDF 框架在加载驱动时,会获取相应的配置信息并将其保存在 HdfDeviceObject …

nginx负载均衡-基于端口的负载均衡(一)

注意: (1) 做负载均衡技术至少需要三台服务器:一台独立的负载均衡器,两台web服务器做集群 一、nginx分别代理后端web1 和 web2的三台虚拟主机 1、web1(nginx-10.0.0.7)配置基于端口的虚拟主机 [rootOldboy extra]# …

金融项目实战 02|接口测试分析、设计以及实现

目录 ⼀、接口相关理论 二、接口测试 1、待测接口:投资业务 2、接口测试流程 3、设计用例理论 1️⃣设计方法 2️⃣工具 4、测试点提取 5、测试用例(只涉及了必测的) 1️⃣注册图⽚验证码、注册短信验证码 2️⃣注册 3️⃣登录 …

vue3使用vue3-video-play播放m3u8视频

1.安装vue3-video-play npm install vue3-video-play --save2.在组件中使用 import vue3-video-play/dist/style.css; import VideoPlay from vue3-video-play;// 视频配置项 const options reactive({src: https://test-streams.mux.dev/x36xhzz/x36xhzz.m3u8, //视频源mute…

Redis:数据类型

1. 字符串(String) 简介 概念:这是最简单的数据类型,可以存储字符串、整数或浮点数。特点:支持原子操作,如递增和递减数值。 示例 # 设置一个键值对 SET mykey "Hello, Redis!"# 获取该键的值…