SQL中的GROUPBY子句是用于对查询结果集进行分组的核心功能,它可以将表中具有相同字段值的记录归为同一个组,配合聚合函数实现分组维度的数据统计与分析,是数据库查询中处理汇总类需求的重要工具。

GROUPBY的基础作用
GROUPBY最核心的作用是将数据按照指定字段进行归类,把字段值相同的记录划分到同一个分组中,每个分组会作为一条结果返回。比如一张用户订单表中,按照用户ID分组,就可以把同一个用户的所有订单归为一组,后续可以统计每个用户的订单总数、订单总金额等信息。
需要注意的是,GROUPBY子句通常和聚合函数一起使用,因为单独使用GROUPBY时,每个分组只会返回一条记录,如果没有聚合函数,非分组字段的取值是不确定的,实际业务中很少单独使用GROUPBY。
常用聚合函数配合GROUPBY的使用
聚合函数用于对分组后的数据进行计算,常见的聚合函数包括COUNT、SUM、AVG、MAX、MIN,以下是这些函数和GROUPBY配合的示例,假设我们有一张名为order_info的订单表,表结构如下:
| 字段名 | 类型 | 说明 |
|---|---|---|
| order_id | int | 订单ID |
| user_id | int | 用户ID |
| order_amount | decimal | 订单金额 |
| order_date | date | 订单日期 |
统计每个用户的订单数量
使用COUNT函数配合GROUPBY按照user_id分组,统计每个用户的订单总数:
-- 统计每个用户的订单数量 SELECT user_id, COUNT(order_id) AS order_count FROM order_info GROUP BY user_id;
统计每个用户的订单总金额
使用SUM函数配合GROUPBY按照user_id分组,计算每个用户的累计消费金额:
-- 统计每个用户的订单总金额 SELECT user_id, SUM(order_amount) AS total_amount FROM order_info GROUP BY user_id;
统计每个用户的平均订单金额
使用AVG函数配合GROUPBY按照user_id分组,计算每个用户的平均客单价:
-- 统计每个用户的平均订单金额 SELECT user_id, AVG(order_amount) AS avg_amount FROM order_info GROUP BY user_id;
GROUPBY的过滤规则:HAVING子句
如果需要对分组后的结果进行过滤,不能使用WHERE子句,因为WHERE是在分组前对记录进行过滤的,而分组后的过滤需要使用HAVING子句。比如我们需要查询订单总金额超过1000的用户,就可以用HAVING来筛选:
-- 查询订单总金额超过1000的用户 SELECT user_id, SUM(order_amount) AS total_amount FROM order_info GROUP BY user_id HAVING total_amount > 1000;
这里要注意,HAVING子句中可以使用聚合函数,也可以使用SELECT中定义的别名,而WHERE子句中不能使用聚合函数和SELECT别名。
多字段分组的使用场景
GROUPBY还支持按照多个字段进行分组,多个字段之间用逗号分隔,分组逻辑是先按照第一个字段分组,第一个字段值相同的记录再按照第二个字段分组,以此类推。比如我们需要统计每个用户每天的订单数量,就可以同时按照user_id和order_date分组:
-- 统计每个用户每天的订单数量 SELECT user_id, order_date, COUNT(order_id) AS day_order_count FROM order_info GROUP BY user_id, order_date;
GROUPBY的使用注意事项
- SELECT子句中出现的字段,要么是GROUPBY子句中的分组字段,要么是聚合函数,否则查询结果是不确定的,不符合SQL标准。
- GROUPBY子句中的字段可以是表达式,比如可以对日期字段进行格式化后再分组,统计每个月的订单数量:
-- 统计每个月的订单数量,假设order_date是日期类型 SELECT DATE_FORMAT(order_date, '%Y-%m') AS month, COUNT(order_id) AS month_order_count FROM order_info GROUP BY DATE_FORMAT(order_date, '%Y-%m');
- GROUPBY的默认排序是按照分组字段升序排列,如果需要自定义排序,可以在语句末尾添加ORDER BY子句。
- 如果分组字段中存在NULL值,所有NULL值的记录会被归为同一个分组。
GROUPBY是SQL中处理分组统计的核心功能,熟练掌握它和聚合函数、HAVING子句的配合,能够满足绝大多数业务中的数据汇总分析需求,是数据库查询必备的技能之一。