7.组函数及分组统计
应用:例如,把男生分成一组,女生一组,然后求出每一组的平均身高、年龄,这就要用到分组函数
1)组函数
在SQL常用的组函数有:
COUNT():求出全部的记录数
MAX():求出一组中最大值
MIN():求出一组中最小值
AVG():求出平均值
SUM():求和
范例:
SELECT COUNT(empno) FROM emp;
SELECT MIN(sal) FROM emp;
SELECT MAX(sal) FROM emp;
求出20部门的总工资
SELECT SUM(sal) FROM emp WHERE deptno=20;
求出所有员工的平均工资
SELECT AVG(sal) FROM emp;
-
分组统计
a)GROUP BY
要想使用分组统计,则首先应该固定其语法,使用GROUP BY
SELECT DISTINCT *|列名 别名
FROM 表名
{WHERE 条件(s)}
{GROUP BY分组条件{HAVING 分组条件}}
{ORDER BY 排序的字段1,排序的字段2 ASC|DESC}
范例:求出每个部门的雇员数量,即按照部门编号分组
SELECT deptno, COUNT(sal)
FROM emp
GROUP BY deptno;
范例:求出每个部门的平均工资
SELECT deptno, AVG(sal)
FROM emp
GROUP BY deptno;
注意:观察以下代码
在查询的时候以上代码不能正确执行,是因为:
1.如果程序中使用了分组函数,则有两种可以使用的情况:
程序中存在了GROUP BY并指定了分组条件 ,这样可以将分组条件一起查询出来;
如果不使用分组的话,则只能单独的使用组函数
2.在使用分组函数的时候,不能出现分组函数和分组条件之外的字段
范例:
SELECT deptno,empno,COUNT(empno)
FROM emp
GROUP BY deptno;
此时,提示empno不是GROUP BY表达式,所以无法使用
分组统计也支持多表查询
范例:按部门分组,并显示部门名称以及员工数
范例:要求显示出平均工资大于2000的部门编号及平均工资
3.分组函数只能在分组中使用,不允许在WHERE语句中出现,如果要指定分组条件,只能用HAVING
b)HAVING
使用HAVING完成以上操作
范例:显示非销售人员工作名称以及从事同一工作雇员的月工资的综合,并且要满足从事同一工作的雇员的月工资合计大于$5000,输出结果按月工资的合计降序排列。
第一步、显示全部的非销售人员
SELECT *
FROM emp
WHERE job<>'SALESMAN';
第二步、按工作分组,同时求出工资的总和
SELECT job,SUM(sal)
FROM emp
WHERE job<>'SALESMAN'
GROUP BY job;
第三步、对分组的条件进行限制,工资总和大于5000
SELECT job,SUM(sal)
FROM emp
WHERE job<>'SALESMAN'
GROUP BY job HAVING SUM(sal)>5000;
第四步、使用排序,按降序
SELECT job,SUM(sal)
FROM emp
WHERE job<>'SALESMAN'
GROUP BY job HAVING SUM(sal)>5000
ORDER BY SUM(sal) DESC;
分组的简单原则:只要一列上存在重复的内容才有可能考虑到分组
注意:分组函数可以嵌套使用,但是在组函数嵌套使用的时候不能再出现分组条件的查询语句。
范例:求出平均工资最高的部门工资
错误的代码:分组条件deptno不能出现在查询语句中
正确的代码: