【MySQL系列】SQL 分组统计与排序

csdn

博客目录

    • 引言
    • 一、基础语法解析
    • 二、GROUP BY 的底层原理
    • 三、ORDER BY 的排序机制
    • 四、NULL 值的处理策略
    • 五、性能优化建议
    • 六、高级变体查询

引言

在现代数据分析和数据库管理中,分组统计是最基础也是最核心的操作之一。无论是业务报表生成、用户行为分析还是系统性能监控,我们经常需要按照某个字段对数据进行分组,然后计算每组的记录数量或其他聚合值。

一、基础语法解析

让我们首先分析文章开头给出的基础 SQL 查询语句:

SELECTnode_execution_id,COUNT(*) AS count
FROMpublic.workflow_node_executions
GROUP BYnode_execution_id
ORDER BYcount DESC;

这个查询由几个关键部分组成:

  1. SELECT 子句:指定要查询的列和聚合函数。这里选择了 node_execution_id 列和 COUNT(*) 聚合函数,后者会计算每组的行数,并使用 AS 关键字将结果列命名为 count

  2. FROM 子句:指定数据来源的表,这里是 public.workflow_node_executionspublic 是模式名(schema),在多租户数据库环境中特别重要。

  3. GROUP BY 子句:定义分组的依据列。数据库引擎会根据 node_execution_id 的值将表中的记录分成若干组,每组拥有相同的 node_execution_id 值。

  4. ORDER BY 子句:指定结果的排序方式。DESC 表示降序排列,即 count 值大的组排在前面。
    在这里插入图片描述

二、GROUP BY 的底层原理

理解 GROUP BY 的执行原理对于编写高效的 SQL 查询至关重要。当执行包含 GROUP BY 的查询时,数据库引擎通常会按照以下步骤操作:

  1. 数据扫描:首先从表中读取所有满足条件的行(如果没有 WHERE 子句则读取全部数据)。

  2. 哈希分组:数据库会创建一个哈希表,以 GROUP BY 列的值作为键。对于每一行,计算 node_execution_id 的哈希值,并将该行放入对应的哈希桶中。

  3. 聚合计算:对于每个哈希桶(即每个分组),计算指定的聚合函数(如 COUNT(*)SUM()AVG() 等)。

  4. 结果生成:将每个分组的键值(node_execution_id)和聚合结果(count)组合成结果行。

值得注意的是,现代数据库优化器可能会根据表大小、索引情况等因素选择不同的分组算法,如排序分组法(sort-group)等,但哈希分组是最常见的实现方式。

三、ORDER BY 的排序机制

ORDER BY count DESC 决定了最终结果的呈现顺序。数据库引擎在完成分组和聚合后,会对结果集进行排序:

  1. 内存排序:如果结果集较小,数据库会在内存中使用快速排序等算法直接完成排序。

  2. 外存排序:对于大型结果集,数据库可能采用归并排序等外部排序算法,将中间结果暂存到磁盘。

  3. 索引利用:如果 count 列上有索引,某些数据库可能会利用索引来优化排序过程。

降序排列(DESC)会将较大的 count 值排在前面,这在分析高频事件或热门条目时特别有用。

四、NULL 值的处理策略

在分组操作中,NULL 值需要特别注意。SQL 标准规定:

  • 所有 NULL 值会被视为相同值归入同一组
  • 如果 node_execution_id 包含 NULL 值,这些记录会被聚合到一个特殊的分组中

如果业务上需要排除 NULL 值,应该显式添加过滤条件:

SELECTnode_execution_id,COUNT(*) AS count
FROMpublic.workflow_node_executions
WHEREnode_execution_id IS NOT NULL
GROUP BYnode_execution_id
ORDER BYcount DESC;

五、性能优化建议

对于大型数据表,分组统计操作可能相当耗费资源。以下是几个优化建议:

  1. 索引优化:在 node_execution_id 上创建索引可以显著加速分组操作。对于这个查询,复合索引 (node_execution_id) 就足够。

  2. 分区表:如果表数据量极大,考虑按 node_execution_id 的范围或哈希值进行分区,可以并行化分组操作。

  3. 物化视图:对于频繁执行的相同分组查询,可以创建物化视图预先存储结果。

  4. 限制结果集:如果只需要前 N 个结果,添加 LIMIT 子句避免处理全部数据:

SELECTnode_execution_id,COUNT(*) AS count
FROMpublic.workflow_node_executions
GROUP BYnode_execution_id
ORDER BYcount DESC
LIMIT 100;

六、高级变体查询

基于基础查询,我们可以扩展出更多有用的分析:

  1. 添加筛选条件:只统计特定时间范围内的执行情况
SELECTnode_execution_id,COUNT(*) AS count
FROMpublic.workflow_node_executions
WHEREexecution_time BETWEEN '2023-01-01' AND '2023-12-31'
GROUP BYnode_execution_id
ORDER BYcount DESC;
  1. 多列分组:同时按节点 ID 和执行状态分组
SELECTnode_execution_id,status,COUNT(*) AS count
FROMpublic.workflow_node_executions
GROUP BYnode_execution_id, status
ORDER BYcount DESC;
  1. HAVING 子句:只返回满足特定条件的分组
SELECTnode_execution_id,COUNT(*) AS count
FROMpublic.workflow_node_executions
GROUP BYnode_execution_id
HAVINGCOUNT(*) > 100
ORDER BYcount DESC;

觉得有用的话点个赞 👍🏻 呗。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

img

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

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

相关文章

spring中的InstantiationAwareBeanPostProcessor接口详解

一、接口定位与核心功能 InstantiationAwareBeanPostProcessor是Spring框架中扩展Bean生命周期的关键接口,继承自BeanPostProcessor。它专注于Bean的实例化阶段(对象创建和属性注入)的干预,而非父接口的初始化阶段(如…

uniapp使用sse连接后端,接收后端推过来的消息(app不支持!!)

小白终成大白 文章目录 小白终成大白前言一、什么是SSE呢?和websocket的异同点有什么?相同点不同点 二、直接上实现代码总结 前言 一般的请求就是前端发 后端回复 你一下我一下 如果需要有什么实时性的 后端可以主动告诉前端的技术 我首先会想到 webso…

QML学习06Button

QMLx学习06Button 1、Button1.1 状态改变(checkable)1.2 排斥性(autoExclusive)1.3 重复触发(autoRepeat)、第一次触发延时时间(autoRepeatDelay)、相互之间触发的时间间隔&#xff…

什么是前端工程化?它有什么意义

前端工程化是指通过工具、流程和规范,将前端开发从手工化、碎片化的模式转变为系统化、自动化和标准化的生产过程。其核心目标是 提升开发效率、保障代码质量、增强项目可维护性,并适应现代复杂 Web 应用的需求。 一、前端工程化的核心内容 1. 模块化开发 代码模块化:使用 …

校园二手交易系统

该交易平台分为两部分,前台和后台。用户在前台进行商品选购以及交易;管理员登录后台可以对商品进行维护,主要功能包含: 后台系统的主要功能模块如下: 登录功能、注册功能、后台首页 系统设置: 菜单管理、…

06-Web后端基础(java操作数据库)

1. 前言 在前面我们学习MySQL数据库时,都是利用图形化客户端工具(如:idea、datagrip),来操作数据库的。 我们做为后端程序开发人员,通常会使用Java程序来完成对数据库的操作。Java程序操作数据库的技术呢,有很多啊&a…

uni-app学习笔记十三-vue3中slot插槽的使用

在页面开发中&#xff0c;通常一个页面分为头部&#xff0c;尾部&#xff0c;和中心内容区。其中头部&#xff0c;尾部一般比较固定&#xff0c;而中心区域往往是多样的&#xff0c;需要自定义开发。此时&#xff0c;我们可以引入slot(插槽)来实现这一目标。<slot> 作为一…

Agent模型微调

这篇文章讲解&#xff1a; 把 Agent 和 Fine-Tuning 的知识串起来&#xff0c;在更高的技术视角看大模型应用&#xff1b;加深对 Agent 工作原理的理解&#xff1b;加深对 Fine-Tuning 训练数据处理的理解。 1. 认识大模型 Agent 1.1 大模型 Agent 的应用场景 揭秘Agent核心…

【最新版】Arduino IDE的安装入门Demo

1、背景说明 1、本教程编写日期为2025-5-24 2、Arduino IDE的版本为&#xff1a;Arduino IDE 2.3.6 3、使用的Arduino为Arduino Uno 1、ArduinoIDE的安装 1、下载。网址如下&#xff1a;官网 2、然后一路安装即可。 期间会默认安装相关驱动&#xff0c;默认安装即可。 3、安…

Python应用运算符初解

大家好!运算符是编程中不可或缺的工具&#xff0c;它们能帮助我们执行各种计算和操作。无论是数学运算&#xff0c;还是变量赋值&#xff0c;运算符都在背后默默发挥作用。对于编程初学者来说&#xff0c;理解并掌握常见运算符的用法是迈向编程世界的重要一步。 算术运算符: 加…

小米2025年校招笔试真题手撕(二)

一、题目 给一个长度为n的序列和一个整数x&#xff0c;每次操作可以选择序列中的一个元素&#xff0c;将其从序列中删去&#xff0c;或者将其值加一。 问至少操作多少次&#xff0c;可以使操作后的序列&#xff08;可以为空&#xff09;中数字之和是x的倍数。 输入描述&#…

CNN卷积神经网络到底卷了啥?

参考视频&#xff1a;卷积神经网络&#xff08;CNN&#xff09;到底卷了啥&#xff1f;8分钟带你快速了解&#xff01; 我们知道&#xff1a; 图片是由像素点构成&#xff0c;即最终的成像效果是由背后像素的颜色数值所决定 在Excel中&#xff1a;有这样一个由数值0和1组成的66…

教师技术知识对人工智能赋能下教学效果的影响:以教学创新为中介的实证研究

教师技术知识对人工智能赋能下教学效果的影响&#xff1a;以教学创新为中介的实证研究 摘要 随着教育信息化的快速发展&#xff0c;人工智能技术在教育领域的应用日益广泛&#xff0c;为教育教学带来了深刻变革。然而&#xff0c;当前关于教师技术知识如何影响人工智能赋能下的…

Linux驱动学习笔记(九)

设备模型 1.kobject的全称为kernel object&#xff0c;即内核对象&#xff0c;每一个kobject都会对应到系统/sys/下的一个目录&#xff0c;这些目录的子目录也是一个kobject&#xff0c;以此类推&#xff0c;这些kobject构成树状关系&#xff0c;如下图&#xff1a; kobject定…

25年上半年五月之软考之设计模式

目录 一、单例模式 二、工厂模式 三、 抽象工厂模式 四、适配器模式 五、策略模式 六、装饰器模式 ​编辑 考点&#xff1a;会挖空super(coffeOpertion); 七、代理模式 为什么必须要使用代理对象&#xff1f; 和装饰器模式的区别 八、备忘录模式 一、单例模式 这个…

Python打卡第36天

浙大疏锦行 作业&#xff1a; 对之前的信贷项目&#xff0c;利用神经网络训练下&#xff0c;尝试用到目前的知识点让代码更加规范和美观。 import torch import torch.nn as nn import torch.optim as optim from sklearn.model_selection import train_test_split from sklear…

全面理解类和对象(下)

文章目录 再谈构造函数初始化列表 static概念&#xff1a; 友元友元函数友元类 内部类再次理解类和对象 再谈构造函数 class Date { public:Date(int year, int month, int day){_year year;_month month;_day day;} private:int _year;int _month;int _day; };上述代码有了…

TomatoSCI分析日记——层次聚类

TomatoSCI分析日记——层次聚类 今天介绍的是一种常见的聚类方法——层次聚类。层次聚类会将数据集划分成嵌套的簇&#xff0c;形成一个层次结构&#xff08;树状图&#xff09;&#xff0c;经常用于探究样本的相似性。用大白话来说&#xff0c;就是&#xff1a;我有一大堆样品…

mysql都有哪些锁?

MySQL中的锁机制是确保数据库并发操作正确性和一致性的重要组成部分&#xff0c;根据锁的粒度、用途和特性&#xff0c;可以分为多种类型。以下是MySQL中常见的锁及其详细说明&#xff1a; 一、按锁的粒度划分 行级锁&#xff08;Row-level Locks&#xff09; 描述&#xff1a;…

flutter 项目调试、flutter run --debug调试模式 devtools界面说明

Flutter DevTools 网页界面说明 1. 顶部导航栏 Inspector&#xff1a;查看和调试 Widget 树&#xff0c;实时定位 UI 问题。Performance-- 性能分析面板&#xff0c;查看帧率、CPU 和 GPU 使用情况&#xff0c;识别卡顿和性能瓶颈。Memory-- 内存使用和对象分配分析&#xff…