SQL中GROUPBY语句介绍
本⽂主要介绍 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>
sql语句替换表中内容上述查询结果表明,当不使⽤聚合函数时,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 'W mysql>
【HAVING 与 WHERE 的区别】:
WHERE ⼦句的作⽤:在对查询结果进⾏分组前,把不符合 WHERE 条件的⾏去掉,即在分组之前过滤数据。另外,WHERE 条件中
不能包含聚组函数。
HAVING ⼦句的作⽤:筛选满⾜条件的组,即在分组后过滤数据,条件中经常包含聚组函数,使⽤ HAVING 条件过滤出特定的组。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论