group by

引入

日常开发中,我们经常会使用到group by。你是否知道group by的工作原理呢?group by和having有什么区别呢?group by的优化思路是怎样的呢?使用group by有哪些需要注意的问题呢?

  • 使用group by的简单例子
  • group by 工作原理
  • group by 使用注意点

使用group by的简单例子

group by一般用于分组统计,它表达的逻辑就是根据一定的规则,进行分组

假设用一张员工表,表结构如下:

CREATE TABLE `staff` (
  `id` bigint(11) NOT NULL AUTO_INCREMENT COMMENT '主键id',
  `id_card` varchar(20) NOT NULL COMMENT '身份证号码',
  `name` varchar(64) NOT NULL COMMENT '姓名',
  `age` int(4) NOT NULL COMMENT '年龄',
  `city` varchar(64) NOT NULL COMMENT '城市',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8 COMMENT='员工表';

表存量的数据如下:

图片

有这么一个需求:统计每个城市的员工数量。对应的 SQL 语句就可以这么写:

select city ,count(*) as num from staff group by city;

执行结果如下:

图片

这条SQL语句的逻辑很清楚啦,但是它的底层执行流程是怎样的呢?

group by 原理分析

explain 分析
我们先用explain查看一下执行计划

explain select city ,count(*) as num from staff group by city;
  • 1

图片

  • Extra 这个字段的Using temporary表示在执行分组的时候使用了临时表
  • Extra 这个字段的Using filesort表示使用了排序

group by 怎么就使用到临时表和排序了呢?我们来看下这个SQL的执行流程

group by 的简单执行流程

explain select city ,count(*) as num from staff group by city;
  • 创建内存临时表,表里有两个字段city和num;
  • 全表扫描staff的记录,依次取出city = 'X’的记录。
    判断临时表中是否有为 city='X’的行,没有就插入一个记录 (X,1);
    如果临时表中有city='X’的行的行,就将x 这一行的num值加 1;
  • 遍历完成后,再根据字段city做排序,得到结果集返回给客户端。

这个流程的执行图如下:

图片

临时表的排序是怎样的呢?

就是把需要排序的字段,放到sort buffer,排完就返回。在这里注意一点哈,排序分全字段排序和rowid排序

  • 如果是全字段排序,需要查询返回的字段,都放入sort buffer,根据排序字段排完,直接返回
  • 如果是rowid排序,只是需要排序的字段放入sort buffer,然后多一次回表操作,再返回。
  • 怎么确定走的是全字段排序还是rowid 排序排序呢?由一个数据库参数控制的,max_length_for_sort_data

使用 group by 注意的问题

使用group by 主要有这几点需要注意:

  • group by一定要配合聚合函数一起使用嘛?
  • group by的字段一定要出现在select中嘛
  • group by导致的慢SQL问题

group by一定要配合聚合函数使用嘛?

group by 就是分组统计的意思,一般情况都是配合聚合函数如(count(),sum(),avg(),max(),min())一起使用。

  • count() 数量
  • sum() 总和
  • avg() 平均
  • max() 最大值
  • min() 最小值

如果没有配合聚合函数使用可以吗?

我用的是Mysql 5.7 ,是可以的。不会报错,并且返回的是,分组的第一行数据。

比如这个SQL:

select city,id_card,age from staff group by  city;

查询结果是

图片

大家对比看下,返回的就是每个分组的第一条数据图片

当然,平时大家使用的时候,group by还是配合聚合函数使用的,除非一些特殊场景,比如你想去重,当然去重用distinct也是可以的。

group by 后面跟的字段一定要出现在select中吗?

不一定,比如以下SQL:

select max(age)  from staff group by city;

执行结果如下:

图片

分组字段city不在select 后面,并不会报错。当然,这个可能跟不同的数据库,不同的版本有关吧。大家使用的时候,可以先验证一下就好。有一句话叫做,纸上得来终觉浅,绝知此事要躬行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/191787.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

go当中的channel 无缓冲channel和缓冲channel的适用场景、结合select的使用

Channel Go channel就像Go并发模型中的“胶水”,它将诸多并发执行单元连接起来,或者正是因为有channel的存在,Go并发模型才能迸发出强大的表达能力。 无缓冲channel 无缓冲channel兼具通信和同步特性,在并发程序中应用颇为广泛。…

电脑投屏到电视的软件,Mac,Linux,Win均可使用

电脑投屏到电视的软件,Mac,Linux,Win均可使用 AirDroid Cast的TV版,可以上笔记本电脑或台式电脑直接投屏到各种安卓电视上。 无线投屏可以实现本地投屏及远程投屏,AirPlay协议可以实现本地投屏,大家可以按需…

1panel在应用商店里面安装jenkins

文章目录 目录 文章目录 前言 一、使用步骤 1.1 填写安装参数 1.2 在界面中进入容器拿到自动生成的jenkins密码 前言 一、使用步骤 1.1 填写安装参数 在应用商店里面搜索jenkins,然后点击安装 填写参数 1.2 在界面中进入容器拿到自动生成的jenkins密码 命令 cat /var/jenki…

【腾讯云 HAI域探秘】基于高性能应用服务器HAI部署的 ChatGLM2-6B模型,我开发了AI办公助手,公司行政小姐姐用了都说好!

目录 前言 一、腾讯云HAI介绍: 1、即插即用 轻松上手 2、横向对比 青出于蓝 3、多种高性能应用部署场景 二、腾讯云HAI一键部署并使用ChatGLM2-6B快速实现开发者所需的相关API服务 1、登录 高性能应用服务 HAI 控制台 2、点击 新建 选择 AI模型,…

Flutter | TextField长按时选项菜单复制、粘贴显示为英文问题解决

Flutter | TextField长按时选项菜单复制、粘贴显示为英文问题解决 问题描述: 长按TextField后,显示剪切、复制等选项为英文,如下图所示,这是因为问未设置语言本地化,我们需要进行设置。 首先在pubspec.yaml加入以下依赖…

如何快速搭建一个大模型?简单的UI实现

🔥博客主页:真的睡不醒 🚀系列专栏:深度学习环境搭建、环境配置问题解决、自然语言处理、语音信号处理、项目开发 💘每日语录:相信自己,一路风景一路歌,人生之美,正在于…

NX二次开发UF_CURVE_ask_offset_parms 函数介绍

文章作者:里海 来源网站:https://blog.csdn.net/WangPaiFeiXingYuan UF_CURVE_ask_offset_parms Defined in: uf_curve.h int UF_CURVE_ask_offset_parms(tag_t offset_curve_object, UF_CURVE_offset_data_p_t offset_data_pointer ) overview 概述 …

手把手教会你--github的学习--持续更新

有什么问题,请尽情问博主,QQ群796141573 前言1.1 使用过程(1) 进入某个项目(2) 点击某个文件(3) 在源码区域下面(4) 源码区的头顶上 1.2 作者的其他项目1.3 搜索1.4 复制别人的代码(即项目)到自己的空间内1.5 上传自己的Bugs(bushi1.6 在线修改文件1.7 评…

基于OPC UA 的运动控制读书笔记(1)

最近一段时间集中研究OPCUA 在机器人控制应用中应用的可能性。这个话题自然离不开运动控制。 笔者对运动控制不是十分了解。于是恶补EtherCAT 驱动,PLCopen 运动控制的知识,下面是自己的读书笔记和实现OPCUA /IEC61499 运动控制器的实现方案设想。 为什么…

【Web】攻防世界Web_php_wrong_nginx_config

这题考察了绕过登录、目录浏览、后门利用 进来先是一个登录框,随便怎么输前端都直接弹窗 禁用js后再输入后登录 查看源码,好家伙,不管输什么都进不去 直接扫目录 访问/robots.txt 访问/hint.php 访问/Hack.php 抓包看一下 cookie里isLogin0…

kafka2.x常用命令:创建topic,查看topic列表、分区、副本详情,删除topic,测试topic发送与消费

原创/朱季谦 接触kafka开发已经两年多,也看过关于kafka的一些书,但一直没有怎么对它做总结,借着最近正好在看《Apache Kafka实战》一书,同时自己又搭建了三台kafka服务器,正好可以做一些总结记录。 本文主要是记录如…

【matlab程序】matlab画台风符号和实例应用

【matlab程序】matlab画台风符号和实例应用 没有看文献,不知道文献中的符号什么样子,据我理解为这样子的: 因此,按照自己的理解做了这期。 结果浏览: 台风符号一切可改,可细细改。可是我不发论文&#xf…

【Amazon】安装Cloudwatch代理监控EC2

文章目录 一、实验概要二、实验操作步骤2.1 创建 CloudWatch 代理运行角色2.2 安装 CloudWatch 代理软件包2.3 使用 CloudWatch代理收集指标2.4 CloudWatch指标收集确认 三、参考链接 一、实验概要 使用 CloudWatch 代理从 Amazon EC2 实例和本地服务器中收集指标、日志和跟踪信…

树套树 (线段树+splay)

树套树,就是线段树、平衡树、树状数组等数据结构的嵌套。 最简单的是线段树套set,可以解决一些比较简单的问题,而且代码根线段树是一样的只是一些细节不太一样。 本题中用的是线段树套splay,代码较长。 树套树中的splay和单一的…

jenkins流水线(pipline)实例

1、pipline 语法介绍 声明式的pipeline语法格式 1. 所有的声明都必须包含在pipeline{}中 2. 块只能有节段,指令,步骤或者赋值语句组成 3. 阶段:agent,stages,post,steps 4. 指令:environment&a…

2017年五一杯数学建模B题自媒体时代的消息传播问题解题全过程文档及程序

2017年五一杯数学建模 B题 自媒体时代的消息传播问题 原题再现 电视剧《人民的名义》中人物侯亮平说:“现在是自媒体时代,任何突发性事件几分钟就传播到全世界。”相对于传统媒体,以互联网技术为基础的自媒体以其信息传播的即时性、交往方式…

C#,数值计算——插值和外推,RBF_fn 与 RBF_gauss 的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { public interface RBF_fn { double rbf(double r); } } ---------------------------------------------- using System; namespace Legalsoft.Truffer { public class RBF_gauss : RBF…

如何通过nginx进行服务的负载均衡

简单介绍 随着互联网的发展,业务流量越来越大并且业务逻辑也越来越复杂,单台服务器的性能及单点故障问题就凸显出来了,因此需要多台服务器组成应用集群,进行性能的水平扩展以及避免单点故障的出现。应用集群是将同一应用部署到多台…

上海亚商投顾:北证50指数大涨 逾百只北交所个股涨超10%

上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 一.市场情绪 沪指11月24日震荡调整,深成指、创业板指盘中跌超1%。北证50指数大涨超6%,北交所个股持…

虚拟化逻辑架构: LBR 网桥基础管理

目录 一、理论 1.Linux Bridge 二、实验 1.LBR 网桥管理 三、问题 1.Linux虚拟交换机如何增删 一、理论 1.Linux Bridge Linux Bridge(网桥)是用纯软件实现的虚拟交换机,有着和物理交换机相同的功能,例如二层交换&#…