基本使用
需求:查询各个部门的平均工资
可以使用 GROUP BY
子句将表中的数据分成若干组
# 语法
SELECT column, group_function(column)
FROM table
[WHERE condition]
[GROUP BY group_by_expression]
[ORDER BY column];
明确:WHERE 一定放在 FROM 后面
在 SELECT 列表中所有未包含在组函数中的列都应该包含在 GROUP BY 子句中
SELECT department_id, AVG(salary)
FROM employees
GROUP BY department_id ;
包含在 GROUP BY 子句中的列不必包含在 SELECT 列表中
SELECT AVG(salary)
FROM employees
GROUP BY department_id ;
使用多个列分组
需求:查询各个 department_id 下的 job_id 的总工资
SELECT department_id dept_id, job_id, SUM(salary)
FROM employees
GROUP BY department_id, job_id ;
:::warning 注意:SELECT 中出现的非组函数的字段必须声明在 GROUP BY 中,MySQL 不会报错但结果错误。GROUP BY 中声明的字段可以不出现在 SELECT 中,但可读性下降 :::
# 错误
SELECT department_id dept_id, job_id, SUM(salary)
FROM employees
GROUP BY department_id;
:::info GROUP BY 声明在 FROM 、WHERE 后面,ORDER BY 、LIMIT 前面 :::
GROUP BY 中使用 WITH ROLLUP
使用 WITH ROLLUP
关键字之后,在所有查询出的分组记录之后增加一条记录,该记录计算查询出的所有记录的总和,即统计记录数量。
SELECT department_id,AVG(salary)
FROM employees
WHERE department_id > 80
GROUP BY department_id WITH ROLLUP;
注意:当使用 ROLLUP
时,不能同时使用 ORDER BY
子句进行结果排序,即 ROLLUP
和 ORDER BY
是互相排斥的。