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

=========正文开始===========

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

表1

  执行如下SQL语句:

1

2

SELECT name FROM test

GROUP BY name

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

表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值写到一个单元格里面。

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,最后执行结果如下:

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

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

至此,我已经对我自己对如此简单的问题有如此天马行空的想法所折服,洗洗睡觉。

group by的用法原理相关推荐

  1. 关于group by的用法 原理

    转自:https://blog.csdn.net/u014717572/article/details/80687042 写在前面的话:用了好久group by,今天早上一觉醒来,突然感觉group ...

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

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

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

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

  4. python模块之HTMLParser之穆雪峰的案例(理解其用法原理)

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #python模块之HTMLParser之穆雪峰的案例(理解其用法原理) #http://www.cnblog ...

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

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

  6. SQL中group by的用法

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

  7. python爬虫哪个选择器好用_Python网络爬虫四大选择器用法原理总结

    前几天小编连续写了四篇关于Python选择器的文章,分别用正则表达式.BeautifulSoup.Xpath.CSS选择器分别抓取京东网的商品信息.今天小编来给大家总结一下这四个选择器,让大家更加深刻 ...

  8. 你知道group by的工作原理和优化思路吗?

    前言 日常开发中,我们经常会使用到group by.亲爱的小伙伴,你是否知道group by的工作原理呢?group by和having有什么区别呢?group by的优化思路是怎样的呢?使用grou ...

  9. python语言变量随时命名随时赋值_Python变量及数据类型用法原理汇总

    变量(Variable)可以看成一个小箱子,专门用来"盛装"程序中的数据.每个变量都拥有独一无二的名字,通过变量的名字就能找到变量中的数据. 从底层看,程序中的数据最终都要放到内存 ...

最新文章

  1. oracle1core,Oracle core06_latchlock
  2. 不容错过的灰度发布系统架构设计
  3. 一种基于三代PacBio测序数据的补洞方法
  4. 静态成员函数调用方式--收藏帖子
  5. scrapy框架-post使用
  6. Dubbo搭建监控中心
  7. 汇编语言王爽 实验七
  8. 全志 Allwinner V3S 开发环境搭建 (二)安装必要工具
  9. 打印图片显示选择传真调制器或服务器,选择打印时为什么显示发送传真
  10. VS2015社区版、企业版、专业版下载官网地址
  11. Android 深色模式的项目应用
  12. 全网稀缺,完整链家地图找房的实现(一)
  13. 如何利用导数推导向心加速度公式? + 开普勒 第三定律的推导过程
  14. 微信公众平台实现天气预报功能
  15. HashMap底层原理(当你put,get时内部会发生什么呢?)
  16. 俄罗斯方块、贪吃蛇、心形表白 | 好玩的C语言源码
  17. 学计算机与学英语词汇,计算机专业常用英语词汇学习
  18. 了解常见的模拟器及交换机的基本配置
  19. sublime3 一直用的好好,sftp同步文件时忽然提示encoding error,Validating remote folder “/var” failure (Encoding error)
  20. 公需科目2020快速学习_重庆2020公需科目快速学习方法

热门文章

  1. 基于redis(v3.2+)实现“附近的人”功能
  2. python安装扩展常用的工具是_Python 安装扩展库常用的是 _______ 工具_学小易找答案...
  3. project文件_移动和发出时通过UploadsReWriter读取的任意文件
  4. ❤️万字总结八大排序:冒泡排序,选择排序,插入排序,堆排序,希尔排序,归并排序,计数排序❤️
  5. 计算机电子的危害,电子垃圾焚烧炉的危害有多大,你了解过吗?
  6. Android 使用gradle版本冲突
  7. WebRequest之HttpWebRequest实现服务器上文件的下载(一)
  8. 通过自己的项目实际经验,阐述为什么“恶心玩技术”?玩Java开源B/S的教训(三)...
  9. 打破南北网络障碍 打造财务安全“双保险”——烟台万华借沟通CTBS实现财务大集中...
  10. linux gcc 静态 动态链接库