SQL系列(八)—— 分组(group by)
在很多场景时,需要对数据按照某条件进行分组统计其数量、平均值等等。有这种需求,SQL自然也有解决方式。
在SQL中通过group by子句对结果按某条件进行分组。语法:
select count(column1), columnJ from table_name group by columnJ;
group by是后接检索的列或者表达式。表示对该列或者表达式的数据进行分组,该列上或者表达式相同的数据放在同一组。
group by使用的注意点:
- group by必须作用在检索列上或者表达式上
- group by可以作用在多个列上,会按照列的顺序,进行逐层分组
- group by后的列是select的子句中的检索列或者表达式
- group by会将列为NULL值的作为一组
注:大多数情况的场景都是使用group by进行分组,然后对分组的数据进行聚合统计。很少是分组后取某组中的个别列的数据。如:
select name, age from teacher group by age;
select子句中包含了非聚合的列name(这属于取分组结果中个别列的数据情况)。
在Mysql中默认模式:ONLY_FULL_GROUP_BY下,如果执行以上SQL会报错;可以将其关闭,如果再执行以上SQL,mysql将会取分组中的每组的第一行数据作为结果集。
通过看下面的示例,来熟悉下group by:
select age, count(name) as group_count from teacher group by age;
以上的SQL表示的含义:按年龄分组统计每个年龄的老师数量,执行结果:
| age | group_count |
|---|---|
| 25 | 2 |
| 26 | 2 |
| 27 | 1 |
| 28 | 1 |
| 29 | 1 |
再来看一个例子:
select name, max(age), min(age) from person group by name;
以上SQL表示,按照姓名分组统计,找出每组中最大年龄,最小年龄的人,执行结果如下
| name | max | min |
|---|---|---|
| xiaohei | 20 | 29 |
| xiaohong | 28 | 26 |
| xiaolan | 67 | 56 |
以上的例子足以理解group by。group by即对结果集进行按条件进行分组,然后常进行聚合处理。
但是往往仍需要对分组后的结果进行过滤处理,SQL中使用另外一个子句HAVING对group by的分组结果进行过滤处理,如下:
select age, count(name) as group_count from teacher group by age having age < 27;
执行结果
| age | count |
|---|---|
| 25 | 2 |
| 26 | 2 |
对分组结果进行过滤,只检索出分组中年龄小于27的组。
在看到having时,不免联系到where子句,下面总结下他们的异同点:
| 相同点 | 1.having和where都是对结果按照条件过滤; 2.在使用where的地方都可以使用having(不常用); |
|---|---|
| 不同点 | 1.针对的过滤数据不一样,having主要是用来过滤分组,where主要是过滤表中数据行; 2.having和where子句的位置不一样,having在group by后,where在from子句后; 3.having通常配合group by使用; |
那么在有having过滤情况下是否还能使用where呢?
根据上表中不同点1可以看出,是可以的。where是对数据行过滤,然后再对过滤后的行进行分组,再对分组进行having过滤。
下表列出了SQL的执行顺序:
| 子句 | 说明 | 使用场景 |
|---|---|---|
| select | 查询数据 | 在db数据检索时使用 |
| from | 检索的表 | 检索时使用 |
| where | 过滤数据的条件 | 需要对数据进行筛选时 |
| gropu by | 分组select的结果集 | 需要聚合统计时常用 |
| having | 过滤分组 | 对分组进行过滤时需要 |
| order by | 排序结果集 | 需要按照某种顺序展示数据 |
参考
《SQL必知必会》
SQL系列(八)—— 分组(group by)的更多相关文章
- 微软BI 之SSRS 系列 - 使用分组 Group 属性实现基于父子递归关系的汇总报表
基于父子关系的递归结构在公司组织结构里比较常见,基本上都是在一张表里实现的自引用关系.在报表中如果要实现这种效果,并且在这个基础上做一些数据的汇总,可以使用到下面提到的方法. 要实现的效果大致如下 - ...
- SQL Server温故系列(5):SQL 查询之分组查询 GROUP BY
1.GROUP BY 与聚合函数 2.GROUP BY 与 HAVING 3.GROUP BY 扩展分组 3.1.GROUP BY ROLLUP 3.2.GROUP BY CUBE 3.3.GROUP ...
- SQL Server 2008空间数据应用系列八:基于Bing Maps(Silverlight)的空间数据存储
原文:SQL Server 2008空间数据应用系列八:基于Bing Maps(Silverlight)的空间数据存储 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft S ...
- 【SQL】分组数据,过滤分组-group by , having
学习笔记,原文来自http://blog.csdn.net/robinjwong/article/details/24845125 创建分组 - GROUP BY 分组是在SELECT语句的GROUP ...
- Influx Sql系列教程八:query数据查询基本篇
前面几篇介绍了InfluxDB的添加,删除修改数据,接下来进入查询篇,掌握一定的SQL知识对于理解本篇博文有更好的帮助,下面在介绍查询的基础操作的同时,也会给出InfluxSql与SQL之间的一些差别 ...
- sql分别用日期、月、年 分组 group by 分组,datepart函数
标签: datepart函数sql分别用日期月年 分组group by 分组 2013-12-26 15:31 20764人阅读 评论(1) 收藏 举报 分类: SQL Server(21) 版权声明 ...
- mysql分组GROUP BY常用sql
数据分组 GROUP BY GROUP BY可以根据一个或多个字段进行分组. 比如,根据prod_id分组: SELECT prod_id ,user_id FROM products GROUP B ...
- 学习ASP.NET Core Razor 编程系列十七——分组
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- Influx Sql系列教程九:query数据查询基本篇二
前面一篇介绍了influxdb中基本的查询操作,在结尾处提到了如果我们希望对查询的结果进行分组,排序,分页时,应该怎么操作,接下来我们看一下上面几个场景的支持 在开始本文之前,建议先阅读上篇博文: 1 ...
随机推荐
- 7.redis 集群模式的工作原理能说一下么?在集群模式下,redis 的 key 是如何寻址的?分布式寻址都有哪些算法?了解一致性 hash 算法吗?
作者:中华石杉 面试题 redis 集群模式的工作原理能说一下么?在集群模式下,redis 的 key 是如何寻址的?分布式寻址都有哪些算法?了解一致性 hash 算法吗? 面试官心理分析 在前几年, ...
- Angular----样式
本篇根据Angular官网提供的例子,对Angular涉及到的样式绑定进行说明. 一.提供的CSS样式 .red{ color:red; } .green{ color: green; } .yell ...
- 利用mycat读写分离搭建wordpress博客网站
实验环境 以下配置都是建立在mariadb主从没有问题的情况下: .三台主机:在三台机器/etc/hosts添加以下3条主机信息(mycat和wordpress在一台机器上面) mycat:192.1 ...
- Linux的yum管理
前面介绍了软件的管理的方式rpm.但有个缺点,rpm不能解决依赖. 下面介绍的yum软件管理.可以完美的解决这个问题. 使用yum的方式管理rpm软件 优势:自动解决软件的依赖关系 ...
- 201871010121-王方《面向对象程序设计(Java)》第四周学习总结
项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p ...
- nginx 缓存服务
1.nginx 缓存 upstream imooc { server 116.62.103.228:8001; server 116.62.103.228:8002; server 116.62.10 ...
- Iptables不适用与socks协议吗?
需求描述 现有一个台多公网IP服务器,用作于内网网关,通过NAT访问公网使用,要求不同的内网地址访问公网时使用不同的公网IP.可以简单理解为内网与公网IP进行一对一访问外网的映射. 服务器名称 I ...
- HTML基础三-JS
一.JAVA Script 1.1 基本用法 HTML中的三把利器的JS 又称为JavaScript,看着好像和Java有点联系,实际上他和java半毛钱关系都没有,JavaScript和我们学习的P ...
- Python——IO多路复用之select模块select方法
Python——IO多路复用之select模块select方法 使用select模块的select方法实现Python——IO多路复用 实现同时将终端输入的文本以及客户端传输的文本写入文本文件中: w ...
- 洛谷 P1807 最长路_NOI导刊2010提高(07)题解
相当与一个拓扑排序的模板题吧 蒟蒻的辛酸史 题目大意:给你一个有向无环图,让你求出1到n的最长路,如果没有路径,就输出-1 思路:一开始以为是一个很裸的拓扑排序 就不看题目,直接打了一遍拓扑排序 然后 ...