49 mysql 子查询 加 group by 产生的奇怪现象

news2024/11/16 13:22:49

前言

这里要提到的是一个 之前碰到的一个 很令人诧异的查询, 主要是 和 group 查询有关系 

查询如下, 按照常规理解, “select id from t_user_02 where name = 'jerry' group by age

” 会返回 两条数据, 然后 整个查询 会查询出两条数据

但是 结果很令人差异, 查询出了 四条数据

select *, 2, 2, 2 from t_user where id in (
select id from t_user_02 where name = 'jerry' group by age
);

 

测试数据表如下, t_user 和 t_user_02 完全一样, t_user_02 是由 t_user 复制而来 

CREATE TABLE `t_user` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(24) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8

 

测试数据如下 

9069512a1a3038c9530480fa1c04bffb.png

 

查询结果如下 

1ff0289983ba2d33eb121377d2d865bb.png 

 

 

正常实现业务的 sql 执行

对应的能够正确 实现业务的查询如下

select *, 2, 2, 2 from t_user where id in (
select max(id) from t_user_02 where name = 'jerry' group by age
);

 

这里整个流程 会分为 几个部分

1.执行 ” select age, max(id) from t_user_02 where name = 'jerry' group by age” 将结果输入临时表 tmp1
2.从 tmp1 中抽取 max(id) 字段, 将结果 汇总成为 tmp2 
3.执行 “select *, 2, 2, 2 from t_user where id in $idList” 的条件查询 
4.输出 “select *, 2, 2, 2 from t_user where id in $idList” 的执行结果 

 

这里查询的主表是 t_user, 然后 这里是来 判断 id in ($idList) 的条件的地方 触发了

“select max(id) from t_user_02 where name = 'jerry' group by age” 的查询, 以及条件处理 

3b43c8f4c022a6c6d68756e68d0549b7.png

 

 

子查询的执行1 

子查询这边的执行 具体分成了两个阶段 

第一个 qup_tab 查询对应于 “select age, max(id) from t_user_02 where name = 'jerry' group by age”

第二个 qup_tab 查询对应于 “select max(id) from (select age, max(id) from t_user_02 where name = 'jerry' group by age) as tmp”

3f46586b2f65b12038bcc8c90b7bde1e.png

 

获取 max(id) 列作为 临时表2 

b87545f03fccb54fe3c6db6d5244d752.png 

查询具体的数据表 只会执行一次, 持久化到临时表 tmp1 然后 后面是查询 临时表 tmp1 将 max(id) 列输出到 临时表 tmp2  

54e504534f17e1192049c44819b69757.png 

查询 t_user_02 的 “where name = 'jerry'”

923dcad274eb1e3c411e74d2870c5d36.png 

执行 group by 和 merge 处理如下, 对应于 “select max(id)” + “group by age”

67acccebc4a70ad260db5d9f1bd2839b.png 

这里是具体的数据调整的地方 

ba97e181e1c60a88cb76cd1699f6c70d.png 

数据更新 内容大致如下, 原来 age 121 对应的 max(id) 为 3, 如今更新为 5

最终 临时表中会有两条记录 ”age 121 -> max(id) 5”, ”age 21 -> max(id) 6”

d8965794c19acc96c0a9228c1beb8d6d.png

 

临时表 tmp1 的名字 

4a4773708ade8e45a0292a247b42ae52.png 

 

子查询的执行2

从 临时表 tmp1 中迭代记录, 这里是基于 上面的 tmp1 的查询结果进行迭代 

79df2f2a72de620c50cb08bfb17cd155.png

 

将 “id 6” 输出到 临时表 tmp2

8ee3fc6ae27d6d8a572310f8d8f25299.png 

将 “id 5” 输出到 临时表 tmp2

c210f04a5ea4c60966c66fdcea272c2d.png 

 

主表的条件判断

这边第一个操作数为 t_user.id, 右侧操作数为 上面子查询临时表 

1992f56efb978d45f6dd08a8098858e5.png

 

显示根据 待查主键 1, 查询临时表 

如果查询到, 则返回 true, 否则 返回 false 

2e16b95aa9b4ab4e3a0c1a97cde8387c.png

 

在临时表中查询到了 id 为 5

7ed99b98315b447be7f02db7008149f3.png 

下游的 比较 t_user 中当前行的 id 和 临时表中查询到的 id 的比较, 判断 是否相同

cdcaeff4d4e8825d4799b879d897da65.png 

 

主表中匹配到的结果的输出 

这里是 id 为 5 的记录的输出 

a32f8abc48a5d1dbcd13960bce675102.png

 

这里是 id 为 6 的记录的输出 

c1ed5426e4792528c07b2311ce984c33.png 

 

异常的 sql 执行 

我们这里的 问题sql查询如下

select *, 2, 2, 2 from t_user where id in (
select id from t_user_02 where name = 'jerry' group by age
);

 

从结果上来看 这个查询 是等价于

select *, 2, 2, 2 from t_user where id in (
select id from t_user_02 where name = 'jerry' 
);

 

主驱动表是 t_user_02, 基于 row_search_mvcc 遍历 t_user_02

a8c77208eb0ffc32ccf27a31e1024ab7.png

 

 

基于主键 来遍历 t_test, 这就是一个 典型的基于主键的 join 或者 基于主键in的子查询 

至于 为什么会有这个转换?, 这里暂不深究, 应该就是在 解析的时候进行的处理

74153fd826bb655e0a6d796548840868.png

 

 

完 

 

 

 

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

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

相关文章

华为云全域Serverless技术创新:全球首创通用Serverless平台被ACM SIGCOMM录用

华为开发者大会2024(HDC 2024)在东莞松山湖圆满结束,期间华为云主办的“全域Serverless时代:技术创新引领,赋能行业实践”专题论坛,向广大开发者传递了Serverless领域的前沿思考和实践,现场座无…

CVE-2023-33440详解

一.访问url http://eci-2zef9bcht3lq36hkwyoh.cloudeci1.ichunqiu.com/ 二.目录扫描 http://eci-2zef9bcht3lq36hkwyoh.cloudeci1.ichunqiu.com/ 三.拼接访问/login.php 四.抓包构造数据包 发给repeter 复制过去这几个位置都有空格,要删除掉,Referer和…

基于单片机的空调红外遥控器设计

【摘要】 本文基于单片机AT89C51、利用红外遥控发射技术设计了一款空调红外遥控器。对其系统结构框架、硬件部分等内容进行介绍,最后通过系统仿真验证设计的正确性和有效性。 【关键词】 遥控技术;单片机;红外 1.引言 远程控制技术指的是对…

DC系列靶场---DC 5靶场的渗透测试

DC-5渗透测试 信息收集 地址探测 使用arp-scan对目标主机进行地址探测 arp-scan -l -I eth0 目标主机IP地址为172.30.1.132 Nmap扫描 使用Nmap对目标主机进行端口扫描 nmap -sS -sV -T4 -p- -O 172.30.1.132//-sS Nmap默认扫描类型,SYS的秘密扫描//-sV 服务…

可用性测试:提升用户体验的关键

目录 前言1. 可用性测试的概念1.1 可用性测试的特点1.2 可用性测试的类型 2. 可用性测试的主要作用2.1 发现用户需求2.2 识别可用性问题2.3 提高用户满意度 3. 可用性测试在整个测试过程中的地位3.1 可用性测试与功能测试的关系3.2 可用性测试与性能测试的关系3.3 可用性测试与…

Java | Leetcode Java题解之第326题3的幂

题目: 题解: class Solution {public boolean isPowerOfThree(int n) {return n > 0 && 1162261467 % n 0;} }

鸿蒙(API 12 Beta2版)NDK开发【HarmonyOS ABI】硬件兼容性

HarmonyOS系统支持丰富的设备形态,支持多种架构指令集,支持多种操作系统内核;为了应用在各种HarmonyOS设备上的兼容性,本文定义了"OHOS" ABI(Application Binary Interface)的基础标准&#xff0…

《Milvus Cloud向量数据库指南》——高可用黄金标准:深入解析与业务策略考量

高可用黄金标准:深入解析与业务策略考量 在信息技术飞速发展的今天,高可用性(High Availability, HA)已成为衡量企业IT系统性能与稳定性的关键指标之一。它不仅仅关乎技术层面的优化与配置,更是企业保障业务连续性、提升客户体验、增强市场竞争力的重要基石。尽管高可用性…

基于Java中的SSM框架实现在线音乐网站系统项目【项目源码+论文说明】

基于Java中的SSM框架实现在线音乐网站系统演示 摘要 本文讲述了使用JSP语言及HTML5语言及MySql数据库技术开发的音乐网站的设计与实现。本文所讲的JSP音乐系统是通过所学的知识创办一个类似于QQ音乐或者酷狗音乐性质的网站平台,使所有对国内外音乐欣赏感兴趣的人都…

未授权访问漏洞合集

今天我们来开一个新的坑,未授权访问漏洞,以后我会慢慢更新,大家可以持续跟进一下,谢谢大家! 未授权访问可以理解为需要安全配置或权限认证的地址、授权页面存在缺陷,导致其他用户可以直接访问,从…

卷积神经网络 - 结构化输出篇

序言 卷积神经网络( CNN \text{CNN} CNN)作为深度学习领域的重要分支,凭借其强大的特征提取与学习能力,在图像和视频处理领域取得了显著成就。其结构化输出的特性,更是为复杂任务的解决提供了有力支持。本文旨在简要概…

高德地图API-批量获取位置信息的经纬度

我们会遇到一些需要批量把地址数据转换成坐标的问题,一个个查的话通常会比较麻烦,那有没有比较方便的方法呢,我们可以利用高德的地理编码/逆地理编码 API功能, 通过 HTTP/HTTPS 协议访问远程服务的接口,提供结构化地址…

渗透课程练习

第一步进入网站软件,启动Apache和Mysql,这里出了点小插曲,电脑自身的mysl如果没有停止运行就无法启动mysql,找到“服务”后进入寻找mysql停止运行。 第一关 get传参浏览器中输入?id1 创建价格表 修改php的文件后重新输…

MySQL 5.7使用 GTID 和 Binlog高可用方案

文章目录 介绍GTID和Binlog的关系GTID(Global Transaction ID)Binlog(二进制日志) MySQL5.7基于yum搭建安装 MySQL初始化并设置远程登录密码 配置基于GTID的复制模式第一台主服务器配置主服务器配置启动从服务 第二台主服务器配置…

【Linux学习】文件系统 - 第三篇

🍑个人主页:Jupiter. 🚀 所属专栏:Linux从入门到进阶 欢迎大家点赞收藏评论😊 目录 🦅重定向原理以及实现🐱dup2系统调用实现重定向。🎈dup2 系统调用🍑在自定义shell中实…

MM 10 -采购- 标准采购订单

思维导图 说明 采购订单页面介绍 抬头 支付、开票: 付款条件 文本: 机构数据: 其余sheet不常用 行项目 物料 数量 交货日期 价格 :信息记录带出来 工厂 行项目明细 物料 供应商物料号 供应商子范围: 批次&a…

PXE安装配置(rhel7)

实验需求: rhel7 虚拟机 所需软件安装: sudo yum install -y dhcp tftp-server httpd syslinux system-config-kickstart 启动: system-config-kickstart 制作ks文件 注意:File----Save保存一下 打开root下的ks.cfg在分区信…

python:将 NWPU_VHR-10 遥感目标检测数据集转换成 YOLO 格式

作者:CSDN _养乐多_ 本文将介绍将 NWPU_VHR-10 遥感目标检测数据集转换成 YOLO 格式的 python 脚本。 文章目录 一、数据集介绍1.1 数据集下载1.2 数据集介绍1.3 数据格式 二、格式转换三、完整代码 一、数据集介绍 1.1 数据集下载 https://opendatalab.com/Ope…

GRU门控循环单元【数学+图解】

文章目录 1、简介2、门控机制3、公式4、图解GRU4.1、重置门和更新门4.2、候选隐藏状态和隐藏状态⭐ 5、LSTM与GRU的对比6、应用7、训练技巧 🍃作者介绍:双非本科大三网络工程专业在读,阿里云专家博主,专注于Java领域学习&#xff…

MATLAB车道线检测系统

研究了汽车辅助驾驶系统中的计算机视觉问题 . 一方面 , 用小波变换对高速公路上的道路边缘进行检测 ; 另一方面 , 利用灰度以及几何特征实时跟踪和检测车道边缘 , 通过建立道路边缘模型 , 采用数据拟合的方法确定边界轨迹方程 , 从而估算出公路的延伸方向 , 实现汽车的自动防偏…