在 MySQL 中,`GROUP BY` 子句用于将查询结果集中的数据行按照一个或多个列进行分组。通常与聚合函数(如 `COUNT()`、`SUM()`、`AVG()`、`MAX()` 和 `MIN()`)一起使用,以便对每个组的数据进行总结和分析。
一、基本语法
`GROUP BY` 的基本语法如下:
SELECT
列名1, 聚合函数(列名2)
FROM
表名
WHERE
条件
GROUP BY
列名1;
`列名1`:用于分组的列。
`聚合函数(列名2)`:对每个组的指定列进行的计算,如总和、平均值等。
示例:

示例 1:按部门分组
查询每个employees表中每个部门的人数。
select
employees.department_id,
count(*)
from
employees
group by
employees.department_id;
示例 2:按部门分组
查询每个部门的总薪资:
select
employees.department_id,
sum(employees.salary)
from
employees
group by
employees.department_id;
示例3:按部门分组
查询每个部门的平均薪资
select
employees.department_id,
avg(employees.salary)
from
employees
group by
employees.department_id;
示例4:按部门分组
查询每个部门的最高薪资
select
employees.department_id,
max(employees.salary)
from
employees
group by
employees.department_id;
示例5:按部门分组
查询每个部门的最低薪资
select
employees.department_id,
min(employees.salary)
from
employees
group by
employees.department_id;
二、GROUP_CONCAT函数
`GROUP_CONCAT` 函数是 MySQL 中一个非常有用的聚合函数,主要用于将同一组中的多个值连接成一个字符串。它常用于 `GROUP BY` 子句中的数据汇总,允许用户在查询结果中将多个记录的内容合并为一个。
1. 基本用法
语法:
GROUP_CONCAT(expression ORDER BY expression SEPARATOR ‘separator’)
expression: 要连接的列或表达式。
ORDER BY expression: (可选)指定连接结果的排序顺序。
SEPARATOR: (可选)定义连接多个值之间的分隔符,默认是逗号(`,`)。
示例
查询每个部门员工姓名
select
employees.department_id,
group_concat(employees.name)
from
employees
group by
employees.department_id;
2. 结合其他聚合函数使用
您也可以结合 `GROUP_CONCAT` 与其他聚合函数一起使用。例如,计算每个日期的订单数量,并列出所有销售的产品:
SELECT
sale_date,
COUNT(*) AS total_sales, GROUP_CONCAT(product_name SEPARATOR ', ') AS products_sold
FROM
sales
GROUP BY
sale_date;
三、WITH ROLLUP
`WITH ROLLUP` 是 MySQL 中用于 SQL 查询汇总功能的一个强大特性。它允许您在使用 `GROUP BY` 子句时为每个分组生成小计和总计,从而实现回溯统计的能力。`ROLLUP` 可以在统计各个层级数据时,帮助快速获取更高层次的汇总信息。
1. 基本用法
当在 `GROUP BY` 子句中使用 `WITH ROLLUP` 时,数据库会计算每个分组的总和,随后再计算小计和总计。
语法:
SELECT
column1, column2, aggregation_function(column3)
FROM
table_name
GROUP BY
column1, column2 WITH ROLLUP;
示例
查询每个部门薪资数,并计算出公司薪资总额
select
employees.department_id,
sum(employees.salary)
from
employees
group by
employees.department_id
with
rollup;
四、WHERE 与 HAVING
通过 `WHERE` 子句可以先过滤数据,然后再进行分组,而 `HAVING` 子句则用于对分组后的结果进行筛选。
使用 `HAVING` 进行过滤:
示例:查询部门薪资数大于10万的部门,并进行降序排序。
select
employees.department_id,
sum(employees.salary) as s
from
employees
group by
employees.department_id
having
s > 100000;
五、注意事项
聚合函数和分组列:在 `SELECT` 中未使用聚合函数的列,必须在 `GROUP BY` 中列出。这是 SQL 标准的要求。
NULL 值处理:分组时,NULL 值会被视为一个单独的组。
性能:对大型数据集使用 `GROUP BY` 可能会影响查询性能。适当的索引可以提高效率。
六、与其他 SQL 子句结合使用
`GROUP BY` 可以与 `ORDER BY`、`JOIN` 等其他 SQL 子句结合使用,以实现更复杂的查询:
与 `ORDER BY` 一起使用:
示例:查询部门薪资数大于10万的部门,并进行降序排序。
select
employees.department_id,
sum(employees.salary) as s
from
employees
group by
employees.department_id
having
s > 100000
order by
s desc;
七、 总结
`GROUP BY` 是 MySQL 中非常强大的语句,用于对数据进行分组并进行聚合分析。能够高效地处理和总结大量数据,在数据分析和报告中非常有用。