MySQL的group by与count(), *字段使用问题
文章目录
- 问题
- group by到底做了什么
- 举个例子
- 简单来说
- 为什么select字段,count()不能和*共同使用
- 总结
问题

这是一段摘抄自MySQL官网的文字。其大致意思是MySQL拓展了group by的使用,MySQL允许选择没有出现在group by中的字段。换句话说,标准SQL是不允许select column出现没在group by中出现的字段
所以在MySQL中,select * from table group by column是允许的

BUT
select *, count(column) from table group by column是不允许的

我们来简单分析一下原因
group by到底做了什么
-
扫描表数据:
- 数据库引擎从表中读取所有行。
-
按分组列进行排序或哈希:
- 数据库引擎根据 GROUP BY 子句中指定的列对行进行排序,或使用哈希算法将行分到不同的分组中。不同的数据库系统可能使用不同的实现方式(排序、哈希、甚至混合方法)来高效地实现分组。
-
分配行到各个分组:
- 数据库将每一行放入相应的分组。所有具有相同 GROUP BY 列值的行将被分配到同一个分组。
-
应用聚合函数:
- 对每个分组应用指定的聚合函数(如 COUNT, SUM, AVG, MAX, MIN 等)。这些聚合函数会对每个分组中的行进行计算,并返回一个聚合结果。
-
生成输出:
- 对于每个分组,生成一行输出结果,包含 GROUP BY 列以及聚合函数的计算结果。
举个例子
假设我们有一个简单的表 Sales:
CREATE TABLE Sales (sale_id INT,sale_date DATE,amount DECIMAL(10, 2)
);
INSERT INTO Sales (sale_id, sale_date, amount) VALUES
(1, '2023-06-01', 100.00),
(2, '2023-06-01', 150.00),
(3, '2023-06-02', 200.00),
(4, '2023-06-03', 250.00),
(5, '2023-06-03', 300.00);
我们要按 sale_date 分组,并计算每个日期的总销售额:
SELECT sale_date, SUM(amount) AS total_sales
FROM Sales
GROUP BY sale_date;
执行步骤:
-
扫描表数据:
- 数据库读取所有行:(1, ‘2023-06-01’, 100.00), (2, ‘2023-06-01’, 150.00), (3, ‘2023-06-02’, 200.00), (4, ‘2023-06-03’, 250.00), (5, ‘2023-06-03’, 300.00)。
-
按分组列进行排序或哈希:
- 数据库根据 sale_date 对数据进行排序或哈希:[‘2023-06-01’, ‘2023-06-01’, ‘2023-06-02’, ‘2023-06-03’, ‘2023-06-03’]。
-
分配行到各个分组:
- 数据库将行分配到分组:
- Group 1 (‘2023-06-01’): (1, ‘2023-06-01’, 100.00), (2, ‘2023-06-01’, 150.00)
- Group 2 (‘2023-06-02’): (3, ‘2023-06-02’, 200.00)
- Group 3 (‘2023-06-03’): (4, ‘2023-06-03’, 250.00), (5, ‘2023-06-03’, 300.00)
- 数据库将行分配到分组:
-
应用聚合函数:
- 对每个分组应用 SUM(amount):
- Group 1: SUM(100.00, 150.00) = 250.00
- Group 2: SUM(200.00) = 200.00
- Group 3: SUM(250.00, 300.00) = 550.00
-
生成输出:
- 生成每个分组的输出:
- (‘2023-06-01’, 250.00)
- (‘2023-06-02’, 200.00)
- (‘2023-06-03’, 550.00)
- 生成每个分组的输出:
简单来说
说的通俗点就是形成如下数据结构
Map<Column, List> groupBy
- k1 -> [row1, row2, row3]
- k2 -> [row4, row5, row6]
然后迭代groupBy,对每个List做聚合处理
ans = []
for key, values in groupBy:ans.append(key, 聚合函数(values))
为什么select字段,count()不能和*共同使用
通过上述分析不难发现,count() 函数是对**聚合后的List<Row>**使用
加入我们是select *,那么Row中的数据将会包含一行的所有字段,此时的count应该处理的是count函数 中所指定的字段。count处理完成后,将List<Row>聚合成一个值,那么其他的字段呢?其他的字段也要聚合成一个值,但没有聚合规则呀
所以,count()和*理论上不能同时出现在select字段中。因为count只聚合函数指定的字段,而select *则表示数据行出现所有字段。
其中 一个字段制定了聚合规则,从List聚合为value,那其他字段可不知道怎么聚合,处理后依然是List,因此出现了数据维度的差异,所以理论上count()和*不能同时出现
BUT,我们看看这段SQL

依然是能够跑通的,但这是为什么呢?
其实原因很简单。虽然其他字段不知道聚合规则,但要从List聚合为value,随便选一条数据不久完事了。我们从上图可知,对于非聚合字段,MySQL选择了组间第一行数据作为输出
总结
理论上,group by [col1, col2…]只能和select [col1, col2…]配合,也就是如果存在group by,那么select的字段必须出现在group by中
但是MySQL做出了拓展,允许非聚合字段和聚合字段同时出现
并且允许select *, count(col1) from table group by col1这种形式的SQL出现
相关文章:
MySQL的group by与count(), *字段使用问题
文章目录 问题group by到底做了什么举个例子简单来说为什么select字段,count()不能和*共同使用总结 问题 这是一段摘抄自MySQL官网的文字。其大致意思是MySQL拓展了group by的使用,MySQL允许选择没有出现在group by中的字段。换句话说,标准SQ…...
Java——面向对象进阶(二)
前言: 多态,包,final关键字,权限修饰符和代码块 文章目录 一、多态1.1 概念1.2 多态存在条件1.3 多态中调用成员的特点1.4 instanceof关键字 二、包三、权限修饰符四、final 关键字4.1 修饰类4.2 修饰方法4.3 修饰变量 五、代码块…...
49.Python-web框架-Django解决多语言redirect时把post改为get的问题
目录 1.背景 2.思路 3.寻找 Find and Replace 4.再次运行程序,POST来了 5.小结 1.背景 昨天在练习一个Django功能时,把form的method设置为POST,但是实际提交时,一直是GET方法。最后发现这是与多语言相关,django前面…...
【数据结构】【版本1.1】【线性时代】——单链表
快乐的流畅:个人主页 个人专栏:《算法神殿》《数据结构世界》《进击的C》 远方有一堆篝火,在为久候之人燃烧! 文章目录 引言一、顺序表的问题二、链表的概念三、单链表的模拟实现3.1 定义3.2 打印3.3 创建新节点3.4 头插3.5 尾插3…...
【计算机毕业设计】258基于微信小程序的课堂点名系统
🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板ÿ…...
common.js和es6中模块引入的区别
common.js CommonJS 是一种模块系统,主要用于 Node.js 环境。它使用 require 函数来引入模块,并使用 module.exports 来导出模块。 语法: 导出模块: // moduleA.js const name Jo; module.exports name;// 或者导出一个对象…...
关于对pagination.js源代码进行修改且引入项目使用
实现效果 使用定时器对组件进行每秒请求,每过固定时间之后,进行下一页项目请求,进行到最后一页请求的时候返回第一页。 首先引入js插件 <script src"./js/pagination.js" type"text/javascript"></script>…...
《思考总结》
思考总结 ==标题==:卷积操作的作用1. **特征提取**2. **参数共享**3. **降维和数据压缩**4. **提升计算效率**5. **平滑和去噪**卷积操作示例输入图像卷积核卷积过程总结==标题==:上卷积什么是上卷积(反卷积/转置卷积)上卷积的作用上卷积的实现1. **最近邻插值(Nearest Ne…...
使用QT绘制简单的动态数据折线图
两个核心类时QChart和QLineSeries 下面这个示例代码中,定时器每隔一段时间将曲线图中的数据点向右移动 一个单位,同时调整横坐标轴的范围,实现了一次滚动对应移动一个数据点的效果。 QLineSeries最多容纳40961024个点 #include <QtWidg…...
Linux-centos7 nvm使用
NVM下载使用 文件夹创建拉取nvm包在~/.bashrc的末尾,添加如下语句验证nvm是否安装成功 文件夹创建 mkdir /root/home/software/拉取nvm包 cd /root/home/software/ wget https://github.com/nvm-sh/nvm/archive/refs/tags/v0.38.0.tar.gz tar xvzf v0.38.0.tar.g…...
【Linux】Linux环境基础开发工具_6
文章目录 四、Linux环境基础开发工具gdb 未完待续 四、Linux环境基础开发工具 gdb 我们已经可以写代码了,也能够执行代码了,但是代码错了该如何调试呢?Linux中可以使用 gdb 工具进行调试。 我们写一个简单的程序: 但是我们尝试…...
Redis宣布商用后,Redis国产化替代方案有那些?
一、背景 Redis作为使用最为广泛的开源缓存中间件,现已成为IT开发中必不可少的核心组件。官方修改协议印证了“开源”不意味着“无偿使用”,相关限制或将对基于开源Redis提供中间件产品的厂商,及提供Redis服务的云厂商产生一定影响。 二、国…...
Go API
Go语言提供了大量的标准库,因此 google 公司也为这些标准库提供了相应的API文档,用于告诉开发者如何使用这些标准库,以及标准库包含的方法。官方位置:https://golang.org Golang中文网在线标准库文档: https://studygolang.com/p…...
基于STM32的简易智能家居设计(嘉立创支持)
一、项目功能概述 1、OLED显示温湿度、空气质量,并可以设置报警阈值 2、设置4个继电器开关,分别控制灯、空调、开关、风扇 3、设计一个离线语音识别系统,可以语音控制打开指定开关、并且可以显示识别命令词到OLED屏上 4、OLED实时显示&#…...
【YOLOv5/v7改进系列】改进池化层为RT-DETR的AIFI
一、导言 Real-Time DEtection TRansformer(RT-DETR),是一种实时端到端目标检测器,克服了Non-Maximum Suppression(NMS)对速度和准确性的影响。通过设计高效的混合编码器和不确定性最小化查询选择…...
使用Python和Matplotlib绘制复杂数学函数图像
本文介绍了如何使用Python编程语言和Matplotlib库来绘制复杂的数学函数图像。通过引入NumPy库的数学函数,我们可以处理包括指数函数在内的各种复杂表达式。本文详细讲解了如何设置中文字体以确保在图像中正确显示中文标题和标签,并提供了一个完整的代码示例,用户可以通过输入…...
淘宝/1688获得店铺的所有商品(商品列表)
通过以下步骤,可以获得淘宝或1688店铺的所有商品。请注意,具体步骤可能会因为平台的更新而有所改变,可以根据实际情况进行操作。 更多API调用展示以及获取Key和secret请移步 返回数据格式: {"user": null,"ite…...
【MySQL】锁机制
创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!! 主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步! 给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ …...
LangChain入门学习笔记(一)——Hello World
什么是LangChain LangChain是一个开源(github repo)的大语言模型应用开发框架,提供了一整套的工具、方法和接口去帮助程序员构建基于大语言模型的端到端应用。LangChain是长链(long chain)的意思,它的一个…...
[ROS 系列学习教程] 建模与仿真 - 使用 Arbotix 控制机器人
ROS 系列学习教程(总目录) 本文目录 一、Arbotix 简介二、安装Arbotix三、配置Arbotix控制器四、配置launch启动文件五、数据交互接口六、在rviz中仿真控制机器人6.1 直接发topic控制6.2 使用键盘控制6.3 编写代码控制机器人移动 前面讲了机器人的建模,是静态的&…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...
云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...
HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...
sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...
从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障
关键领域软件测试的"安全密码":Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力,从金融交易到交通管控,这些关乎国计民生的关键领域…...
消息队列系统设计与实践全解析
文章目录 🚀 消息队列系统设计与实践全解析🔍 一、消息队列选型1.1 业务场景匹配矩阵1.2 吞吐量/延迟/可靠性权衡💡 权衡决策框架 1.3 运维复杂度评估🔧 运维成本降低策略 🏗️ 二、典型架构设计2.1 分布式事务最终一致…...
【HarmonyOS 5】鸿蒙中Stage模型与FA模型详解
一、前言 在HarmonyOS 5的应用开发模型中,featureAbility是旧版FA模型(Feature Ability)的用法,Stage模型已采用全新的应用架构,推荐使用组件化的上下文获取方式,而非依赖featureAbility。 FA大概是API7之…...
