Mysql group by 用法
GROUP BY
是 SQL 中一个非常重要的子句,主要用于结合聚合函数对数据进行分组统计和分析。下面为你详细介绍它的作用和用法。
作用
GROUP BY
子句的核心作用是将查询结果按照指定的列或表达式进行分组。分组后,数据库会将相同值的行归为一组,然后可以对每个组应用聚合函数,如 SUM()
、COUNT()
、AVG()
、MIN()
、MAX()
等,从而得到每个组的汇总信息。这样可以方便地对数据进行统计和分析,例如统计每个部门的员工数量、每个产品的销售总额等。
1. 简单分组统计
假设有一个 employees
表,包含 department_id
(部门编号)和 salary
(工资)两列,我们可以使用 GROUP BY
统计每个部门的员工数量:
SELECT department_id, COUNT(*) AS employee_count
FROM employees
GROUP BY department_id;
2. 结合其他聚合函数
同样使用 employees
表,我们可以统计每个部门的平均工资:
SELECT department_id, AVG(salary) AS average_salary
FROM employees
GROUP BY department_id;
3. 按多个列分组
如果 employees
表还有 job_title
(职位名称)列,我们可以按部门和职位分组,统计每个部门每个职位的员工数量:
SELECT department_id, job_title, COUNT(*) AS employee_count
FROM employees
GROUP BY department_id, job_title;
解释:
GROUP BY department_id, job_title
:按照department_id
和job_title
两列进行分组,将department_id
和job_title
都相同的记录归为一组
与 WHERE
和 HAVING
子句结合使用
1. 与 WHERE
子句结合
WHERE
子句用于在分组之前筛选记录。例如,我们只统计工资大于 5000 的员工所在部门的员工数量:
SELECT department_id, COUNT(*) AS employee_count
FROM employees
WHERE salary > 5000
GROUP BY department_id;
- 解释:
WHERE salary > 5000
:在分组之前筛选出salary
大于 5000 的记录,然后再进行分组统计。
2. 与 HAVING
子句结合
HAVING
子句用于在分组之后筛选分组结果。例如,我们只显示员工数量大于 10 的部门:
SELECT department_id, COUNT(*) AS employee_count
FROM employees
GROUP BY department_id
HAVING employee_count > 10;
- 解释:
HAVING employee_count > 10
:在分组统计完成后,筛选出employee_count
大于 10 的分组。
注意事项
- 在
SELECT
语句中,除了聚合函数,其他列必须出现在GROUP BY
子句中。例如:-- 错误示例 SELECT department_id, salary FROM employees GROUP BY department_id;
上述示例中,
salary
列既不是聚合函数的参数,也不在GROUP BY
子句中,会导致语法错误。 GROUP BY
子句通常在WHERE
子句之后、ORDER BY
子句之前使用。其执行顺序一般为:FROM
->WHERE
->GROUP BY
->HAVING
->SELECT
->ORDER BY
。
通过合理使用 GROUP BY
子句,可以对数据库中的数据进行有效的分组统计和分析,从而提取出有价值的信息。