mysql中group by 的用法解析

转载 2018年04月17日 16:10:21

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 数据
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');

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
iduser_idgradeclass
110221Aa
210222Aa
310223Ab
410224Ab
510225Ba
610226Ba
710227Bb
810228Bb
910229Ca
1010230Cb
  • 聚合函数max
select max(user_id),grade from user_info group by grade ;
  • 1

结果

max(user_id)grade
10224A
10228B
10230C

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

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

结果

max(user_id)grade
10228B
10230C

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

2. group by的非常规用法

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

结果

max(user_id)idgrade
102241A
102285B
102309C

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

修改数据

  • 修改id按照上述数据结果,将id=1,改为id=99,执行sql后结论:
max(user_id)idgrade
102242A
102285B
102309C

显然,与上述例子的结果不同。第一条数据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
    • 1
max(user_id)user_ididgrade
10224102211A
10228102255B
10230102299C

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

max(user_id)user_ididgrade
10224109991A
10228102255B
10230102299C

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

结论

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

《C#入门与提高》(二)

第一章 C#的开发环境C#最简间编辑器可以用Notepad,但我并不建议用它编辑源码。原因是如果你与真正的编程语言打交道,使用Notepad编辑源码编译时可能产生大量的错误信息行,但你还不知是在哪呢。...
  • yousoft
  • yousoft
  • 2001-05-22 13:10:00
  • 1553

【oracle中】***LISTAGG WITHIN GROUP BY ****方法的使用

oracle listagg使用
  • wangyonglin1123
  • wangyonglin1123
  • 2017-11-29 18:27:36
  • 160

MySQL和Oracle的group by的异同

MySQL和Oracle之间select的异同
  • rr123rrr
  • rr123rrr
  • 2017-09-12 21:33:51
  • 2898

浅析MySQL中concat以及group_concat的使用

说明: 本文中使用的例子均在下面的数据库表tt2中执行: 一、concat()函数 1、功能:将多个字符串连接成一个字符串。 2、语法:concat(str1, str2,...) 返回结果为连接...
  • Mary19920410
  • Mary19920410
  • 2017-08-01 17:13:11
  • 28454

mysql group by 与order by 一起使用

今天在做mysql分组查询的时候遇到一个问题:    我需要把数据分组排序,于是就想到先group by 然后 order by,可以运行的时候报错    于是上午搜了下才发现group by 与or...
  • WonderFey
  • WonderFey
  • 2017-09-04 12:12:38
  • 3689

Mysql的distinct语句和group by,order by

 最近,在做一个项目的时候,发现得出的数据于预料的相差很多,仔细的研究了一下,发现问题出在 distinct语句和groupy by,order by首先,distinct语句,获得非重复的(唯一)行...
  • gxj022
  • gxj022
  • 2007-11-21 14:32:00
  • 2840

关于mysql中 group by , order by , where, having 语句的区别与运用

最近一直在忙着和数据库有关的一些工作,这几天在写存储过程的时候,一些mysql的语句突然感觉有些不太明白,就是group   by   ,  order   by  ,where   ,  havin...
  • qq_22642239
  • qq_22642239
  • 2016-11-23 16:20:50
  • 3478

MySQL数据库操作---group by、having、where、order by的使用

SUM函数用来求和、group by用来分组查询。一、建表、插入数据1、创建一个student表2、查看student表结构3、插入6条数据4、插入了6条数据后,我们可以发现自增数据(auto_inc...
  • will130
  • will130
  • 2015-11-12 11:55:07
  • 3470

mysql group by作用

group by是跟MySQL的聚合函数一起使用的,通过把一个列(column)分成组(group),来分别使用聚合函数。   常见聚合函数: AVG() 求平均数COUNT() 求列的总数MAX...
  • u010472499
  • u010472499
  • 2017-06-06 11:53:07
  • 728

mysql group by用法

有这样一个表 id 科目 姓名 分数 1 英语 王生 98 2 语文 张生 83 3 数学 王生 91 4 英语 张生 95 5 化学 李生...
  • k8080880
  • k8080880
  • 2013-09-06 10:50:24
  • 1461
收藏助手
不良信息举报
您举报文章:mysql中group by 的用法解析
举报原因:
原因补充:

(最多只允许输入30个字)