MySQL对group by原理和理解

MySQL对group by原理和理解写在前面的话:用了好久groupby,今天早上一觉醒来,突然感觉groupby好陌生,总有个筋别不过来,为什么不能够select*fromTablegroupbyid,为什么一定不能是*,而是某一个列或者某个列的聚合函数,groupby多个字段可以怎么去很…

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

写在前面的话:用了好久group by,今天早上一觉醒来,突然感觉group by好陌生,总有个筋别不过来,为什么不能够select * from Table group by id,为什么一定不能是*,而是某一个列或者某个列的聚合函数,group by 多个字段可以怎么去很好的理解呢?不过最后还是转过来了,简单写写吧,大牛们直接略过吧。

=正文开始===

先来看下表1,表名为test:
在这里插入图片描述
执行如下SQL语句:

SELECT name FROM test
GROUP BY name

在这里插入图片描述
表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值写到一个单元格里面。
  你应该很容易知道运行的结果,没错,就是下表2:
在这里插入图片描述
(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,最后执行结果如下:
在这里插入图片描述
(5)group by 多个字段该怎么理解呢:如group by name,number,我们可以把name和number 看成一个整体字段,以他们整体来进行分组的。如下图
在这里插入图片描述
(6)接下来就可以配合select和聚合函数进行操作了。如执行select name,sum(id) from test group by name,number,结果如下图:
在这里插入图片描述

(完)

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

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/141319.html原文链接:https://javaforall.net

(0)
上一篇 2022年5月26日 上午8:40
下一篇 2022年5月26日 上午8:40


相关推荐

  • ostringstream用法

    ostringstream用法使用MFC都知道他有一个非常方便的字符串类CString,C++标准也有一个string类,但是处理起来不够灵活,特别是没有类似Format()的函数。 无意中看到ostringstream的用法,使用它可以达到类似的效果。 ostringstreamos;stringstr=”abcef”;inti=1000;osstd::coutos.st

    2022年6月28日
    57
  • OpenClaw命令完全指南:从入门到精通

    OpenClaw命令完全指南:从入门到精通

    2026年3月13日
    3
  • 什么是lamp架构_什么是LAMP

    什么是lamp架构_什么是LAMPLAMP架构介绍LAMP动态网站架构LAMP是指一组通常一起使用来运行动态网站或者服务器的自由软件名称首字母缩写。1、LAMP分别代表什么?L代表服务器操作系统使用LinuxA代表网站服务使用的是Apache软件基金会中的httpd软件M代表网站后台使用的数据库是MySQL数据库P代表网站是使用PHP/Perl/Python等语言开发2、Apache/MySQL/PHP各自有什么作用?2.1Apache(httpd)—–像极了饭店前台作用:提供web服务,

    2022年10月16日
    4
  • 偏度(skewness)和峰度(kurtosis)

    偏度(skewness)和峰度(kurtosis)偏度偏度(skewness),是统计数据分布偏斜方向和程度的度量,是统计数据分布非对称程度的数字特征。定义上偏度是样本的三阶标准化矩。偏度定义中包括正态分布(偏度=0),右偏分布(也叫正偏分布,其偏度>0),左偏分布(也叫负偏分布,其偏度<0)。Python代码实现方法:pandas的Series数据结构可以直接调用skew()方法来查看df.iloc[…

    2025年8月23日
    4
  • aes128 cmac java,C语言实现AES-128 CMAC算法

    aes128 cmac java,C语言实现AES-128 CMAC算法MessageAuthe MAC 是一种保障信息完整性和认证的密码学方法 其中 CMAC 的全称是 Cypher BasedMessage 基于 AES 等对称加密方式实现消息认证 通信双方需要共享一个对称密钥 由发送方生成一个 MAC 值 附在消息后面 接收方计算收到消息的 MAC 如果和收到的 MAC 一致 则说明没有被篡改 并且能确认发送方一定

    2026年3月17日
    1
  • 利用python画图

    利用python画图因为最近论文收尾需要画图,于是学了一些画图的东西在这里分享一下一、环境配置 linuxubuntu下需安装下面三个包:Numpy,Scipy,Matplotlib分别输入下面的代码进行安装:二、开始画一些简单的图(1)直线图#coding:utf-8importnumpyasnpimportmatplotlib.pyplotaspltx=…

    2022年5月6日
    59

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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