74 mysql having 的实现

news2025/1/11 23:10:19

前言

这里 我们主要是 看一下 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 这边的查询 在一定的条件下增加了索引

 

 

完 

 

 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Google发布图像生成新工具Whisk:无需复杂提示词,使用图像和人工智能将想法可视化并重新混合

Whisk 是 Google Labs 的一项新实验,可使用图像进行快速而有趣的创作过程。Whisk不会生成带有长篇详细文本提示的图像,而是使用图像进行提示。只需拖入图像,即可开始创建。 whisk总结如下: Whisk 是 Google 实验室最新的生成图像实…

K8s Pod OOMKilled,监控却显示内存资源并未打满

1. 问题现象 pod一直重启,通过grafana查看,发现内存使用率并没有100%。 2. 排查过程 2.1 describe查看pod最新一次的状态 可以明显看到,最近一次的重启就是因为内存不足导致的。 2.2 describe 查看node节点状态 找到原因了,原来…

33.3K 的Freqtrade:开启加密货币自动化交易之旅

“ 如何更高效、智能地进行交易成为众多投资者关注的焦点。” Freqtrade 是一款用 Python 编写的免费开源加密货币交易机器人。它就像一位不知疲倦的智能交易助手,能够连接到众多主流加密货币交易所,如 Binance、Bitmart、Bybit 等(支…

vscode开启调试模式,结合Delve调试器调试golang项目详细步骤

1.前期准备 (1).在vs code中的扩展程序中搜索并安装Go扩展程序 (2).安装 Delve 调试器 go install github.com/go-delve/delve/cmd/dlvlatest (3).打开vs code的命令面板,输入Go: Install/Update Tools,并单击该命令执行,安装或更新Go语…

Postman接口测试03|执行接口测试、全局变量和环境变量、接口关联、动态参数、断言

目录 七、Postman 1、安装 2、postman的界面介绍 八、Postman执行接口测试 1、请求页签 3、响应页签 九、Postman的环境变量和全局变量 1、创建环境变量和全局变量可以解决的问题 2、postman中的操作-全局变量 1️⃣手动设置 2️⃣代码设置 3️⃣界面获取 4️⃣代…

Python Matplotlib教程-Matplotlib 多子图布局

Python Matplotlib 多子图布局 Matplotlib 是 Python 中最常用的数据可视化库,它提供了强大的功能来绘制不同类型的图表。在实际应用中,通常需要将多个图表绘制在同一个画布上,这就需要用到 多子图布局。本篇文章将详细介绍如何使用 Matplot…

【Java项目】基于SpringBoot的【校园新闻系统】

【Java项目】基于SpringBoot的【校园新闻系统】 技术简介:本系统使用采用B/S架构、Spring Boot框架、MYSQL数据库进行开发设计。 系统简介:主要包括二大功能模块,即用户功能模块和管理员功能模块。系统中的核心用户是管理员,管理员…

c++入门之 命名空间与输入输出

1、命名空间 1.1使用命名空间的原因 先看一个例子&#xff1a; #include <iostream>int round 0;int main() {printf("%d", round);return 0; }请问&#xff0c;这个程序能跑起来吗&#xff1f; 答案是否定的 原因是&#xff0c;当我们想创建一个全局变量 …

【网络安全渗透测试零基础入门】之XSS攻击获取用户cookie和用户密码(实战演示)

前言 大家好&#xff0c;我是demon 这是demon给粉丝盆友们整理的网络安全渗透测试入门阶段XSS攻击教程。 本阶段主要讲解XSS攻击获取用户cookie和用户密码。 喜欢的朋友们&#xff0c;记得给晓晓点赞支持和收藏一下&#xff0c;关注我&#xff0c;学习黑客技术。 简介 该…

HarmonyOS开发:ArkTS初识

ArkTS基本语法 ArkTS语言简介 ArkTS是鸿蒙生态的应用开发语言。基本语法风格与TypeScript&#xff08;简称TS&#xff09;相似&#xff0c;在TS的生态基础上进一步扩展&#xff0c;继承了TS的所有特性&#xff0c;是TS的超集。 基本语法概述 扩展能力 基础语法&#xff1a…

【YOLOv8杂草作物目标检测】

YOLOv8杂草目标检测 算法介绍模型和数据集下载 算法介绍 YOLOv8在禾本科杂草目标检测方面有显著的应用和效果。以下是一些关键信息的总结&#xff1a; 农作物幼苗与杂草检测系统&#xff1a;基于YOLOv8深度学习框架&#xff0c;通过2822张图片训练了一个目标检测模型&#xff…

【python A* pygame 格式化 自定义起点、终点、障碍】

- pip install pygame test.py(chatgpt版本) 空格键&#xff1a;运行 A* 算法。CtrlC 键&#xff1a;清空路径。CtrlS 键&#xff1a;保存当前地图到 map.json 文件。CtrlL 键&#xff1a;从 map.json 文件加载地图。 import pygame import json from queue import PriorityQ…

xfs扩容目录lvm

pve增加磁盘&#xff1a; -bash-4.2# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 50G 0 disk ├─sda1 8:1 0 1G 0 part /boot └─sda2 8:2 0 49G 0 part ├─centos-root 253:0 …

Pathview包:整合表达谱数据可视化KEGG通路

Pathview是一个用于整合表达谱数据并用于可视化KEGG通路的一个R包&#xff0c;其会先下载KEGG官网上的通路图&#xff0c;然后整合输入数据对通路图进行再次渲染&#xff0c;从而对KEGG通路图进行一定程度上的个性化处理&#xff0c;并且丰富其信息展示。&#xff08;KEGG在线数…

汽车免拆诊断 | 2007款保时捷Carrera S车行驶中发动机冷却液温度报警灯异常点亮

故障现象 一辆2007款保时捷Carrera S车&#xff0c;搭载3.8 L自然吸气发动机&#xff0c;累计行驶里程约为7.8万km。车主反映&#xff0c;车辆行驶一段距离后&#xff0c;组合仪表上的发动机冷却液温度报警灯异常点亮。为此&#xff0c;在其他维修厂已更换过节温器、发动机冷却…

【PPT解密】ppt只读文档怎么改成可编辑文档

PPT文档打开是只读模式&#xff0c;如何改成可编辑文档呢&#xff1f;这需要分几种情况来说&#xff0c;所以今天将介绍几种方法帮助PPT只读文档改为可编辑文档。 方法一&#xff1a; 我们可以先查看一下文件属性&#xff0c;属性中有只读属性&#xff0c;当我们打开文档之后…

[java基础-集合篇]优先队列PriorityQueue结构与源码解析

优先队列PriorityQueue 优先级队列表示为平衡二进制堆&#xff1a; queue[n] 的两个子级是 queue[2*n1] 和 queue[2*&#xff08;n1&#xff09;]。 注&#xff1a;左子节点index2*parentIndex1,右子节点index2*parentIndex2,源码中计算parent位置时就是这样反过来计算的 优…

ROS2+OpenCV综合应用--11. AprilTag标签码跟随

1. 简介 apriltag标签码追踪是在apriltag标签码识别的基础上&#xff0c;增加了小车车体运动的功能&#xff0c;控制车体从而使摄像头会保持标签码在视觉中间左右运动&#xff0c;在根据物体在摄像头成像近大远小的原理根据这一特性&#xff0c;从而实现标签码跟随功能。 2. 启…

matlab编写分段Hermite插值多项式

文章目录 原理使用分段Hermite插值多项式原因公式第一类的两个插值积函数第二类的两个插值积函数 例题法一法二 代码分段 Hermite 插值的思路&#xff1a;分段 Hermite 插值多项式的构造&#xff1a;MATLAB 实现代码&#xff1a;结果如图&#xff1a;注归一化变量的作用&#x…

小米路由器IPv6 功能使用指南

本文不限于多层路由使用IPv6 的情况&#xff0c;提供解决IPv6 无法获取的更硬核的方法&#xff0c;需要有ssh 工具。&#xff08;无安卓设备&#xff0c;测试环境win、mac、ios&#xff09; 首先明确一点&#xff0c;就是如果想让你的设备得到GUA 地址&#xff0c;即访问 6.i…