如何将表中的数据分组?
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
子句进行结果排序,即ROLLUOP
和ORDER 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;