mysql-的sql是先分组还是先排序?
一、实验准备
实验对象:mysql5.7.36-log
实验环境:
1、Microsoft Windows 版本21H2(操作系统内部版本19044.2006)
2、一张有一个字段可供排序有一个字段可供分组的表
二、实验过程
1、执行只有排序,未分组的的sql
select guid,ModifiedTime from mesdatalog where MachCode='OP15' -- group by MachCode
order by ModifiedTime desc;
得到下面的结果:
guid ModifiedTime
135 2022/11/6 8:29:00
130 2022/11/1 8:29:00
125 2022/10/27 8:29:00
120 2022/10/22 8:29:00
115 2022/10/17 8:29:00
2、执行即排序又分组的sql
select guid,ModifiedTime from mesdatalog where MachCode='OP15' group by MachCode
order by ModifiedTime desc;
得到下面的结果:
guid ModifiedTime
115 2022/10/17 8:29:00
3、可初步看出在"执行即排序又分组的sql"中,先执行的分组再执行的排序。
4、多查几条验证
① 执行只有排序,未分组的的sql
select MachCode,guid,ModifiedTime from mesdatalog where MachCode in ('OP15','OP14','OP13','OP12') -- group by MachCode
order by ModifiedTime desc;
MachCode guid ModifiedTime(如果下面②得到的不是粗体标识的数据,则证明上面我们得出的结论)
OP15 135 2022/11/6 8:29:00
OP14 134 2022/11/5 8:29:00
OP13 133 2022/11/4 8:29:00
OP12 132 2022/11/3 8:29:00
OP15 130 2022/11/1 8:29:00
OP14 129 2022/10/31 8:29:00
OP13 128 2022/10/30 8:29:00
OP12 127 2022/10/29 8:29:00
OP15 125 2022/10/27 8:29:00
OP14 124 2022/10/26 8:29:00
OP13 123 2022/10/25 8:29:00
OP12 122 2022/10/24 8:29:00
OP15 115 2022/10/17 8:29:00
OP14 114 2022/10/16 8:29:00
OP13 113 2022/10/15 8:29:00
OP12 112 2022/10/14 8:29:00
② 执行即排序又分组的sql
select MachCode,guid,ModifiedTime from mesdatalog where MachCode in ('OP15','OP14','OP13','OP12') group by MachCode
order by ModifiedTime desc;
MachCode guid ModifiedTime
OP15 115 2022/10/17 8:29:00
OP14 114 2022/10/16 8:29:00
OP13 113 2022/10/15 8:29:00
OP12 112 2022/10/14 8:29:00
③ 可看出,上面的结论3得出的结论成立,即:在mysql(版本5.7.36-log)中执行型如 select 字段 from 表 where 条件 group by 字段 by 字段;
即排序又分组的sql中,先执行的分组再执行的排序。
三、实验结论:
在mysql(版本5.7.36-log)中执行型如 select 字段 from 表 where 条件 group by 字段 by 字段;
即排序又分组的sql中,先执行的分组再执行的排序。
拓展:
1、mysql 先排序后分组的写法:
① 开始我试了下:select MachCode,guid,ModifiedTime from (select * from mesdatalog where MachCode in ('OP15','OP14','OP13','OP12') order by ModifiedTime desc)a group by MachCode;
发现不行,结果如下:
MachCode GUID ModifiedTime
OP12 112 2022/10/14 8:29:00
OP13 113 2022/10/15 8:29:00
OP14 114 2022/10/16 8:29:00
OP15 115 2022/10/17 8:29:00
② 上网查找到一种方式,先用group_concat函数来获取用时间排序后的主键,例如下面:
select group_concat(guid order by ModifiedTime desc) as guid
from mesdatalog where MachCode in ('OP15','OP14','OP13','OP12')
group by MachCode
结果如下:
guid
132,127,122,117,112
133,128,123,118,113
134,129,124,119,114
135,130,125,120,115
③ 所以mysql 先排序后分组的sql可写成:
select a.machcode,a.guid,a.ModifiedTime
from mesdatalog a inner join
(select substring_index(group_concat(guid order by ModifiedTime desc),',',1)as guid
from mesdatalog where MachCode in ('OP15','OP14','OP13','OP12')
group by MachCode) b
on b.guid=a.guid
结果如下:
machcode guid ModifiedTime
OP12 132 2022/11/3 8:29:00
OP13 133 2022/11/4 8:29:00
OP14 134 2022/11/5 8:29:00
OP15 135 2022/11/6 8:29:00
本文来自博客园,作者:꧁执笔小白꧂,转载请注明原文链接:https://www.cnblogs.com/qq2806933146xiaobai/p/16787013.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
2021-10-13 mssql取YYYY-MM-dd HH:mm:ss格式的日期
2021-10-13 C#-sql语句规范