【MySQL】如何将表中的数据分组?

如何将表中的数据分组?

MySQL中可以使用GROUP BY子句将表中的数据分成若干组。

例:员工表employees中包含不同部门

在这里插入图片描述

需求1:我想查询不同部门的平均薪资有什么不同,就可以在查询语句中使用GROUP BY子句:

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

需求2:查询各个department_id,job_id的平均工资

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

GROUP BY使用要点

1.SELECT中出现的非组函数的字段必须声明在GROUP BY中。反之,GROUP BY中声明的字段可以不出现在SELECT中。

例如下面这段SQL,SELECT后面的job_id没有出现在GROUP BY后面,运行会报错。

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

2.使用位置

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

3.新特性:GROUP BY中使用WITH ROLLUP

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

SELECT department_id,AVG(salary)
FROM employees
WHERE department_id
GROUP BY department_id WITH ROLLUP;

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

HAVING

1.如果在过滤条件中使用了聚合函数,则必须使用HAVING来替换WHERE。否则,将会报错。另外,HAVING必须声明在GROUP BY前面。
例如:

SELECT department_id,MAX(salary)
FROM employees
GROUP BY department_id
HAVING MAX(salary) > 10000;

2.开发中,我们使用HAVING的前提是SQL中使用了GROUP BY

3.过滤条件包含聚合函数和其他时,在HAVING后面写聚合函数条件,在WHERE后面写其他过滤条件,这样效率比只使用HAVING高。
例如:

SELECT department_id,MAX(salary)
FROM employees
WHERE department_id IN (10,20,30,40)
GROUP BY department_id 
HAVING MAX(salary) > 10000;

猜你喜欢

转载自blog.csdn.net/hold_on_qlc/article/details/130479214