关于group by的用法
文章目录
- 准备`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
多个列和聚合函数的应用,将从表1到表3的过程模拟出一张中间表表2。
最终返回的结果为表2,但是此时
id
和count
单元格内是有多个值的。我们都知道关系型数据库是不允许一个单元格内存在多个值的。所以当分组之后返回的结果单元格中含有多个值是就出错了。比如说select *
。
对于这种含有一个单元格内含有多个值的解决方式就是聚合,把这些多个单元格值聚合为一个,就能正确执行了。
关于group by的用法相关推荐
- SQL: ORA-00979 不是 GROUP BY 表达式 及 Group by 的用法说明
参看资源: [1]https://www.cnblogs.com/vigarbuaa/archive/2012/06/25/2561225.html [2]关于group by的用法 原理 - 码农之 ...
- Java正则表达式--Matcher.group函数的用法
https://www.cnblogs.com/jiafuwei/p/6080984.html Java正则表达式--Matcher.group函数的用法 原来,group是针对()来说的,group ...
- count/distinct/group by的用法总结
一. count.distinct.group by的用法: 1.count()函数是用来统计表中记录的一个函数,返回匹配条件的行数,不去重. 一般来说,一条select语句的执行顺序如下:from子 ...
- SQL中group by的用法
group by即按照给定字段对结果集进行分组,从字面意义上理解就是根据"by"指定的规则对数据进行分组,所谓的分组就是将一个"数据集"划分成若干个" ...
- group by的用法
1. group by 的解释: 对哪个字段 ( 哪几个字段)进行分组. 2. group by 的用法: select 字段 from 表 where 条件 group by 字段1(,字段2,字段 ...
- SQL中group by的用法总结
一.简介SQL语言 SQL语言,是结构化查询语言的简称.SQL语言是一种数据库查询和程序设计语言,用于存取数据以及查询.更新和管理关系数据库系统:同时也是数据库脚本文件的扩展名. SQL语言,是高 ...
- Mysql(11)——group by的用法
group by的作用是将字段中相等的分为一组: (1)直接用法 如上:可以见得:将两种数据分了出来:0和1. (2)与group_concat()联用 group_concat()的作用是统计每个分 ...
- mysql中group by 的用法解析
1. group by的常规用法 group by的常规用法是配合聚合函数,利用分组信息进行统计,常见的是配合max等聚合函数筛选数据后分析,以及配合having进行筛选后过滤. 聚合函数max se ...
- sql group by having用法_神奇的 SQL,Group By 真扎心,原来是这样!
GROUP BY 后 SELECT 列的限制 标准 SQL 规定,在对表进行聚合查询的时候,只能在 SELECT 子句中写下面 3 种内容:通过 GROUP BY 子句指定的聚合键.聚合函数(SUM ...
最新文章
- 人工智能如何落地安防?需先迈过算力这一关
- PHP下的Oauth2.0尝试 - 授权码授权(Authorization Code Grant)
- idea springboot jrebel hotreloaded
- 大学计算机课算绩点吗,南京大学GPA是如何计算的
- markdown 笔记
- Lombok 天天用,却不知道它的原理是什么?
- do { ....} while(0) 在宏里冗余的意义
- codeforces1440 E. Greedy Shopping
- 【广告技术】下个月会有多少用户看到洗发水广告?最先进的张量分解模型给你最好的答案
- [小木虫]推荐几个机器学习算法及应用领域相关的中国大牛
- 计算机科学 —— 时间戳(timestamp)
- 笔记︱金融风险之欺诈分类以及银行防控体系简述
- css匹配,提高css效率
- Spring Boot菜鸟示例——Hello World
- linux设备连接磁带机,Redhat Enterprise Linux磁带机简单操作方法
- Python——批量发送邮件(持续更新)
- php吧输出结果进行分割,[判断题] 呼叫处理程序按照一定的逻辑对呼叫进行处理,对呼叫的处理结果与局数据、用户数据的内容无关。...
- 赢了世界冠军不意外,和AI在DOTA中并肩作战才让人又纠结又兴奋
- Cathy学习Java——GUI与正则表达式
- 【信号与系统学习笔记】—— 拉普拉斯反变换+由零极点图对傅里叶变换几何求值
热门文章
- 微信公众平台开发的相关问题
- HD钱包(身份钱包)简介
- FirefoxOS 系统进程初步分析 底层系统继承自 android
- 解决SELECT list is not in GROUP BY clause and contains nonaggregated column..
- (MIUI)小米手机录音丢失找回
- 顺丰bsp物流下单php接口测试,golang 调用顺丰API接口测试-Go语言中文社区
- 2020大疆校招B卷第三题
- java nio oio_NIO,OIO,AIO区别
- Across the great wall we can reach every corner in the world
- Cocos creator接 IOS 穿山甲