1. 简介
在 SQL 数据库查询中,GROUP BY 是一个非常有用的关键字。它让我们能够按照某些列的值对结果进行分组,然后进行各种汇总计算。本文将对 GROUP BY 进行详细解释,包括其语法、用法、注意事项等等。
2. 语法
GROUP BY 语法如下:
SELECT 列1, 列2, ...
FROM 表
WHERE 筛选条件
GROUP BY 列1, 列2, ...
其中关键字 GROUP BY 后面可以跟一个或多个列名,多个列名之间用逗号隔开。
3. 用法
3.1 分组统计
最常见的用途是对某些列进行统计计算,例如求和、平均值、最大值、最小值等等。例如,我们想要求出每个部门的平均工资:
SELECT department, AVG(salary) AS avg_salary
FROM employees
GROUP BY department;
这个查询将会返回一个结果集,其中每行包含一个部门名和对应的平均工资。
3.2 分组筛选
GROUP BY 对于筛选数据也非常有用。例如:
SELECT department, COUNT(*) as num_employees
FROM employees
GROUP BY department
HAVING num_employees > 10;
这个查询将会返回一个结果集,其中只包含部门员工数大于 10 的部门。注意:HAVING 子句必须跟在 GROUP BY 子句后面,它针对的是 GROUP BY 分组后的结果。
4. 注意事项
4.1 GROUP BY 子句的顺序
在 GROUP BY 子句中指定的列的顺序非常重要。例如:
SELECT department, job_title, COUNT(*) as num_employees
FROM employees
GROUP BY department, job_title;
这个查询将会按照部门和岗位分组,然后统计每个组内的人数。如果我们改变了列的顺序:
SELECT job_title, department, COUNT(*) as num_employees
FROM employees
GROUP BY job_title, department;
结果将会截然不同,因为分组的顺序不同了。
4.2 GROUP BY 子句与 SELECT 子句
GROUP BY 子句中必须包含 SELECT 子句中所有未汇总的列。例如:
SELECT department, job_title, COUNT(*) as num_employees
FROM employees
GROUP BY department;
这个查询是合法的,因为 SELECT 子句中的列都被汇总了。但是如果我们这样写:
SELECT department, job_title, COUNT(*) as num_employees
FROM employees
GROUP BY department, job_title;
会产生语法错误,因为 SELECT 子句中的 job_title 未被汇总。
4.3 GROUP BY 子句中的聚集函数
在 GROUP BY 子句中也可以使用聚集函数,例如:
SELECT department, MAX(salary) as max_salary
FROM employees
GROUP BY department;
这个查询将会汇总每个部门的最高工资。
5. 总结
GROUP BY 是 SQL 中非常有用的一个关键字,可以用于分组统计、分组筛选等等。在使用 GROUP BY 子句的时候需要注意:分组的顺序、SELECT 子句和 GROUP BY 子句的列、聚集函数的使用等等。希望本文能够对你理解和使用 GROUP BY 有所帮助。