文章目录

  • 准备`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,但是此时idcount单元格内是有多个值的。我们都知道关系型数据库是不允许一个单元格内存在多个值的。所以当分组之后返回的结果单元格中含有多个值是就出错了。比如说select *

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

关于group by的用法相关推荐

  1. SQL: ORA-00979 不是 GROUP BY 表达式 及 Group by 的用法说明

    参看资源: [1]https://www.cnblogs.com/vigarbuaa/archive/2012/06/25/2561225.html [2]关于group by的用法 原理 - 码农之 ...

  2. Java正则表达式--Matcher.group函数的用法

    https://www.cnblogs.com/jiafuwei/p/6080984.html Java正则表达式--Matcher.group函数的用法 原来,group是针对()来说的,group ...

  3. count/distinct/group by的用法总结

    一. count.distinct.group by的用法: 1.count()函数是用来统计表中记录的一个函数,返回匹配条件的行数,不去重. 一般来说,一条select语句的执行顺序如下:from子 ...

  4. SQL中group by的用法

    group by即按照给定字段对结果集进行分组,从字面意义上理解就是根据"by"指定的规则对数据进行分组,所谓的分组就是将一个"数据集"划分成若干个" ...

  5. group by的用法

    1. group by 的解释: 对哪个字段 ( 哪几个字段)进行分组. 2. group by 的用法: select 字段 from 表 where 条件 group by 字段1(,字段2,字段 ...

  6. SQL中group by的用法总结

    一.简介SQL语言 SQL语言,是结构化查询语言的简称.SQL语言是一种数据库查询和程序设计语言,用于存取数据以及查询.更新和管理关系数据库系统:同时也是数据库脚本文件的扩展名.   SQL语言,是高 ...

  7. Mysql(11)——group by的用法

    group by的作用是将字段中相等的分为一组: (1)直接用法 如上:可以见得:将两种数据分了出来:0和1. (2)与group_concat()联用 group_concat()的作用是统计每个分 ...

  8. mysql中group by 的用法解析

    1. group by的常规用法 group by的常规用法是配合聚合函数,利用分组信息进行统计,常见的是配合max等聚合函数筛选数据后分析,以及配合having进行筛选后过滤. 聚合函数max se ...

  9. sql group by having用法_神奇的 SQL,Group By 真扎心,原来是这样!

    GROUP BY 后 SELECT 列的限制 标准 SQL 规定,在对表进行聚合查询的时候,只能在 SELECT 子句中写下面 3 种内容:通过 GROUP BY 子句指定的聚合键.聚合函数(SUM ...

最新文章

  1. 人工智能如何落地安防?需先迈过算力这一关
  2. PHP下的Oauth2.0尝试 - 授权码授权(Authorization Code Grant)
  3. idea springboot jrebel hotreloaded
  4. 大学计算机课算绩点吗,南京大学GPA是如何计算的
  5. markdown 笔记
  6. Lombok 天天用,却不知道它的原理是什么?
  7. do { ....} while(0) 在宏里冗余的意义
  8. codeforces1440 E. Greedy Shopping
  9. 【广告技术】下个月会有多少用户看到洗发水广告?最先进的张量分解模型给你最好的答案
  10. [小木虫]推荐几个机器学习算法及应用领域相关的中国大牛
  11. 计算机科学 —— 时间戳(timestamp)
  12. 笔记︱金融风险之欺诈分类以及银行防控体系简述
  13. css匹配,提高css效率
  14. Spring Boot菜鸟示例——Hello World
  15. linux设备连接磁带机,Redhat Enterprise Linux磁带机简单操作方法
  16. Python——批量发送邮件(持续更新)
  17. php吧输出结果进行分割,[判断题] 呼叫处理程序按照一定的逻辑对呼叫进行处理,对呼叫的处理结果与局数据、用户数据的内容无关。...
  18. 赢了世界冠军不意外,和AI在DOTA中并肩作战才让人又纠结又兴奋
  19. Cathy学习Java——GUI与正则表达式
  20. 【信号与系统学习笔记】—— 拉普拉斯反变换+由零极点图对傅里叶变换几何求值

热门文章

  1. 微信公众平台开发的相关问题
  2. HD钱包(身份钱包)简介
  3. FirefoxOS 系统进程初步分析 底层系统继承自 android
  4. 解决SELECT list is not in GROUP BY clause and contains nonaggregated column..
  5. (MIUI)小米手机录音丢失找回
  6. 顺丰bsp物流下单php接口测试,golang 调用顺丰API接口测试-Go语言中文社区
  7. 2020大疆校招B卷第三题
  8. java nio oio_NIO,OIO,AIO区别
  9. Across the great wall we can reach every corner in the world
  10. Cocos creator接 IOS 穿山甲