group by 的实现原理

转载:https://cloud.tencent.com/developer/article/1513067

写过 Sql 的同学应该都知道 group by 是用来对数据进行分组的,一般与聚合函数一起使用,对分组后的数据进行聚合。虽然大家都在用,但是有些同学还是不太清楚 group by 的底层到底是如何实现分组并且最后进行聚合的。今天就讲讲 group by 的底层实现。

我们直接来看例子,下面有一张表 t,存储了不同日期对应的不同品类的销量,具体数据如下:

现在我们要统计2019年1月1到1月3期间没每个品类的总销量,这个需求我们就可以用 group by 来实现,实现代码如下:

select    cat    ,sum(sales)
fromt
where sale_date between "2019/1/1" and "2019/1/3"
group by cat

上面代码中的 group by 具体执行过程是什么样子的呢?我们看一下下面这这张图。

通过上图我们可以看出 group by 会对所有的数据先根据 cat 字段进行分组,然后针对分组后的数据在组内进行聚合运算(计数、求和、求均值等),最后再将聚合后的每组数据进行汇总就得到了我们想要的结果。在上图中大家应该看到了分组模块只有 cat 这一列是标红加粗,sale_date 和 sales 这两列是比较虚的字体,为什么会这样呢?难道我写错了?其实不然,是我故意的。为什么要故意呢?我们看一下下面这张图:

上图是将表 t 在 Excel 中做一个数据透视表,如果我们只将 cat 这一列拖到行区域的时候,在表中只显示出了 cat 这一列,别的列是没有显示出来的,Sql 中也是一样的道理,所以我们只有 cat 列是标红加粗显示,而其他列是虚的,是因为其他列在这个阶段是没有显示出来,不过他们也是随时待命的状态。

一旦你指明了要按照哪列数据进行聚合,他们就会按照事先分好的组对要聚合的列去进行相应的聚合运算,然后将结果进行汇总,就是我们想要的数据了。

上面的是最简单的一个例子,就是只按照 cat 这一列进行分组,如果我们现在想要同时对 cat 和 sale_date 这两列来进行分组的话该怎么实现呢?实现代码如下:

selectcat,sale_date,sum(sales)
fromt
where sale_date between "2019/1/1" and "2019/1/3"
group by cat,sale_date

这个时候就相当于在透视表里面把 cat 和 sale_date 同时拖到了行区域,但是也是只显示这两列,而别的列是不显示的,只有指明了聚合列的时候,才会把聚合后的结果展示出来。

单纯的分组聚合的原理大家应该都明白了,不过这里有一个特别需要注意的点不知道大家有没有注意到,就是除了聚合列以外,select 后面要查询的列,必须在 group by 的后面出现。为什么要这样呢?通过上面的两个例子,我们也看到了,虽然一个数据表会有多列,但是在 group by 的时候,只会显示出来你 group by 的列,而其他列是不显示出来的,没有显示出来的列,你在 select 的时候肯定是查询不到的。

源数据如下:

按照c1, c2分组之后:

因为第1行和第6行属于同一个分组,因此只剩下5条记录

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/463211.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

怎么让sublime text3可以运行c/c++

轻巧便捷的sublime text 3代码编辑功能非常强大,并且很漂亮啊有木有!!!!以前我会在安装了CodeBlocks这样的编译器的基础上,再安装一个NotePad,作为编辑器。因为编辑器类似于记事本,只…

理解CSS3 transform中的Matrix(矩阵)

一、哥,我被你吓住了 打架的时候会被块头大的吓住,学习的时候会被奇怪名字吓住(如“拉普拉斯不等式”)。这与情感化设计本质一致:界面设计好会让人觉得这个软件好用! 所以,当看到上面“Matrix(矩…

Rocksdb的优劣及应用场景分析

Rocksdb的优劣及应用场景分析 Rocksdb也是一样,也有它的优势劣势及特定的适用场景。今天我就从设计的角度来分析一下。 基础架构 上图就是Rocksdb的基础架构。Rocksdb中引入了ColumnFamily(列族, CF)的概念,所谓列族也就是一系列kv组成的数据集。所有…

Postgre体系结构图

原文链接:https://blog.csdn.net/q936889811/article/details/83030845 由于工作原因需要调研postgre部分的缓存模块:分给pg的内存不足时,将内存中的数据写出到外部file或者其他的介质中,防止内存不足时,系统运行缓慢…

业界资讯:adobe 技术开发中心 放出游戏单元

昨天晚上光顾了adobe 技术者开发中心,发现一个新的东西。看到大大标题显示出这个部分的内容. 可以看出adobe 未来一个动作,对游戏支持。flash 平台迅速进行推广,目前来讲flex 技术应用在社区开发和网页游戏比较多,这部分能够对企业…

Spring.NET教程(二十)——整合Quartz.NET(应用篇)

Quartz.NET是一个开源的作业调度框架,是OpenSymphony 的 Quartz API的.NET移植,它用C#写成,可用于WinForm和ASP.NET应用中。它提供了巨大的灵活性而不牺牲简单性。你能够用它来为执行一个作业而创建简单的或复杂的调度。它有很多特征&#xf…

vector深拷贝与浅拷贝使用总结

(1)、拷贝构造/赋值函数 --- 深拷贝 int w 100;int h 20;vector<int> dataA(w*h ,0Xff);vector<int> dataB dataA; // copy 构造int * ptr0 &dataA[0];int * ptr1 &dataB[0];printf("%u\n", ptr0);printf("%u\n", ptr1); 结果&…

ELF文件格式

ELF文件格式 ELF文件&#xff08;Executable Linkable Format&#xff09;是一种文件存储格式。Linux下的目标文件和可执行文件都按照该格式进行存储&#xff0c;有必要做个总结。 概要 本文主要记录总结32位的Intel x86平台下的ELF文件结构。ELF文件以Section的形式进行存储…

TCP协议的三次握手与四次挥手

tcp协议的三次握手和四次挥手 三次握手&#xff1a; 第一次握手&#xff1a; 客户端发起一个链接&#xff08;SYN&#xff09; 第二次握手&#xff1a; 服务端就会返回一条&#xff08;ACK&#xff09;确认信息&#xff0c;同时服务端也会向客户端发起一个链接请求&#xff08;…

STM32的PA15、PB3、 PB4管脚作普通管脚的解决办法

最近做了一个板子&#xff0c;使用的是SWD方式进行下载程序&#xff0c;仅仅使用到SWDIO&#xff08;PA13&#xff09; 和SWCLK&#xff08;PA14&#xff09;两个管脚。我将PA15&#xff08;JTDI&#xff09;和PB3&#xff08;JTDO&#xff09;管脚用于他用&#xff08;用于点L…

Google不要走

这两天Google离开中国的新闻不断&#xff0c;如果他真的要离开&#xff0c;我会觉得非常遗憾。我想他已经是大部分程序员的精神领袖&#xff0c;技术牛人的代表&#xff0c;现在居然会被逼走&#xff1f;&#xff1f; 与百度的搜索相比&#xff0c;Google也有广告&#xff0c;但…

MAC机路由管理

On the Mac the command is similar, but a bit different Just as a note to myself and anyone else interested:add network:1sudo route add -net 10.67.0.0/16 192.168.120.254Add hostsudo route add -host 10.67.0.0/16 192.168.120.254转载于:https://blog.51cto.com…

Redis的持久化机制

Redis 的数据全部在内存里&#xff0c;如果突然宕机&#xff0c;数据就会全部丢失&#xff0c;因此必须有一种机制来保证 Redis 的数据不会因为故障而丢失&#xff0c;这种机制就是 Redis 的持久化机制。 Redis 的持久化机制有两种&#xff0c;第一种是RDB快照&#xff0c;第二…

今天用python的turtle简单画了一副眼镜

画的不太好看&#xff0c;下次要继续努力鸭!!! 这个是代码~ 1 from turtle import*2 pencolor("blue")3 fillcolor("white")4 setup(500,1000,100,10)5 speed(2)6 pensize(4)7 begin_fill()8 circle(40,450)9 goto(70,40) 10 circle(-40,360) 11 penup() 1…

ADHD-注意力缺陷多动症

【以下内容转自Wiki】 ADHD&#xff1a;Attention deficit-hyperactivity disorder ADHD的主要病征是&#xff1a; 注意力散涣&#xff08;inattentive&#xff09;或 集中困难&#xff08;Attention-deficit&#xff09;活动量过多&#xff08;hyperactive或hyperkinetic&…

2019春季第三次编程总结

7-1 判断上三角矩阵 &#xff08;15 分) 上三角矩阵指主对角线以下的元素都为0的矩阵&#xff1b;主对角线为从矩阵的左上角至右下角的连线。 本题要求编写程序&#xff0c;判断一个给定的方阵是否上三角矩阵。 输入格式&#xff1a; 输入第一行给出一个正整数T&#xff0c;为待…

ZerMQ安装与使用

windows下 使用vs2010的&#xff0c;v4.0.4的版本官方 0mq api 好像还没加上去&#xff0c;我是参照老版本&#xff08;v3.1)的用法来的。 使用前你要对windows下动态库的使用有个基本了解。我的上一篇博客有讲&#xff0c;但有点乱&#xff0c;有时间再改一改。 这里我是用了…

远程客户端连接MysqL数据库太慢解决方案

为什么80%的码农都做不了架构师&#xff1f;>>> 局域网客户端访问mysql 连接慢问题解决。 cd /etc/mysql vi my.conf [mysqld] skip-name-resolve 此选项禁用了DNS解析&#xff0c;连接速度会快很多。不过&#xff0c;这样的话就不能在MySQL的授权表中使用主机名了…

学号 20175212 《Java程序设计》第3周学习总结

学号 20175212 《Java程序设计》第3周学习总结 教材学习内容总结 一、 Java——面向对象语言 核心内容为对象&#xff0c;一切围绕着对象。以下为三个重要性质&#xff1a; 封装性&#xff1a;将数据和对数据的操作封装在一起。继承&#xff1a;子类可以继承父系的属性和行为。…

Cocos2d开发1:Xcode与TexturePacker的集成

2019独角兽企业重金招聘Python工程师标准>>> 一、导读 这是一篇关于xcode与TexturePacker集成的文章&#xff0c;主要说明cocos2d-iphone/cocos2d-x游戏开发时如何进行图片资源的自动化管理。在进行游戏开发时&#xff0c;我们为了提升性能及减少游戏安装包的大小&…