在很多场景时,需要对数据按照某条件进行分组统计其数量、平均值等等。有这种需求,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)的更多相关文章

  1. 微软BI 之SSRS 系列 - 使用分组 Group 属性实现基于父子递归关系的汇总报表

    基于父子关系的递归结构在公司组织结构里比较常见,基本上都是在一张表里实现的自引用关系.在报表中如果要实现这种效果,并且在这个基础上做一些数据的汇总,可以使用到下面提到的方法. 要实现的效果大致如下 - ...

  2. 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 ...

  3. SQL Server 2008空间数据应用系列八:基于Bing Maps(Silverlight)的空间数据存储

    原文:SQL Server 2008空间数据应用系列八:基于Bing Maps(Silverlight)的空间数据存储 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft S ...

  4. 【SQL】分组数据,过滤分组-group by , having

    学习笔记,原文来自http://blog.csdn.net/robinjwong/article/details/24845125 创建分组 - GROUP BY 分组是在SELECT语句的GROUP ...

  5. Influx Sql系列教程八:query数据查询基本篇

    前面几篇介绍了InfluxDB的添加,删除修改数据,接下来进入查询篇,掌握一定的SQL知识对于理解本篇博文有更好的帮助,下面在介绍查询的基础操作的同时,也会给出InfluxSql与SQL之间的一些差别 ...

  6. sql分别用日期、月、年 分组 group by 分组,datepart函数

    标签: datepart函数sql分别用日期月年 分组group by 分组 2013-12-26 15:31 20764人阅读 评论(1) 收藏 举报 分类: SQL Server(21) 版权声明 ...

  7. mysql分组GROUP BY常用sql

    数据分组 GROUP BY GROUP BY可以根据一个或多个字段进行分组. 比如,根据prod_id分组: SELECT prod_id ,user_id FROM products GROUP B ...

  8. 学习ASP.NET Core Razor 编程系列十七——分组

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  9. Influx Sql系列教程九:query数据查询基本篇二

    前面一篇介绍了influxdb中基本的查询操作,在结尾处提到了如果我们希望对查询的结果进行分组,排序,分页时,应该怎么操作,接下来我们看一下上面几个场景的支持 在开始本文之前,建议先阅读上篇博文: 1 ...

随机推荐

  1. Maven项目配置Logback输出JSON格式日志

    最近,项目提出需求,日志需要固定输出为JSON格式,以便后端Flink程序解析. 项目背景 项目为简单的Maven项目,日志由Filebeat采集,因此不需要配置输出至Logstash. 下面为pom ...

  2. NameNode && Secondary NameNode工作机制

    NameNode && Secondary NameNode工作机制 1)工作流程 2)  fsimage和edits NameNode是HDFS的大脑,它维护着整个文件系统的目录树, ...

  3. MySQL事务优化

    ====================事务特性 事务隔离级别 事务控制语句 MySQL优化==================== 事务的概念 事务指逻辑上的一组操作,组成这组操作的各个单元,要么全 ...

  4. nginx上部署PHP

    环境:centos7  nginx1.16.1 (1)先将tp源代码下载到nginx的站点目录下 注意:存放tp的目录要有可执行权限,否则无法进入目录,访问报403 (2)servr配置: serve ...

  5. IE浏览器下AJAX缓存问题导致数据不更新的解决办法

    一直知道使用ajax的时候,有的时候会出现数据缓存的问题,当时也没有深究,就是所有的简单粗暴的全部加上cache:false,或者使用在url处加上随机时间函数 今天无意间看见了为什么会出现缓存的原因 ...

  6. generator 1(2019年牛客多校第五场B题+十进制矩阵快速幂)

    目录 题目链接 思路 代码 题目链接 传送门 思路 十进制矩阵快速幂. 代码 #include <set> #include <map> #include <deque& ...

  7. 201671010447 杨露露 实验十四 团队项目评审&课程学习总结

    项目 内容 这个作业属于哪个课程 2016计算机科学与工程学院软件工程(西北师范大学) 这个作业的要求在哪里 实验十四 团队项目评审&课程学习总结 作业学习目标 总结这学期软件工程学习获得 一 ...

  8. java.util.ConcurrentModificationException异常;java.util.ConcurrentModificationException实战

    写代码遇到这个问题,很多博客文章都是在反复的强调理论,而没有对应的实例,所以这里从实例出发,后研究理论: 一.错误产生情况 1 .字符型 (1)添加 public static void main(S ...

  9. Elasticsearch 报错:Fielddata is disabled on text fields by default. Set `fielddata=true` on [`your_field_name`] in order to load fielddata in memory by uninverting the inverted index.

    Elasticsearch 报错: Fielddata is disabled on text fields by default. Set `fielddata=true` on [`your_fi ...

  10. JSPDF支持中文(思源黑体)采坑之旅,JSPDF中文字体乱码解决方案

    我拍个砖,通常标称自己文章完美解决何种问题的,往往就是解决不了任何问题! 众所周知,JSPDF是一个开源的,易用的,但是对中文支持非常差的PDF库. 下面,我教大家,如何在pdf中使用思源黑体.思源黑 ...