MySQL GROUP BY 子句
在 MySQL 中,GROUP BY 子句用于将查询结果按照一个或多个列进行分组,并对每个组应用聚合函数(如SUM, COUNT, AVG, MAX, MIN等)。GROUP BY 通常与 SELECT 语句一起使用,用于对数据进行汇总和分组统计。
基本语法
SELECT column1, aggregate_function(column2), ... FROM table_name WHERE condition GROUP BY column1;
column1: 用于分组的列。
aggregate_function(column2): 对应列的聚合函数,可以是SUM, COUNT, AVG, MAX, MIN等。
table_name: 要查询数据的表。
condition: 可选的WHERE子句,用于过滤数据。
使用示例
假设有一个名为 users 的表,包含user_id, user_name, age, score列,可以如下使用 GROUP BY 子句:
1、按照 age 分组,统计各个年龄段的人数:
SELECT age, COUNT(user_id) FROM users GROUP BY age;
mysql> SELECT age, COUNT(user_id) -> FROM users -> GROUP BY age; +------+----------------+ | age | COUNT(user_id) | +------+----------------+ | 21 | 1 | | 22 | 4 | | 23 | 2 | | 24 | 2 | +------+----------------+ 4 rows in set (0.00 sec)
2、按照 age 分组,统计各个年龄段的积分总和
SELECT age, sum(score) FROM users GROUP BY age;
mysql> SELECT age, sum(score) -> FROM users -> GROUP BY age; +------+------------+ | age | sum(score) | +------+------------+ | 21 | 18 | | 22 | 104 | | 23 | 64 | | 24 | 41 | +------+------------+ 4 rows in set (0.00 sec)
3、按照 age 分组,统计各个年龄段的积分平均值,并按平均值升序排序
SELECT age, AVG(score) FROM users GROUP BY age order by AVG(score) ASC;
mysql> SELECT age, AVG(score) -> FROM users -> GROUP BY age -> order by AVG(score) ASC; +------+------------+ | age | AVG(score) | +------+------------+ | 21 | 18.0000 | | 22 | 26.0000 | | 23 | 32.0000 | | 24 | 41.0000 | +------+------------+ 4 rows in set (0.00 sec)
多列分组
您可以在GROUP BY子句中指定多个列,以便按照多个列的组合进行分组:
SELECT column1, column2, aggregate_function(column3), ... FROM table_name GROUP BY column1, column2;
注意事项
在GROUP BY子句中列出的每个列必须在SELECT列表中出现,或者是一个聚合函数的参数。
聚合函数应用于每个分组后的结果集,而不是整个表。
如果使用了GROUP BY,则除了聚合函数外的列,每个列的值必须在该组内是唯一的,否则MySQL会返回错误或不确定的结果。
总结
GROUP BY 子句是在 MySQL 中用于对查询结果进行分组和聚合的重要部分。通过合理使用 GROUP BY,可以按照指定的列对数据进行分组统计,用来生成汇总报告或统计结果。确保了解如何正确使用聚合函数和处理多列分组,能够帮助您有效地分析和总结数据。