首页 > 数据库 >mysql中group by 的用法解析

mysql中group by 的用法解析

时间:2024-06-13 13:11:34浏览次数:9  
标签:info group grade max user mysql 解析 id

1. group by的常规用法

group by的常规用法是配合聚合函数,利用分组信息进行统计,常见的是配合max等聚合函数筛选数据后分析,以及配合having进行筛选后过滤。

    • 假设现有数据库表如下:
      表user_info,id主键,user_id唯一键
CREATE TABLE `user_info` (
    `id` INT(11) NOT NULL AUTO_INCREMENT COMMENT '主键id',
    `user_id` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '用户编号',
    `grade` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '年级',
    `class` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '班级',
    PRIMARY KEY (`id`),
    UNIQUE INDEX `uniq_user_id` (`user_id`)
)
ENGINE=InnoDB
  • 数据
INSERT INTO `user_info` (`id`, `user_id`, `grade`, `class`) VALUES (10, '10230', 'C', 'B');
INSERT INTO `user_info` (`id`, `user_id`, `grade`, `class`) VALUES (9, '10229', 'C', 'a');
INSERT INTO `user_info` (`id`, `user_id`, `grade`, `class`) VALUES (8, '10228', 'B', 'b');
INSERT INTO `user_info` (`id`, `user_id`, `grade`, `class`) VALUES (7, '10227', 'B', 'b');
INSERT INTO `user_info` (`id`, `user_id`, `grade`, `class`) VALUES (6, '10226', 'B', 'a');
INSERT INTO `user_info` (`id`, `user_id`, `grade`, `class`) VALUES (5, '10225', 'B', 'a');
INSERT INTO `user_info` (`id`, `user_id`, `grade`, `class`) VALUES (4, '10224', 'A', 'b');
INSERT INTO `user_info` (`id`, `user_id`, `grade`, `class`) VALUES (3, '10223', 'A', 'b');
INSERT INTO `user_info` (`id`, `user_id`, `grade`, `class`) VALUES (2, '10222', 'A', 'a');
INSERT INTO `user_info` (`id`, `user_id`, `grade`, `class`) VALUES (1, '10221', 'A', 'a');

 

iduser_idgradeclass
1 10221 A a
2 10222 A a
3 10223 A b
4 10224 A b
5 10225 B a
6 10226 B a
7 10227 B b
8 10228 B b
9 10229 C a
10 10230 C b
  • 聚合函数max
select max(user_id),grade from user_info group by grade ;

结果

max(user_id)grade
10224 A
10228 B
10230 C

这条sql的含义很明确,将数据按照grade字段分组,查询每组最大的user_id以及当前组内容。注意,这里分组条件是grade,查询的非聚合条件也是grade。这里不产生冲突。

  • having
select max(user_id),grade from user_info group by grade  having grade>'A'

结果

max(user_id)grade
10228 B
10230 C


这条sql与上面例子中的基本相同,不过后面跟了having过滤条件。将grade不满足’>A’的过滤掉了。注意,这里分组条件是grade,查询的非聚合条件也是grade。这里不产生冲突。

2. group by的非常规用法

select max(user_id),id,grade from user_info group by grade  

结果

max(user_id)idgrade
10224 1 A
10228 5 B
10230 9 C


这条sql的结果就值得讨论了,与上述例子不同的是,查询条件多了id一列。数据按照grade分组后,grade一列是相同的,max(user_id)按照数据进行计算也是唯一的,id一列是如何取值的?看上述的数据结果,
推论:id是物理内存的第一个匹配项。
究竟是与不是需要继续探讨。

修改数据

  • 修改id按照上述数据结果,将id=1,改为id=99,执行sql后结论:
max(user_id)idgrade
10224 2 A
10228 5 B
10230 9 C

显然,与上述例子的结果不同。第一条数据id变成了99,查出的结果第一条数据的id从1变成了2。表明,id这个非聚合条件字段的取值与数据写入的时间无关,因为id=1的记录是先于id=2存在的,修改的数据不过是修改了这条数据的内容。结合mysql的数据存储理论,由于id是主键,所以数据在检索是是按照主键排序后进行过滤的,因此
推论:id字段的选取是按照mysql存储的检索数据匹配的第一条。
将id改为1后恢复了原始结果,无法推翻上述推论。

 

更改查询条件

select max(user_id),user_id,id,grade from user_info group by grade

 

max(user_id)user_ididgrade
10224 10221 1 A
10228 10225 5 B
10230 10229 9 C


将数据user_id改为10999后,执行结果为

max(user_id)user_ididgrade
10224 10999 1 A
10228 10225 5 B
10230 10229 9 C


修改了user_id后,并没有改变查询到的数据条目,因此得出修改唯一键并不能影响查询匹配的条目规则,所以条目规则依然是匹配第一条,即id=1。

结论

  • 当group by 与聚合函数配合使用时,功能为分组后计算
  • 当group by 与having配合使用时,功能为分组后过滤
  • 当group by 与聚合函数,同时非聚合字段同时使用时,非聚合字段的取值是第一个匹配到的字段内容,即id小的条目对应的字段内容。

标签:info,group,grade,max,user,mysql,解析,id
From: https://www.cnblogs.com/chbyl/p/18245685

相关文章

  • MySQL创建数据库和表的详细教程
    MySQL创建数据库和表的详细教程1.简介MySQL是一个流行的关系型数据库管理系统,它使用标准的SQL语言进行数据操作。在本文中,我们将详细介绍如何在MySQL中创建数据库和表,并通过实例代码演示整个过程。同时,我们还会分析一些常见问题并提供解决方案。2.安装MySQL首先,确保你......
  • MySQL从入门到高级 --- 15.优化 && 16.pymysql
    文章目录第十五章&&第十六章:15.优化15.1查询SQL执行效率15.2定位低效率执行SQL15.3explain分析执行计划-基本使用15.4explain分析执行计划-id15.5explain分析执行计划-select_type15.6explain分析执行计划-type15.7explain分析执行计划-其他指标字段15......
  • 【AI原理解析】— Gemma2模型
    目录一、模型概述二、模型设计结构上下文大小参数优化参数规模性能优化开放式模型跨平台兼容性三、技术细节Multi-QueryAttentionRoPEEmbeddingsGeGLUActivationsNormalizerLocation模型结构训练数据优化方法四、训练与优化训练硬件训练策略模型评估......
  • MySQL MariaDB 安装
    MySQLMariaDB安装指南MariaDB是MySQL数据库管理系统的一个分支,旨在保持与MySQL兼容并添加更多的功能和改进。以下是如何在不同操作系统上安装MariaDB的详细步骤。在Linux上安装MariaDB1.在Ubuntu/Debian上安装MariaDB首先,更新你的软件包索引:sudoaptu......
  • 记录一次mysql从ibd文件恢复数据的过程
    mysql5.7版本中,一个表会对应两个文件,一个是.frm一个是.ibd如果是分区表,会有多个.ibd文件,并以格式tablename#P#partitionname.ibd格式命名8.x版本中,没有frm文件,只有ibd文件新建库新建表discard表空间ALTERTABLE$TABLE_NAMEDISCARDTABLESPACE;ALTERTABLE$TABLE_N......
  • mysql查询数据库大小
    我们可以使用MySQL命令来查看数据库的数据量大小。首先打开命令行终端,进入MySQL的安装目录,然后执行以下命令:mysql-uusername-p其中,username是你的MySQL用户名。执行命令后,会提示你输入密码。输入正确的密码后,你将进入MySQL命令行界面。接下来,选择你要查看的数据库。假设你想......
  • MySql事务
    事务的定义事务(Transaction)是一个逻辑上完整的操作序列,它包含了一组数据库操作命令。这些操作要么全部执行成功,要么全部不执行,以此来维护数据库的一致性和完整性。事务的主要目的是确保数据的准确性,即使在出现错误或系统故障时也是如此。事务的应用场景金融交易:银行转账是最......
  • mysql的jdbc连接java实现
    在Java中使用JDBC连接MySQL数据库,你需要以下步骤:确保你有MySQLJDBC驱动程序。如果没有,你可以添加依赖到你的项目中,例如使用Maven:<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.23</version></de......
  • AlertManager解析:构建高效告警系统
    本文深入探讨了AlertManager的技术细节和实际应用,从基本概念、核心组件、工作流程,到与Prometheus的集成和实战案例,旨在为专业人士提供一个全面的AlertManager技术和应用指南。关注作者,分享互联网架构、云服务技术的全维度知识。作者拥有10+年互联网服务架构、AI产品研发经验、......
  • 利用Wireshark抓包分析DNS域名解析过程
    一、DNS协议概述  DNS协议也可以称为DNS服务,全称是DomainNameSystem,即域名系统,和HTTP协议一样,也是一个位于应用层的协议(服务),它是基于运输层的UDP协议的。从DNS的名字我们就可以知道,它提供域名映射到IP地址的服务。二、实验目的掌握DNS域名解析过程熟悉DNS报文格式三......