首页 > 其他分享 >关于group by的用法

关于group by的用法

时间:2023-01-06 13:31:13浏览次数:36  
标签:count group name 用法 关于 test id select


文章目录

  • ​​准备`sql`​​
  • ​​执行​​
  • ​​分析执行过程​​

用了很久的​​gorup by​​​一道面试题让我突然觉得自己不会用了。原题是这样的:表A有三个列分别为​​a、b、c​​​。语句​​select a,b,c from A group by 【a、b、c任意一个字段】​​会出现什么情况。

答案是这样的,不管你是以​​a、b、c​​​哪一个字段来分组,第一条件:分组的依据要么包含在​​select​​后面要么就是聚合函数包含(必须保证分组之后显示的字段是唯一的,含有多个的情况就必须进行聚合)。还有一种情况就是查询结果集只有分组的依据(没有意义)。

# 伪代码表示
(select 包含分组条件 || 聚合函数包含分组条件|| 只查询分组条件进行分组(没有意义)|| 以主键ID进行分组(没有意义))&& 查询显示的结果字段唯一(不能含有多个值)

# 总结: 分组之后的结果有多个的话必须进行聚合

准备​​sql​

drop table if exists `test`;
create table if not exists `test`(
`id` bigint not null auto_increment comment '主键ID',
`name` varchar(10) not null comment '名称',
`count` bigint not null default 10 comment '次数',
primary key (`id`)
)engine=innodb auto_increment = 66 default charset=utf8 comment '测试表';


insert into `test` (`name`,`count`) values ("a",59),
("a",44),
("a",55534),
("b",22),
("c",95468),
("d",66),
("d",43),
("d",76);

执行

-- 不管name是否重复都可以执行但是没有意义
select `name` from `test` group by `name`

-- 都是可以执行的,以主键分组有什么意义呢
select `id`,`count` from `test` group by `id`
select `id`,`name` from `test` group by `id`
select `id`,`name`,`count` from `test` group by `id`

-- 不管name是否唯一都不能执行(name分组之后会有多个结果集需要进行汇聚)
select `id`,`name`,`count` from `test` group by `name`

-- 可以执行
select sum(`id`),`name`,sum(`count`) from `test` group by `name`

-- 不管count是否唯一都不能执行
select `id`,`name`,`count` from `test` group by `count`

-- 可以执行没有意义
select `id`,`name`,`count` from `test` group by `count`,`id`

-- 正确用法
select `name`,sum(`count`) as `count` from `test` group by `name`;

分析执行过程

关于group by的用法_mysql

为了更好的理解​​group by​​多个列和聚合函数的应用,将从表1到表3的过程模拟出一张中间表表2。

关于group by的用法_sql_02

最终返回的结果为表2,但是此时​​id​​​和​​count​​​单元格内是有多个值的。我们都知道关系型数据库是不允许一个单元格内存在多个值的。所以当分组之后返回的结果单元格中含有多个值是就出错了。比如说​​select *​​。

对于这种含有一个单元格内含有多个值的解决方式就是聚合,把这些多个单元格值聚合为一个,就能正确执行了。


标签:count,group,name,用法,关于,test,id,select
From: https://blog.51cto.com/u_15932195/5993039

相关文章

  • prev_next_pernutation用法总结
    懒得写了,直接上链接 https://blog.csdn.net/qian2213762498/article/details/79683905?ops_request_misc=%257B%2522request%255Fid%2522%253A%25221672981307168001......
  • BAPI_ACC_DOCUMENT_POST 基本用法
    使用BAPI导入凭证,通过BAPIBAPI_ACC_DOCUMENT_POST,可以导入G/L,应收账款、应付账款等。如果导入只包含总账科目的会计凭证,也可以用函数BAPI_ACC_GL_POSTING_POST。......
  • 关于异或-异或运算及其应用
    概念异或,是一个数学运算符,英文为exclusiveOR,缩写为xor,应用于逻辑运算异或的数学符号为“⊕”,计算机符号为“xor”  如果a、b两个值不相同,则异或结果为1......
  • 关于DoTween的使用方法笔记
    一、Unity常用组件拓展方法(1)Transform拓展方法1)Position1)改变世界坐标移动方法,第一个参数是要移动到的目标点,不是移动这个向量的距离transform.DOMove(newVector3(1......
  • 关于C语言库函数qsort的学习
    #include<stdio.h>#include<stdlib.h>#include<string.h>structStu{charname[20];intage;};//voidqsort(void*base,//size_tnum,//size_twidth,//int(*cmp......
  • 关于爬虫中几个常用库的使用方法总结
    关于爬虫中几个常用库的使用方法总结学了半个多月的爬虫了,用这个案例总结一下各个爬虫库的用法。当然后面还有更重要和更好用的方法,再等后面学到,再做总结了。1.目标......
  • 技术汇总:第十六章:关于登录与退出的token
    当两个设备都操作登录时,后操作的设备将具备登录权限,而之前登录的设备失去登录权限。通常的登录业务,按照token随机生成的话,不同设备拥有不同的token,根据token来作为......
  • java中for 的几种常见用法
    J2SE1.5提供了另一种形式的for循环。借助这种形式的for循环,可以用更简单地方式来遍历数组和Collection等类型的对象。本文介绍使用这种循环的具体方式,说明如何自行定义能被......
  • 关于map
    JS中的Map方法Map方法用于处理js中数组中数据map() 方法创建一个新数组,这个新数组由原数组中的每个元素都调用一次提供的函数后的返回值组成。arr.map(functioncallb......
  • 关于数据处理的快捷方式set
    1.setSet 本身是一个构造函数,可以去重consts1=newSet(); console.log(s1);//Set(0)//Array['a','b']转Setconsts2=newSet(['a','b']);......