当前位置:首页 > 实用技巧 >

sql中group by用法(sql中groupby的用法)

来源:原点资讯(m.360kss.com)时间:2024-01-02 12:51:32作者:YD166手机阅读>>

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_idgradeclass110221Aa210222Aa310223Ab410224Ab510225Ba610226Ba710227Bb810228Bb910229Ca1010230Cb

  • 聚合函数max

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

  • 1

结果

max(user_id)grade10224A10228B10230C

这条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)grade10228B10230C

这条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)idgrade102241A102285B102309C

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

推论:id是物理内存的第一个匹配项。

究竟是与不是需要继续探讨。

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

max(user_id)idgrade102242A102285B102309C

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

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

max(user_id)user_ididgrade10224109991A10228102255B10230102299C

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

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

sql中group by用法,sql中groupby的用法(1)

,

栏目热文

sqlserver怎么附加queryfile(怎么打开sql server query文件)

sqlserver怎么附加queryfile(怎么打开sql server query文件)

一、向已有数据库添加文件及文件组语法:USE <用户数据库名>GOALTER DATABASE <&...

2024-01-02 12:49:14查看全文 >>

sql什么时候使用groupby(sql group by高级用法)

sql什么时候使用groupby(sql group by高级用法)

概述GROUP BY我们可以先从字面上来理解,GROUP表示分组,BY后面写字段名,就表示根据哪个字段进行分组,如果有用...

2024-01-02 12:45:58查看全文 >>

sql语句groupby用法(sql中groupby用法和where区别)

sql语句groupby用法(sql中groupby用法和where区别)

GROUP BY 语句可结合一些聚合函数来使用 GROUP BY 语句GROUP BY 语句用于结合聚合函数,根据一个或...

2024-01-02 12:33:12查看全文 >>

sqlserverpolybase关了怎么开(sql安装中polybase配置选哪个)

sqlserverpolybase关了怎么开(sql安装中polybase配置选哪个)

IT之家11月7日消息 在Microsoft Ignite 2019 大会上,微软正式发布了新一代数据库产品SQL Se...

2024-01-02 13:03:03查看全文 >>

sqlserver 字符串操作函数(sql server 字符串包含语句怎么写)

sqlserver 字符串操作函数(sql server 字符串包含语句怎么写)

今天给大家分享一下SQLServer常用的字符串函数知识笔记,希望对大家能有所帮助!1、ASCII(字符串表达式)作用:...

2024-01-02 12:53:33查看全文 >>

男人保健养生的正确方法(男士保健养生十大项目)

男人保健养生的正确方法(男士保健养生十大项目)

随着生活节奏的加快,男性的竞争和工作压力也会变得越来越大,很多男性夜生活也会变得更加的丰富,男性在晚上很多的事情不能做,...

2024-01-02 13:13:38查看全文 >>

男士保健养生的小知识(中医男士养生保健)

男士保健养生的小知识(中医男士养生保健)

现如今大多数人的生活条件都有了明显的提高,可以把更多的时间和精力放到养生上面,但是许多年轻男性却会忽略自身的养生,认为自...

2024-01-02 12:41:27查看全文 >>

男性养生保健五大原则(男人保健养生的正确方法)

男性养生保健五大原则(男人保健养生的正确方法)

作者:衣晓峰 赵兵医学研究告诉我们,人类的健康状况和寿命的长短,虽然与先天禀赋的遗传因素有密切关系,但是后天的调摄养生也...

2024-01-02 13:00:24查看全文 >>

男性养生保健锻炼方法(男性养生必备的运动)

男性养生保健锻炼方法(男性养生必备的运动)

随着生活水平不断提高,人们对自己的身体也开始加强重视,很多男性都想做好身体的保健,不希望自己的生理功能出现问题。其实运动...

2024-01-02 13:11:19查看全文 >>

男人养生保健的正确方法(男人保健养生的正确方法)

男人养生保健的正确方法(男人保健养生的正确方法)

只有拥有健康的体魄,才能提供温馨和谐的家庭,随着年龄的增长,体质会慢慢的虚弱,身体的器官也会衰弱,不管哪个年龄段的男性,...

2024-01-02 13:08:21查看全文 >>

文档排行