-- 聚合运算
-- 查询emp表中员工总数、最高工资、最低工资、平均工资及工资总和
select
count(*) as 员工总数,
max(sal) as 最高工资,
min(sal) as 最低工资,
avg(sal) as 平均工资,
sum(sal) as 工资总和
from emp;
select
count(deptno) as 员工总数,
count(*) as 员工总数,
count(1) as 员工总数,
count(distinct deptno) as 部门总数
from emp;-- 前面三种都是求员工总数 ,单数count(*)和count(1)计算速度更快
-- 分组查询
-- 查询各部门的平均工资
select deptno, avg(sal) as 平均工资
from emp
group by deptno;
-- 查询各部门不同职位的平均工资
select deptno,job,avg(sal) as 平均工资
from emp
group by deptno, job;
-- 练习:查询各部门的员工数
select * from emp;-- 查询总人数,给代码与该练习无关,只是为了核对结果正确性
select deptno,count(deptno) as 部门员工总数
from emp
group by deptno;
-- 练习:查询各部门不同职位的人数
-- 分组后筛选
-- 查询各部门clerk的平均工资
select deptno,job,avg(sal) as 平均工资
from emp
group by deptno, job having job='clerk';
select deptno, job, avg(sal) as平均工资
from emp
where job='clerk'
group by deptno, job;-- 方法二
-- 查询平均工资大于2000的部门
select deptno,avg(sal) as 平均工资
from emp
group by deptno
where avg(sal)>2000;-- 报错原因是书写顺序 where需要在group by之前
select deptno,avg(sal) as 平均工资
from emp
where avg(sal)>2000
group by deptno;-- 报错原因是where 不能用聚合函数,因为SQL顺序是先from-where-group by-having-select-order by-limint,group by的同时聚合,where在group by之前聚合还没有产生
select deptno,avg(sal) as 平均工资
from emp
group by deptno
having avg(sal)>2000;-- 正确表达方式
select deptno,avg(sal) as 平均工资
from emp
group by deptno
having 平均工资>2000;-- 仅限于My SQL 5.7.5及之后的版本可以使用,平均工资是在select产生的,而having 在select 前面 ,不正确的书写方式 要避免