mysql中group by 的用法解析
2018-04-09 17:58
686 查看
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=InnoDB1
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
id | user_id | grade | class |
---|---|---|---|
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 |
select max(user_id),grade from user_info group by grade ;1
结果
max(user_id) | grade |
---|---|
10224 | A |
10228 | B |
10230 | C |
select max(user_id),grade from user_info group by grade having grade>'A'1
结果
max(user_id) | grade |
---|---|
10228 | B |
10230 | C |
2. group by的非常规用法
select max(user_id),id,grade from user_info group by grade1
结果
max(user_id) | id | grade |
---|---|---|
10224 | 1 | A |
10228 | 5 | B |
10230 | 9 | C |
推论:id是物理内存的第一个匹配项。
究竟是与不是需要继续探讨。
修改数据
修改id按照上述数据结果,将id=1,改为id=99,执行sql后结论:max(user_id) | id | grade |
---|---|---|
10224 | 2 | A |
10228 | 5 | B |
10230 | 9 | C |
推论:id字段的选取是按照mysql存储的检索数据匹配的第一条。
将id改为1后恢复了原始结果,无法推翻上述推论。更改查询条件
select max(user_id),user_id,id,grade from user_info group by grade1
max(user_id) | user_id | id | grade |
---|---|---|---|
10224 | 10221 | 1 | A |
10228 | 10225 | 5 | B |
10230 | 10229 | 9 | C |
max(user_id) | user_id | id | grade |
---|---|---|---|
10224 | 10999 | 1 | A |
10228 | 10225 | 5 | B |
10230 | 10229 | 9 | C |
结论
当group by 与聚合函数配合使用时,功能为分组后计算当group by 与having配合使用时,功能为分组后过滤
当group by 与聚合函数,同时非聚合字段同时使用时,非聚合字段的取值是第一个匹配到的字段内容,即id小的条目对应的字段内容。
相关文章推荐
- mysql group by子句 having子句 用法解析(详细)
- mysql中group by 的用法解析
- mysql group by 用法解析(详细)
- mysql group by 用法解析(详细)
- mysql group by 用法解析(详细)
- mysql group by 用法解析(详细)
- MySQL group by 用法解析
- mysql group by 用法解析(详细)
- mysql group by 用法解析(详细)
- (转载)mysql group by 用法解析(详细)
- mysql distinct 去重、group by 用法解析(详细)
- mysql distinct 去重 和 mysql group by 用法解析(详细)
- mysql group by 用法解析(详细)
- MysqL group by 用法解析
- mysql group by 用法解析(详细)
- mysql group by 用法解析(详细)
- mysql group by 用法解析(详细)
- mysql group by 用法解析(详细)
- mysql group by 用法解析(详细)
- mysql group by 用法解析(详细)