【后端面试总结】mysql的group by怎么用
GROUP BY
是 SQL 中的一种用于对结果集进行分组的子句,常与聚合函数(如 COUNT()
、SUM()
、AVG()
、MAX()
和 MIN()
等)一起使用。GROUP BY
的作用是基于一个或多个列对查询结果进行分组,然后可以对每个分组执行聚合操作。
以下是 GROUP BY
的一些关键点和用法示例:
基本用法
假设有一个名为 employees
的表,表结构如下:
id | name | department | salary |
---|---|---|---|
1 | Alice | HR | 5000 |
2 | Bob | IT | 6000 |
3 | Carol | HR | 5500 |
4 | David | IT | 6200 |
5 | Eve | Sales | 5800 |
示例 1: 按部门统计员工人数
SELECT department, COUNT(*) AS number_of_employees
FROM employees
GROUP BY department;
这条查询会返回每个部门的员工人数。
示例 2: 按部门计算平均薪资
SELECT department, AVG(salary) AS average_salary
FROM employees
GROUP BY department;
这条查询会返回每个部门的平均薪资。
使用多个列分组
你也可以按多个列进行分组。例如,如果你想按部门和薪资等级对员工进行分组,可以这样做:
SELECT department, salary, COUNT(*) AS number_of_employees
FROM employees
GROUP BY department, salary;
注意事项
-
SELECT 列表中的所有列: 在
SELECT
语句中,GROUP BY
的影响是所有未参与聚合的列都应出现在GROUP BY
子句中。 -
NULL 处理: 当分组键中存在
NULL
值时,SQL 会将NULL
值单独作为一个分组。 -
HAVING
子句: 可以在GROUP BY
的结果上使用HAVING
子句进行过滤。HAVING
子句的作用类似于WHERE
子句,但WHERE
是在分组之前过滤记录,而HAVING
是在分组之后过滤结果。示例:
SELECT department, AVG(salary) AS average_salary FROM employees GROUP BY department HAVING AVG(salary) > 5500;
这条查询返回平均薪资大于 5500 的部门。
-
顺序:
GROUP BY
子句通常出现在WHERE
子句之后,ORDER BY
子句之前。
通过使用 GROUP BY
,你可以对数据进行强大的分组和聚合,帮助你从复杂的数据集中提取有价值的信息。