【MySQL知识点】group by 的原理和理解

2023-11-19

(1)文章转载自:https://blog.csdn.net/qq403580298/article/details/90756352?ops_request_misc=&request_id=&biz_id=102&utm_term=mysql%20group%20by&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-0-90756352

(2)复制过来重新发布,主要是担心原文对外不可见了,感谢原文博主。

 

==案例讲解=======================================================================

select * from RUN_User;

-- 获取全部数据中薪水最高的
select max(salary) from RUN_User;

-- 通过性别进行分组,获取每组中薪水最高的
select sex, max(salary) from RUN_User group by sex;

-- 通过性别进行分组,获取每组中薪水之和
select sex, sum(salary) from RUN_User group by sex;

-- 时间大于2020-06-07,通过性别进行分组,获取每组中薪水之和
select sex, max(salary) from RUN_User where addTime>="2020-06-07 00:00:00" group by sex;

-- 时间大于2020-06-07,通过性别进行分组,获取每组中薪水之和(要求每组中的成员数大于等于3个的时候才统计)
select sex, max(salary) from RUN_User where addTime>="2020-06-07 00:00:00" group by sex having count(*)>=3;

 

==原理讲解=======================================================================

写在前面的话:用了好久group by,今天早上一觉醒来,突然感觉group by好陌生,总有个筋别不过来,为什么不能够

select * from Table group by id,为什么一定不能是*,而是某一个列或者某个列的聚合函数,group by 多个字段可以怎么去很好的理解呢?不过最后还是转过来了,简单写写吧,大牛们直接略过吧。

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

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

 

表1

  执行如下SQL语句:

1

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,结果如下图:

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

(完)

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【MySQL知识点】group by 的原理和理解 的相关文章

  • SQL 解析键值字符串

    我有一个像这样的逗号分隔字符串 key1 value1 key2 value2 key3 value3 key1 value1 1 key2 value2 1 key3 value3 1 我想将它解析成一个如下所示的表 Key1 Key2
  • 获取MySql中重复行的列表

    我有一张这样的桌子 ID nachname vorname 1 john doe 2 john doe 3 jim doe 4 Michael Knight 我需要一个查询 该查询将从具有相同 nachname 和 vorname 的记录
  • 如何在一列中存储数组或多个值

    运行 Postgres 7 4 是的 我们正在升级 我需要将 1 到 100 个选定项目存储到数据库的一个字段中 98 的情况下 只会输入 1 个项目 而 2 的情况下 如果是这样的话 会输入多个项目 这些项目只不过是文本描述 截至目前 长
  • MySQL REPLACE 在自动递增行中

    假设我有一个 MySQL 表 其中包含三列 id a and b和名为id is an AUTO INCREMENT场地 如果我将如下查询传递给 MySQL 它将正常工作 REPLACE INTO table id a b VALUES 1
  • 使用 PHP 查询更改表,列名未显示在 phpMyAdmin 中

    这是我的第一篇文章 这里有一篇类似的文章 phpMyAdmin 不显示添加的列 代码日志 https stackoverflow com questions 12960302 phpmyadmin doesnt show added col
  • mySQL 基于不同表的 SELECT(计数)更新表

    我有一个课程表和一个科目表 CLASS class id class name subject id date time imagine some rows here SUBJECT subject id subject name curr
  • 数据包无序。得到:80 预期:0 node.js

    这是我的 非常简单 代码 var connection mysql createConnection infosDB connection connect connection query SELECT FROM action functi
  • Java:使用PreparedStatement将多行插入MySQL

    我想使用 Java 一次将多行插入 MySQL 表中 行数是动态的 过去我在做 for String element array myStatement setString 1 element 0 myStatement setString
  • 比较 PHP 中的 unix 时间戳 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 在 PHP 中我有 diff abs
  • 动态/条件 SQL 连接?

    我在 MSSQL 表 TableB 中有数据 其中 dbo tableB myColumn 在特定日期后更改格式 我正在做一个简单的连接到该表 Select dbo tableB theColumnINeed from dbo tableA
  • 澄清创建临时表的连接顺序

    我在 mysql 中有一个大型查询 涉及将多个表连接在一起 它太慢了 所以我做了 解释 发现它正在创建一个临时表 我怀疑它占用了大部分执行时间 我找到了一些相关资料 mysql 文档 http dev mysql com doc refma
  • 如何将 T-SQL 中的结果连接到列中?

    我正在处理一个查询 它应该给我这样的结果 Name Surname Language Date James Hetfield en gb fr 2011 01 01 Lars Ulrich gb fr ca 2011 01 01 但我的选择
  • 从 ISO 周中提取日期 (201905) BigQuery

    我需要从 ISO 周数中提取星期日的日期 即 201905 它需要位于 standardSQL 中 因为它将使用不支持旧版本的脚本进行调度 我尝试从 Google Sheets 调整工作公式 但无法弄清楚 Google Sheets 的原始
  • 关系数据库和图数据库的比较

    有人可以向我解释一下 MySQL 等关系数据库与 Neo4j 等图形数据库相比的优缺点吗 在 SQL 中 您有多个表 它们之间有不同的 id 链接 然后你必须加入来连接表 从新手的角度来看 为什么要将数据库设计为需要联接 而不是像图形数据库
  • 如何通过逗号分隔将 2 行合并为一行?

    我需要将这些单独的行合并到一列 我现在如何通过逗号分隔合并列 CID Flag Value 1 F 10 1 N 20 2 F 12 2 N 23 2 F 14 3 N 21 3 N
  • SQL DML:日期值不正确 (MySQL)

    我在数据库中创建了一个表 CREATE TABLE official receipt student no INT UNSIGNED academic year CHAR 8 trimester ENUM 1 2 3 or no MEDIU
  • MySQL 如何使用返回多行的 SELECT 子查询插入表?

    MySQL 如何使用返回多行的 SELECT 子查询插入表 INSERT INTO Results People names VALUES SELECT d id FROM Names f JOIN People d ON d id f i
  • 当列的数据类型为 int 时,如何用字符串替换 null

    我有一个包含 3 列的表和如下示例数据 所有列都是数据类型int 我有这个查询 select foodid dayid from Schedule 我要更换dayid用字符串 ifdayid null 为此我尝试了这个查询 select f
  • 自定义 php 论坛 - 显示新的/未读的帖子

    我自己使用 php 编写了一个自定义论坛脚本 我决定不使用 phpbb 和其他工具 因为我希望我所做的事情具有 100 的灵活性 不过我遇到了一个问题 如何向用户显示帖子是否是新的 未读的 我想到了两种解决方案 1 饼干 2 数据库 我不想
  • 查询中的存储过程

    有一个程序获取文件列表 顾名思义 返回一个文件列表以及更多选项 那么是否可以在查询选择中使用此过程 像这样的东西 select Field1 from Image where Field2 IN call GetFileList 你应该把它

随机推荐

  • python中,获取字符串的长度

    说明 与其他的语言一样 有时候需要查看或者说计算字符串的长度 在此记录下python中通过哪个函数实现 操作过程 1 通过len 函数返回字符串的长度 gt gt gt text python gt gt gt len text 6 gt
  • 投资不能只看概念,也要尝试使用

    目前 越来越多的行业开始应用聊天机器人ChatGPT 其中 一款免费的国内网站 多御浏览器 提供了安全快速 高效稳定的浏览器体验 该网站不仅提供了许多实用工具 包括当下非常流行的ChatGPT 也为开发人员和初学者提供了方便的在线工具解决方
  • 《Web安全基础》02. 信息收集

    web 1 CDN 绕过 1 1 判断是否有 CDN 服务 1 2 常见绕过方法 1 3 相关资源 2 网站架构 3 WAF 4 APP 及其他资产 5 资产监控 本系列侧重方法论 各工具只是实现目标的载体 命令与工具只做简单介绍 其使用另
  • 数据库数据导入的基本操作

    数据库数据导入的步骤 开发工具与关键技术 数据库 作者 邱慧敏 撰写时间 2019 01 27 数据库最基本的操作就是 如何导入数据 第一步 打开 登录 数据库 第二步 鼠标右键数据库 然后点击新建数据库 第三步 编程数据库名称 可 更改路
  • C++容器排序算法的简单应用

    功能实现 1 去掉所有重复的单词 2 按照单词的长度进行排序 3 统计长度等于或者超过6个字符的单词个数 4 按照单词的长度顺序进行输出 include
  • Ceph优化系列(一):Ceph架构及性能优化

    转载 Ceph架构及性能优化 对分布式存储系统的优化离不开以下几点 1 硬件层面 硬件规划 SSD选择 BIOS设置 2 软件层面 Linux OS Ceph Configurations PG Number调整 CRUSH Map 其他因
  • NoClassDefFoundError: org/springframework/cloud/client/loadbalancer/LoadBalancedRetryFactory

    异常信息 Exception in thread main java lang NoClassDefFoundError org springframework cloud client loadbalancer LoadBalancedR
  • CUDA异步执行与同步调试

    异步执行 默认情况下 GPU 操作是异步的 当您调用使用 GPU 的函数时 操作会被排入特定设备的队列 但不一定要等到稍后才会执行 这允许我们并行执行更多计算 包括在 CPU 或其他 GPU 上的操作 一般来说 异步计算的影响对调用者是不可
  • java基础-CAS、synchronized和AQS的理解

    乐观锁与悲观锁的区别 悲观锁 总是假设最坏的情况 每次去拿数据的时候都认为别人会修改 所以每次在拿数据的时候都会上锁 这样别人想拿这个数据就会阻塞直到它拿到锁 共享资源每次只给一个线程使用 其它线程阻塞 用完后再把资源转让给其它线程 传统的
  • Java数据库基础3

    行转列 首先我们默认的情况 每个名字都输出两次 而最终结果只有一次名字 所以肯定是 以名字分组 group by select from test 9 group by name 对我们来说 id 课程 和分数都不需要了 只需要有名字 然后
  • VMware设置centos7共享文件夹

    前言 VMware在设置centos6共享文件夹的时候 只需要安装vmware tools 然后在vmware里面配置共享文件夹即可 但是对于centos7 设置完之后 并不能如愿的将我们共享的目录显示在 mnt hgfs目录下 这里我们需
  • 新的征程

    十二生肖对应的五行 金 猴 鸡 木 虎 兔 水 鼠 猪 火 蛇 马 土 牛 龙 羊 狗 纳音五行如下 甲子乙丑海中金 甲午乙未沙中金 丙寅丁卯炉中火 丙申丁酉山下火 戊辰己巳大林木 戊戌己亥平地木 庚午辛未路旁土 庚子辛丑壁上土 壬申癸酉剑
  • unity2019.3 所有控制按键输入方法 input 鼠标输入,键盘输入,触屏输入,屏幕点击事件,物体拖拽点击事件说明带实例

    配置按键 unity为满足跨平台需求支持多种输入方式 比较常见的有触屏 摇杆 鼠标 按键 虽然unity可以直接在代码中直接指定某个按键的功能 但我们最好使用按键管理器来为项目配置输入操作 这是不仅是为了更好的统一管理 还是因为unity提
  • 白盒基本路径发测试实验报告_白盒测试之基本路径覆盖法

    基本路径覆盖法是在程序控制流图的基础上 通过分析控制结构的环路复杂性 导出基本可执行路径集合 设计测试用例的方法 该方法把覆盖的路径数压缩到一定限度内 程序中的循环体最多只执行一次 设计出的测试用例要保证在测试中 程序的每一个可执行语句至少
  • 20最佳代码审查工具-专门为开发人员准备

    程序员总是面临最后期限的压力和很多延误软件设计相当不稳定 整个产品是不稳定的 这种不稳定性的设计软件的原因是 它是不能正常测试 来的工作代码审查工具 的代码审查工具可以帮助web开发人员指出他们哪些区域的程序代码是错误的也可能有机会是不正确
  • 【教程】FISCO-BCOS一条龙配置go-sdk控制台搭建并启动

    前言 官网那个教程不是很好用 我在自己做了一遍之后整理了一下自己的步骤给大家 这篇没那么多废话直接开始 环境 Ubuntu18 正文 这里讲的是一条龙命令复制到最后直接完成 如果没有配置环境旁边也有文章点击跳转 1 启动节点 原理直接去看我
  • PCB设计小结

    PCB设计小结 1 给所有元器件编号 快捷键T A A 2 pcb中旋转 3 对齐 pcb中快捷键A 一般是右对齐 底对齐 保存间距 4 CTRL Z键撤销无效 点击撤销按钮也无效 保存重启软件就可以了 5 测距 ctrl m 6自动布线
  • 在vue3 中,使用element-plus中的el-scrollbar,让内容元素自动滚动

    在vue3 中 使用element plus中的el scrollbar 在el scrollbar中如果元素过大出现滑动 就自动滑动 到底部时就返回顶部重新向下滑动 鼠标放入框内停止滑动 模板部分
  • 转:Tendermint 简介

    Tendermint 是分布式一致性软件 即使有1 3的机器叛变了 也能保证其余机器上的数据一致 容忍机器以任意方式失败的能力 包括变得恶意 被称为拜占庭容错 BFT 该理论被提出来数十年了 由于bitcoin和ethereum 区块链技术
  • 【MySQL知识点】group by 的原理和理解

    1 文章转载自 https blog csdn net qq403580298 article details 90756352 ops request misc request id biz id 102 utm term mysql 2