基本使用

需求:查询各个部门的平均工资
1554981374920.png
可以使用 GROUP BY 子句将表中的数据分成若干组

  1. # 语法
  2. SELECT column, group_function(column)
  3. FROM table
  4. [WHERE condition]
  5. [GROUP BY group_by_expression]
  6. [ORDER BY column];

明确:WHERE 一定放在 FROM 后面

在 SELECT 列表中所有未包含在组函数中的列都应该包含在 GROUP BY 子句中

  1. SELECT department_id, AVG(salary)
  2. FROM employees
  3. GROUP BY department_id ;

包含在 GROUP BY 子句中的列不必包含在 SELECT 列表中

  1. SELECT AVG(salary)
  2. FROM employees
  3. GROUP BY department_id ;

使用多个列分组

需求:查询各个 department_id 下的 job_id 的总工资
1554981607442.png

  1. SELECT department_id dept_id, job_id, SUM(salary)
  2. FROM employees
  3. GROUP BY department_id, job_id ;

:::warning 注意:SELECT 中出现的非组函数的字段必须声明在 GROUP BY 中,MySQL 不会报错但结果错误。GROUP BY 中声明的字段可以不出现在 SELECT 中,但可读性下降 :::

  1. # 错误
  2. SELECT department_id dept_id, job_id, SUM(salary)
  3. FROM employees
  4. GROUP BY department_id;

:::info GROUP BY 声明在 FROM 、WHERE 后面,ORDER BY 、LIMIT 前面 :::

GROUP BY 中使用 WITH ROLLUP

使用 WITH ROLLUP 关键字之后,在所有查询出的分组记录之后增加一条记录,该记录计算查询出的所有记录的总和,即统计记录数量。

  1. SELECT department_id,AVG(salary)
  2. FROM employees
  3. WHERE department_id > 80
  4. GROUP BY department_id WITH ROLLUP;

注意:当使用 ROLLUP 时,不能同时使用 ORDER BY 子句进行结果排序,即 ROLLUPORDER BY 是互相排斥的。