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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • performClick()方法的使用「建议收藏」

    performClick()方法的使用「建议收藏」1.performClick()方法的作用:   performClick()方法是使用代码主动去调用控件的点击事件(模拟人手去触摸控件)2. 使用注意事项: 如果同时使用了view.setOnTouchListener()方法,则有可能存在拦截view.performClick()的响应事件, 因为当view.OnTouchEvent()在event.getAc

    2022年7月13日
    35
  • 指纹识别模组厂家_指纹识别模块原理

    指纹识别模组厂家_指纹识别模块原理不管指纹识别的流程和传感器原理发展得有多快,如果需要商用到手机及终端设备这种民用产品上,还是有好多问题需要克服。比如我们会看到指纹模块在正面,在背面,在侧面,其原因都是sensor性能、模组结构设计、手机ID设计以及量产工艺的限制多重因素辅助、妥协形成的。一、模组位置正面毋庸置疑,代表作当然是iPhone。其实指纹识别应用在手机上并不是APPLE首次尝的禁果,HTC、Sharp、Samsung都有过

    2022年8月10日
    9
  • 常用的DNS列表(亲测可用)

    常用的DNS列表(亲测可用)如果经常遇到这样的问题:浏览器无法打开网站,但是qq、微信是正常使用的,说明DNS有问题。我们知道,默认情况下DNS是自动获取的,通常默认DNS就是路由器,然后由路由器负责向上一级路由查找,但是有时候路由器出现问题就可能造成上面的问题,那么如何一劳永逸的解决上面的问题呢?答案就是修改DNS,在手机、电脑上都可以更改,具体根据机型自行查找资料。以下是一些常用的DNS地址,亲测可用哦~…

    2022年6月9日
    40
  • python构造方法的作用_python中类的作用

    python构造方法的作用_python中类的作用1.构造函数的作用构造函数主要用来在创建对象时完成对对象属性的一些初始化等操作,当创建对象时,对象会自动调用它的构造函数。一般来说,构造函数有以下三个方面的作用:■给创建的对象建立一个标识符;■为对象数据成员开辟内存空间;■完成对象数据成员的初始化。2.默认构造函数当用户没有显式的去定义构造函数时,编译器会为类生成一个默认的构造函数,称为”默认构造函数”,默认构造函数不能完成…

    2022年9月8日
    2
  • 最短路径问题—SPFA算法详解

    最短路径问题—SPFA算法详解前言博客编写人:Willam博客编写时间:2017/3/12博主邮箱:2930526477@qq.com(有志同道合之人,可以加qq交流交流编程心得)1、最短路径问题介绍问题解释:从图中的某个顶点出发到达另外一个顶点的所经过的边的权重和最小的一条路径,称为最短路径解决问题的算法:迪杰斯特拉算法(Dijkstra算法)弗洛伊德算法(Floyd算法)SPFA…

    2022年6月22日
    36
  • matlab填充图形_不同图案填充条形图

    matlab填充图形_不同图案填充条形图1、下载填充函数:applyhatch.  2、有四种选择:applyhatch,applyhatchplus, applyhatch_plusC , 和 HatchfillpatternsplusColor&Invert,个人感觉后两种更好一些。3、下载以后,放在自己存放m文件的地方,就可以在其他m文件中调用applyhatch***函数了。文件注释里都有

    2022年10月18日
    2

发表回复

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

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