本文主要介绍 SQL(Structured Query Language)中 GROUP BY 语句的相关知识,同时通过用法示例介绍 GROUP BY 语句的常见用法。

1 概述

GROUP BY 语句通常用于配合聚合函数(如 COUNT()、MAX() 等),根据一个或多个列对结果集进行分组。

从字面上来理解,GROUP 表示分组、BY 后接字段名,表示根据某个字段进行分组。

一般情况下,GROUP BY 必须要配合聚合函数一起使用,通过使用聚合函数,在分组之后可以对组内结果进行计数(COUNT)、求和(SUM),求平均数(AVG)操作等。

常用聚合函数如下:

  • count():计数
  • sum():求和
  • avg():求平均数
  • max():求最大值
  • min():求最小值

2 常见用法

现有一数据库表,内容如下:

mysql> select * from roles;
+---------+------------+----------+---------------------+
| role_id | occupation | camp     | register_time       |
+---------+------------+----------+---------------------+
|       1 | mage       | alliance | 2018-12-03 16:11:28 |
|       2 | paladin    | alliance | 2018-11-30 16:11:28 |
|       3 | rogue      | horde    | 2018-12-01 16:11:28 |
|       4 | priest     | alliance | 2018-12-02 16:11:28 |
|       5 | shaman     | horde    | NULL                |
|       6 | warrior    | alliance | NULL                |
|       7 | warlock    | horde    | 2018-12-04 16:11:28 |
|       8 | hunter     | horde    | NULL                |
+---------+------------+----------+---------------------+
8 rows in set (0.00 sec)mysql>

接下来针对上表提供一些 GROUP BY 的用法示例,来介绍 GROUP BY 语句的常见用法。

2.1 结合聚合函数

首先,不使用聚合函数,只使用 GROUP BY,查询结果如下:

mysql> select camp,role_id,occupation,register_time from roles group by camp;
+----------+---------+------------+---------------------+
| camp     | role_id | occupation | register_time       |
+----------+---------+------------+---------------------+
| alliance |       1 | mage       | 2018-12-03 16:11:28 |
| horde    |       3 | rogue      | 2018-12-01 16:11:28 |
+----------+---------+------------+---------------------+
2 rows in set (0.00 sec)mysql>

上述查询结果表明,当不使用聚合函数时,GROUP BY 的结果是分组内容中的第一组查询结果。

当然,在实际使用中,通常都需要将 GROUP BY 与聚合函数结合起来使用,来实现某种目的。

例如,我们想查找“联盟和部落阵营中所有角色最早的注册时间”,则可以通过如下语句实现:

mysql> select camp,MIN(register_time) as register_time from roles group by camp;
+----------+---------------------+
| camp     | register_time       |
+----------+---------------------+
| alliance | 2018-11-30 16:11:28 |
| horde    | 2018-12-01 16:11:28 |
+----------+---------------------+
2 rows in set (0.01 sec)mysql>

上述查询结果表明,通过使用聚合函数“MIN()”,我们找到了每个阵营中最早的注册时间。

2.2 HAVING子句

HAVING 子句可以筛选通过 GROUP BY 分组后的各组数据。

承接上文内容,通过 HAVING 子句筛选出所有阵营中最早的注册时间,语句如下:

mysql> select camp,MIN(register_time) as register_time from roles group by camp HAVING register_time > '2018-12-01 00:00:00';
+-------+---------------------+
| camp  | register_time       |
+-------+---------------------+
| horde | 2018-12-01 16:11:28 |
+-------+---------------------+
1 row in set (0.00 sec)mysql>

注意:上述语句中 HAVING 的对象 register_time,实际上是前面聚合函数 MIN(register_time) 的结果集。而由于 WHERE 子句不能包含聚合函数,所以此处只能使用 HAVING 子句。如果使用 WHERE 子句替换 HAVING 子句,命令会报错,信息如下:

mysql> select camp,MIN(register_time) as register_time from roles group by camp WHERE register_time > '2018-12-01 00:00:00';
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE register_time > '2018-12-01 00:00:00'' at line 1
mysql>

【HAVING 与 WHERE 的区别】:

  • WHERE 子句的作用:在对查询结果进行分组前,把不符合 WHERE 条件的行去掉,即在分组之前过滤数据。另外,WHERE 条件中不能包含聚组函数。
  • HAVING 子句的作用:筛选满足条件的组,即在分组后过滤数据,条件中经常包含聚组函数,使用 HAVING 条件过滤出特定的组。

SQL中GROUP BY语句介绍相关推荐

  1. 详解SQL中Groupings Sets 语句的功能和底层实现逻辑

    前言 SQL 中  Group By  语句大家都很熟悉, 根据指定的规则对数据进行分组 ,常常和 聚合函数 一起使用. 比如,考虑有表  dealer ,表中数据如下: 如果执行 SQL 语句  S ...

  2. sql脚本语言中的循环语句介绍

    sql脚本语言中的循环语句介绍 –sql脚本语言的循环介绍: –1.goto循环点. declare x number; begin x:=0;–变量初始化: <<repeat_loop& ...

  3. SQL中GROUP BY的理解

    在SQL中GROUP BY指的是把总数据表切割成若干子数据表,然后再对各个子数据表进行处理,比如我们需要计算下表中每个年级的人数. grade name score 一年级 小王 51 一年级 小魏 ...

  4. SQL中Group By的使用

    Rain Man 怀仁怀朴,唯真唯实. 博客园 首页 博问 闪存 新随笔 联系 订阅 管理 随笔-178  文章-0  评论-314  SQL中Group By的使用 1.概述 2.原始表 3.简单G ...

  5. sql 中的with 语句使用

    一直以来都很少使用sql中的with语句,但是看到了一篇文章中关于with的使用,它的确蛮好用,希望以后记得使用这个语句. 一.with 的用法 With alias_name as (select1 ...

  6. SQL中 group by 1, order by 1 语句是什么意思

    https://blog.csdn.net/nxjhi/article/details/51340018 最近学习数据库,在codecademy中, 遇到如下语句 SELECT a.dep_month ...

  7. oracle的脚本语言是什么意思,Oracle中的sql脚本语言中的循环语句介绍

    --sql脚本语言的循环介绍: --1.goto循环点. declare x number; begin x:=0;--变量初始化: <>--设置循环点. x:=x+1; dbms_out ...

  8. 一.oracle的SQL中group by使用的情况(与聚合函数的关系)

    SELECT r.industry_1,r.industry_2,r.agent_id,r.agent_name, COUNT(DISTINCT r.customer_name_a)数据总量, COU ...

  9. SQL中的聚合函数介绍

    什么是聚合函数(aggregate function)? 聚合函数对一组值执行计算并返回单一的值. 聚合函数有什么特点? 除了 COUNT 以外,聚合函数忽略空值. 聚合函数经常与 SELECT 语句 ...

  10. SQL中 decode() 函数使用介绍

    [SQL]SQL中 decode() 函数介绍 主要作用:将查询结果翻译成其他值(即以其他形式表现出来) decode() 函数的语法: select decode(columnname,值1,翻译值 ...

最新文章

  1. Gamma阶段第九次scrum meeting
  2. Linux 虚拟化网络技术 — 虚拟网络协议栈
  3. Windows Server 2008 R2活动目录灾难恢复(二):备份与恢复(1)
  4. SonarQube6.2源码解析(二)
  5. 从现在开始,争取记录每天所学到的、所感受到的、所遇见到的点点滴滴!
  6. 诺基亚成功转型:引领新一代5G技术 布局物联网
  7. python爬虫总结
  8. MOSSE跟踪算法源码解析
  9. ASP.NET MVC 5 - 入门
  10. phpstudy php56 zend,phpstudy集成环境
  11. cordova弹框插件 cordova-plugin-dialogs
  12. vs2008中文版提供下载(包含中文msdn),包括vs2008序列号和破解方法。
  13. 静态单赋值(二)—gcc中的SSA化算法
  14. 获取安卓手机唯一设备号
  15. 计算机前进后退灰的无法按,《微机试题2012新题.xls》-支持高清全文免费浏览-max文档...
  16. 中忻嘉业:因抖音ccr指标异常的惩罚
  17. depot_tools download CPID client for windows 设置代理
  18. 蔡司镜头的魅力:vivo X60 Pro评测体验
  19. cannot import name ‘_registerMatType‘ from ‘cv2.cv2‘
  20. 纪念 Dan Kohn 先生

热门文章

  1. Tensor Flow V2:将Tensor Flow H5模型文件转换为tflite
  2. C#格式化小数位的方法
  3. 让天下没有难做的研发:解读阿里CI/CD、DevOps、分层自动化技术
  4. iOS 架构模式--解密 MVC,MVP,MVVM以及VIPER架构
  5. 对 SharePoint WebService 的调用
  6. Pollen 1.5 发布,Web 投票系统
  7. Linux学习笔记五:arm-2009q3交叉编译环境安装、U盘拷贝文件到开发板
  8. 2019.6.27刷题统计
  9. vim 插件 -- NERDTree
  10. XCode中的Debug View Hierarchy功能