mysql 自我练习基础 3:查询 聚合运算

-- 聚合运算
-- 查询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 前面 ,不正确的书写方式 要避免

 

posted @ 2021-10-06 12:51  charlly  阅读(158)  评论(0)    收藏  举报