SQL中GROUP BY语句介绍

SQL中GROUP BY语句介绍本文主要介绍SQL(StructuredQueryLanguage)中GROUPBY语句的相关知识,同时通过用法示例介绍GROUPBY语句的常见用法。1概述GROUPBY语句通常用于配合聚合函数(如COUNT()、MAX()等),根据一个或多个列对结果集进行分组。从字面上来理解,GROUP表示分组、BY后接字段名,表示根据某个字段进行分组。一般情况下,GROUPBY必须要配合聚合函数一起使用,通过使用聚合函数,在分组之后可以对组内结果进行计数(COUNT)

大家好,又见面了,我是你们的朋友全栈君。

本文主要介绍 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 条件过滤出特定的组。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/141241.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • springboot到底是什么_Springboot启动流程

    springboot到底是什么_Springboot启动流程SpringBoot是干哈的介绍:springboot是由Pivotal团队提供的全新框架。spring的出现是为了解决企业级开发应用的复杂性,spring的通过注册bean的方式来管理类,但是随着业务的增加,使用xml配置bean的方式也显得相当繁琐,所以springboot就是为了解决spring配置繁琐的问题而诞生的,并且近几年来非常流行开启我的第一个HelloSpringBoot!开启方式根据https://start.spring.io网址创建一个springboot项目

    2022年8月21日
    5
  • Map和Set的区别_list与set的区别

    Map和Set的区别_list与set的区别目录一、简述二、Map三、Set四、Set和Map区别一、简述Set和Map主要的应用场景在于数据重组和数据储存。Set是一种叫做集合的数据结构,Map是一种叫做字典的数据结构。集合(Set):ES6新增的一种新的数据结构,类似于数组,成员唯一(内部元素没有重复的值)。且使用键对数据排序即顺序存储。Set本身是一种构造函数,用来生成Set数据结构。Set对象允许你储存任何类型的唯一值,无论是原始值或者是对象引用。二、Ma…

    2022年9月6日
    4
  • 利用R语言画图时添加希腊符号标注

    我们在画图时往往需要添加一些图形标注,例如,x坐标轴的含义,y坐标轴的含义,图例等。标注中的普通的英文符号自不待说,将希腊符号添加在标注中往往是各种画图工具需要特别处理的地方。在LaTeX、Matlab中画出这些希腊符号标注,我已经尝试过,并且使用它们已经有一段日子了,关键是如何R中画出这些希腊符号。R是一个开源的以编程语言方式提供的(本身也称为R语言)可以与其他类似软件相媲美的统计计算软件包

    2022年4月14日
    179
  • web3j教程:java使用web3j开发以太坊智能合约交易

    web3j教程:java使用web3j开发以太坊智能合约交易

    2021年6月7日
    113
  • Windows下搭建FTP服务器的一些总结

    Windows下搭建FTP服务器的一些总结Windows下搭建FTP服务器前言:如果你的电脑上的控制面板–程序–打开或关闭windows功能–windows功能里面没有互联网信息服务(IIS),那就别在网上浪费时间了,我找着了一天的资料打了各种补丁没成功,没有相关的IIS或者连c:\windows\system32\inetsrv这个路径都没有,原因是因为你的电脑系统可能是家庭版win7,或者是ghost安装系统的时候精简…

    2022年7月21日
    19
  • python modis数据拼接_python读取modis数据

    python modis数据拼接_python读取modis数据本期记录只上干活,废话不多说,主要是后面与HEG配合使用,实现一系列研究与反演操作。python环境:Python3.5.2+Pycharm模块包:pyhdf安装方法(命令行输入):pipinstallpyhdf一、获取hdf数据集:frompyhdf.SDimportSDHDF_FILR_URL=”E:\Persona_project\Py-Program\RS\modis\M…

    2025年6月24日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号