千家信息网

MySQL入门知识之group by命令用法详细介绍

发表于:2024-09-21 作者:千家信息网编辑
千家信息网最后更新 2024年09月21日,本文主要给大家简单讲讲MySQL入门知识之group by命令用法详细介绍,相关专业术语大家可以上网查查或者找一些相关书籍补充一下,这里就不涉猎了,我们就直奔主题吧,希望MySQL入门知识之group
千家信息网最后更新 2024年09月21日MySQL入门知识之group by命令用法详细介绍

本文主要给大家简单讲讲MySQL入门知识之group by命令用法详细介绍,相关专业术语大家可以上网查查或者找一些相关书籍补充一下,这里就不涉猎了,我们就直奔主题吧,希望MySQL入门知识之group by命令用法详细介绍这篇文章可以给大家带来一些实际帮助。

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');

  • 聚合函数max

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

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

结果:

  • having

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

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

结果:

Having与Where的区别

  • where 子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,where条件中不能包含聚合函数,使用where条件过滤出特定的行。

  • having 子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚合函数,使用having 条件过滤出特定的组,也可以使用多个分组标准进行分组。


2.group by的非常规用法

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

#显示出grade组中数值最大的user_id,显示id,显示grade,从user_infon表中提取。

结果:

这条sql的结果就值得讨论了,与上述例子不同的是,查询条件多了id一列。数据按照grade分组后,grade一列是相同的,max(user_id)按照数据进行计算也是唯一的,id一列是如何取值的?看上述的数据结果,

推论:id是物理内存的第一个匹配项。
究竟是与不是需要继续探讨。


修改数据

  • 修改id按照上述数据结果,将id=1,改为id=99,执行sql后结论:

显然,与上述例子的结果不同。第一条数据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;

#显示出grade组中数值最大的user_id,显示user_id,显示id,显示grade,从user_infon表中提取

结果为:

将数据user_id改为10999后,

执行

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

结果为:

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

MySQL入门知识之group by命令用法详细介绍就先给大家讲到这里,对于其它相关问题大家想要了解的可以持续关注我们的行业资讯。我们的板块内容每天都会捕捉一些行业新闻及专业知识分享给大家的。

数据 条件 结果 分组 查询 函数 命令 知识 入门知识 最大 例子 内容 字段 条目 推论 不同 相同 专业 作用 子句 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 网络技术大赛btf 入职软件开发公司会给配电脑嘛 泰坦陨落2联机怎么改服务器 sqlyog 数据库 删 计算机网络技术几进制编码方式 饥荒联机版打开没有服务器 删除两个数据库语句 关于网络安全知识简体漫画 网络安全风险评估机制印发 梦幻西游服务器显示不出来人物 电子信息专硕考数据库的学校 黑马网络安全教学 大专读计算机网络技术专业好吗 苹果手机国外代理服务器 数据库如何直接复制表结构 万方网络安全 南宁公安局 网络安全中心 4G 网络安全概念股 金仓数据库管理工具Linux 网络安全维护 如何给服务器更新证书 数据库原理与应用中国水利 修改完善软件开发计划 网络安全什么部门负责 游戏服务器在哪里设置 堡垒之夜游戏中怎么开通服务器 网络设备服务器维护 谷歌地球数据库连接 银行监控室网络安全应急预案 深圳职人网络技术有限公司怎么样
0