GROUP BY的使用 [MySQL][数据库]

GROUP BY的使用

GROUP BY的作用:

将表中的数据分成若干组

下面我们通过几个例子来理解GROUP BY分组操作

eg1: 查询公司中各个部门的平均工资,以及公司中各个部门的最高工资

SELECT employees_id,AVG(salary),SUM(salary)
FROM employees
GROUP BY department_id;
  • 这个时候我们就是根据表中的department_id(也就是部门id)进行了分组,然后通过聚合函数(分组函数)求得了各个分组中的平均工资和最高工资

eg2:查询各个job_id(工种)的平均工资

SELECT job_id,AVG(salary),SUM(salary)
FROM employees
GROUP BY job_id;
  • 这个时候我们就是根据表中的job_id(也就是工种)进行了分组,然后通过聚合函数(分组函数)求得了各个分组中的平均工资和最高工资

前面我们都是对单个字段进行分组,下面我们就来说明如何使用多个列进行分组

什么叫做使用多列进行分组?

  • 比如: 我们对department_id字段和job_id字段进行多列排序那么就是将department_id和job_id都相同的记录分为一组

下面我们通过一个例子来理解对多列的分组操作

eg: 查询各个department_id中各个job_id下的平均工资(这里解决这个问题有两种方式:)

方式一:

SELECT department_id,job_id,AVG(salary)
FROM employees
GROUP BY department_id,job_id;

方式二:

SELECT department_id,job_id,AVG(salary)
FROM employees
GROUP BY job_id,department_id;
  • 这两种方式其实都是可以解决这个问题的,一个是在GROUP BY子句中将department_id放在前面,一个是将job_id放在前面
    • 其实将department_id放在前面就是求各个department_id中各个job_id下的平均工资,而将job_id放在前面,将department_id放在后面就是求各个job_id中各个的department_id下的平均工资,但是这两个问题我们分析后可以发现其实是一个问题,所以这两种方式都可以解决这个问题

关于使用GROUP BY进行分组操作中可能出现的问题的分析:

错误方式一:

SELECT department_id,job_id,AVG(salary)
FROM BY department_id;
  • 这种方式下我们是根据department_id进行分析的,这个时候每个部门又可以分为一个组,假如这个时候有20个部门,那么这个时候我们就会查询出来20个字段,但是我们在执行查询操作的时候还查询了job_id,一个部门中可能会有多个job_id(工种),那么这个时候一条记录如何显示多个job_id的值?
    • 这个时候显然是显示不出来的,也就是这种方式就是错误的,我们如果是在Oracle中尝试执行我们可以发现这个时候是执行不了的, 如果这个时候是在MySQL中,这个时候是可以执行出来,但是执行出来的结果中每个department_id中只显示一个job_id,也就是即使在MySQL中可以执行,但是执行的结果也是错误的

结论: SELECT中出现的非分组函数的字段必须声明在GROUP BY中,但是GROUP BY中声明的字段可以不出现在SELECT中

补充一:

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

补充二:

MySQL中GROUP BY中使用WITH ROLLUP(这个GROUP BY后面使用WITH ROLLUP是一个新特性)

  • 使用了WITH ROLLLUP之后的作用:
  • 在所有查询出的分组记录之后增加一条记录,该记录就是所有组合并成为一个大组之后计算

这里我们通过一个例子来理解WITH ROLLUP的使用

SELECT department_id,job_id,AVG(salary)
FROM employees
GROUP BY department_id WITH ROLLUP;
  • 这个时候使用了group by进行了分组求各个部门中的平均工资,但是我们可以发现我们在group by后面还加了with rollup,那么这个时候就会在查询出的各个部门中的平均工资的后面补充一条记录,这条记录中显示的就是公司中所有员工的平均工资,这个时候其实就是将所有的分组合并成一个大组 — 也就是将公司中所有员工分成一个组,然后对这个组进行操作,求工资的平均值,那么也就是求了公司中所有员工的平均工资

补充三:

当使用with rollup时,不能同时使用order by子句进行排序,也就是with rollup和order by是相互排斥的

  • 也就是当我们使用了order by要对查询结果进行排序的时候,那么这个时候我们使用group by分组的时候就不能再group by后面加with rollup

猜你喜欢

转载自blog.csdn.net/m0_57001006/article/details/123701066