理解group by[通俗易懂]

理解group by[通俗易懂]先来看下表1,表名为test: 表1  执行如下SQL语句: 1 2 SELECT name FROM test GROUP BY name   你应该很容易知道运行的结果,没错,就是下表2: 表2  可是为了能够更好的理解“groupby”多个列“和”聚合函数“的应用,我建议在思考的过程中,由表1到表2的过程中…

大家好,又见面了,我是你们的朋友全栈君。

先来看下表1,表名为test:

 理解group by[通俗易懂]

表1

  执行如下SQL语句:

1

2

SELECT name FROM test

GROUP BY name

  你应该很容易知道运行的结果,没错,就是下表2:

 理解group by[通俗易懂]

表2

  可是为了能够更好的理解“group by”多个列“”聚合函数“的应用,我建议在思考的过程中,由表1到表2的过程中,增加一个虚构的中间表:虚拟表3。下面说说如何来思考上面SQL语句执行情况:

1.FROM test:该句执行后,应该结果和表1一样,就是原来的表。

2.FROM test Group BY name:该句执行后,我们想象生成了虚拟表3,如下所图所示,生成过程是这样的:group by name,那么找name那一列,具有相同name值的行,合并成一行,如对于name值为aa的,那么<1 aa 2>与<2 aa 3>两行合并成1行,所有的id值和number值写到一个单元格里面。

 理解group by[通俗易懂]

3.接下来就要针对虚拟表3执行Select语句了:

(1)如果执行select *的话,那么返回的结果应该是虚拟表3,可是id和number中有的单元格里面的内容是多个值的,而关系数据库就是基于关系的,单元格中是不允许有多个值的,所以你看,执行select * 语句就报错了。

(2)我们再看name列,每个单元格只有一个数据,所以我们select name的话,就没有问题了。为什么name列每个单元格只有一个值呢,因为我们就是用name列来group by的。

(3)那么对于id和number里面的单元格有多个数据的情况怎么办呢?答案就是用聚合函数,聚合函数就用来输入多个数据,输出一个数据的。如cout(id),sum(number),而每个聚合函数的输入就是每一个多数据的单元格。

(4)例如我们执行select name,sum(number) from test group by name,那么sum就对虚拟表3的number列的每个单元格进行sum操作,例如对name为aa的那一行的number列执行sum操作,即2+3,返回5,最后执行结果如下:

理解group by[通俗易懂]

 (5)group by 多个字段该怎么理解呢:如group by name,number,我们可以把name和number 看成一个整体字段,以他们整体来进行分组的。如下图理解group by[通俗易懂]

(6)接下来就可以配合select和聚合函数进行操作了。如执行select name,sum(id) from test group by name,number,结果如下图:

理解group by[通俗易懂]

(已失效)文章出处:理解group by和聚合函数

注意:mysql对group by 进行了非ANSI标准的扩展,允许select后含有非group by 的列。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/141189.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 指令重排详解_cpu指令重排序

    指令重排详解_cpu指令重排序指令重排:编译器指令重排,cpu指令重排,内存指令重排。编译器可能会调整顺序,如下图,左边是c++源码,右边是优化后顺序一条汇编指令的执行是可以分为很多步骤的,分为不同的硬件执行取指IF译码和取寄存器操作数ID执行或者有效地址计算EX(ALU逻辑计算单元)存储器访问MEM写回WB(寄存器)指令重排只可能发生在毫无关系的指令之间,如果指令之间存在依赖关系,则不会重排。单线程内程序的执行结果不能被改变。1原子性是指一个操作是不可中断的.

    2022年10月17日
  • 基于单片机的交通信号灯控制系统设计_交通信号灯程序编程

    基于单片机的交通信号灯控制系统设计_交通信号灯程序编程1、.设计任务交通信号灯控制系统:要求能显示剩余时间和控制红、黄、绿三色灯的显示。2、总体方案设计与方案论证(1)总体方案设计设计路口交通灯控制系统,使用LED显示单元的两组发光二极管(红黄绿)分别模拟十字路口的两组交通灯。a、南北路口的绿灯、东西路口的红灯同时亮20秒。数码管20秒倒记时显示。b、南北路口的黄灯亮5秒,同时东西路口的红灯继续亮。数码管5秒倒记时显示。c、南北

  • coredns_coredns配置域名

    coredns_coredns配置域名网上的coredns.yaml文档都是粘贴复制的,不知所以然,授人以鱼不如授人以渔,官方corednsyaml文件下载地址:https://github.com/kubernetes/kubernetes/blob/master/cluster/addons/dns/coredns/coredns.yaml.base1.下载corednsyamlwget不下来的手动去复制吧root@master01:mkdir/data/work/yaml/coredns/root@master01:~#c

    2022年10月22日
  • 浅谈顶级域名和WWW二级域名收录区别[通俗易懂]

    浅谈顶级域名和WWW二级域名收录区别[通俗易懂]浅谈顶级域名和WWW二级域名收录区别      谈到这个话题,大家首先要认识两点,什么是顶级域名,什么是二级域名。顶级域名:简单讲不带前缀的域名称为顶级域名,例如:g2hh.com,ghh.com二级域名:位于顶级域名的下一级域名称为二级域名,例如:www.g2hh.com,由于大家经常浏览带有www的网页,误以为带有www的域名为顶级,其实不然,像www.g2hh.com的域名

  • TCPDF_TCP ACK

    TCPDF_TCP ACK最近在做一个项目报表,用到了使用php来生成pdf文档,采用tcpdf插件,总结一下,欢迎交流。调用tcpdf文件require_once(‘tcpdf.php’);设置时区,否则会导致报错date_default_timezone_set(‘Asia/Shanghai’);实例化tcpdf页面方向(P=肖像,L=景观)、测量(mm)、页面格式$pdf=newTC

  • Java 链表结点插入

    Java 链表结点插入PS:链表是一种数据结构,而数据结构就是一种存放数据的方式。为什么需要链表?我们知道,数组也可以存储数据,那么为什么还需要链表呢?接下来,我们来看看数组和链表的区别:1、数组就像身上编了号站成一排的人,要找第10个人很容易,根据人身上的编号很快就能找到。但插入、删除慢,要往某个位置插入或删除一个人时,后面的人身上的编号都要变。当然,加入或删除的人始终末尾的也快。2、链表就…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号