1.聚合函数
聚合函数又称为统计函数
常用函数:
count()计数、总数量
max()最大值
min()最小值
sum()求和
avg()求平均值
round()四舍五入
例如:查询部门为30的雇员人数?
select count(empno) 总人数 from emp where deptno='30'; select deptno 部门编号,count(empno) 总人数 from emp where deptno='10'; select max(sal) from emp; select min(sal) from emp;
注意:聚合函数在统计时会忽略null值
练习:
查询部门为30的最高工资,最低工资和平均工资?
select deptno 部门编号,max(sal) 最高工资,min(sal) 最低工资,round(avg(sal),2) 平均工资 from emp where deptno='30';
2.分组统计
2.1语法
select 字段名 别名,... from 表名 别名,... inner join 表名1 别名1 on 多表之间的关联关系 where 条件 group by 分组条件 having 分组后的条件 order by 排序字段1[asc丨desc],排序字段2[asc丨desc]...;(升|降)
2.2示例
应用场景:
1.查询题意中出现了每个、各个、按...这种字眼----每个谁就按谁分组
2.查询结果中存在聚合函数计算得到的结果,如最大、最小、求和、计数、求平均。
例如:查询每个部门的平均工资?
select deptno,round(avg(sal)) 平均工资 from emp group by deptno;
如果想出现部门名称:
select d.deptno,d.dname,round(avg(sal),2) 平均工资 from emp e inner join dept d on e.deptno=d.deptno group by deptno;
注意:
在MySQL中分组统计时可以查询出分组列以外的其他列,而oracle不行
建议将要查询出的列作为分组列
练习:
查询部门名称及每个部门的员工数量?
select d.dname 部门名称,count(e.empno) from emp e inner join dept d on e.deptno=d.deptno group by 部门名称;
例如:查询平均工资大于2000的部门编号和平均工资?
select d.deptno 部门编号,round(avg(sal),2) 平均工资 from dept d,emp e where d.deptno=e.deptno group by 部门编号 having 平均工资>2000;
写在having不在where的原因:优先级不同,先分组在查询
例如:查询非销售人员的职位名称,以及从事同一工作的雇员工资总和,并且要满足总和大于5000,查询雇员按月工资总和升序排列
select job 职位,sum(sal) sum 工资总和 from emp where job <> 'salesman' group by job having 工资总和>5000 order by 工资总和;
例如:查询部门平均工资的最大值
select max(avg(sal)) from emp group by deptno;----mysql不支持
在MySQL中聚合函数不能请嵌套使用,而oracle可以
select max(tt.平均工资) from (select avg(sal) 平均工资 from emp group by deptno) tt;