但我们要统计一个的部门的平均工资的时候,可以使用
SELECT AVG(*) avg
FROM students
WHERE job_id = 50;来进行统计。
如果要继续统计部门号为20,30的平均工资,难道必须不断修改WHERE条件来执行SELECT语句吗?
对于分组查询,SQL还提供了“分组聚合”的功能。
例如:
-- 按job_id分组:
SELECT AVG(salary) avg
FROM employees
GROUP BY job_id;
执行这个查询,AVG()的结果不再是一个,而是10个,这是因为,GROUP BY子句指定了按job_id分组,因此,执行该SELECT语句时,会把job_id相同的列先分组,再分别计算,因此,得到了10行结果。
但是这10行结果分别是哪个部门的,不好看出来,所以我们可以把job_id列也放入结果集中:
-- 按job_id分组:
SELECT job_id AVG(salary) avg
FROM employees
GROUP BY job_id;
这下结果集就可以一目了然地看出各个部门的平均工资。我们再试试把employee_id放入结果集:
-- 按class_id分组:
SELECT employee_id, job_id AVG(salary) avg
FROM employees
GROUP BY job_id;
然后我们执行这条查询,这个时候我们会得到一个语法错误,因为在任意一个分组中,只有job_id都相同,employee_id是不同的,SQL引擎不能把多个employee_id的值放入一行记录中。
因此,分组查询的列中,只能放入分组的列。
也可以使用多个列进行分组。例如,我们想统计各个部门员工工资和平均工资有多少一样的:
-- 按job_id, salary分组:
SELECT job_id AVG(salary) avg
FROM employees
GROUP BY job_id,salary;
上面查询结果集一共有10条记录,分别对应各个部门员工工资和平均工资有多少一样的。