image.png
有这样的一张员工表,有不同职位。查询不同的职位有多少人。这些跟统计相关的查询,我们使用分组查询;


基本语法

group by 后跟具体的字段。

  1. 查询公司的职位有哪些;
    1. select position from emps;
    image.png
    我们希望看到的是 去重之后的结果;

使用 group by 语法

  1. select position from emps group by position;

image.png


group by 在使用的时候,需要大家注意, group by 后面跟的字段,与前面select查询的字段 要保持一致。

查询 emps 表中 salary 并去重;

  1. select salary from emps group by salary;

image.png
在分组中也可以进行排序, 使用 order by.
使用顺序
Mysql-03 分组查询 - 图5

按照salary 分组,分组完成之后按照金额的大小 升序排序。

  1. select salary from emps group by salary order by salary asc;

按照 join 入职日期的 年份(Year)分组, 并按照降序排序。

  1. SELECT YEAR(join_in) from emps GROUP BY YEAR(join_in) ORDER BY YEAR(join_in) desc;

查询入职最早的员工

  1. -- 查询入职最早的员工
  2. select join_in from emps where position = "员工" ORDER BY join_in asc limit 1 ;
  3. select * from emps
  4. WHERE join_in = (select join_in from emps where position = "员工" ORDER BY join_in asc limit 1)
  5. and position = "员工";

聚合函数

跟group by 一起常用来统计数据的函数

函数名 说明
max() 最大值
min() 最小值
avg() 平均值
sum() 总和
count() 总数
  1. 统计emps 表中每个职位的人数

    1. select position, count(position) from emps group by position;
  2. 统计入职日期 按年份year, 统计 每年的入职人数;

  1. SELECT YEAR(join_in), COUNT(*) from emps GROUP BY YEAR(join_in) order by YEAR(join_in);
  1. 统计公司总人数

    1. -- 3 统计公司的总人数
    2. select count(*) from emps;
  2. 最高薪水。

    1. select max(salary) from emps;
  3. 最低薪水。

    1. select min(salary) from emps;
  4. 平均薪水。

    1. select avg(salary) from emps;
  5. 每月支付的总薪水。

    1. select sum(salary) from emps;

  1. 统计每个职位的最高薪水。

    1. select position, max(salary) from emps GROUP BY position;
  2. 统计每个职位的最低薪水。

    1. select position, min(salary) from emps GROUP BY position;
  3. 统计每个职位平均薪水。

    1. select position, avg(salary) from emps GROUP BY position;
  4. 统计每个职位的总薪水。

    1. select position, sum(salary) from emps GROUP BY position;
    1. select position, max(salary), min(salary), avg(salary), sum(salary) from emps GROUP BY position;

练习

  1. 薪资最高的人员信息 ```sql — 1. 找到最高薪资 select max(salary) from emps;

— 2. 根据最高薪资找人 select * from emps where salary = (select max(salary) from emps);

  1. 2. 薪资第二高的人员信息
  2. ```sql
  3. -- 1. 找到第二高薪资
  4. SELECT salary from emps GROUP BY salary ORDER BY salary desc LIMIT 1,1;
  5. -- 2. 根据值找到对应的人员
  6. SELECT * from emps
  7. WHERE salary = (SELECT salary from emps GROUP BY salary ORDER BY salary desc LIMIT 1,1);

group by 与distinct 去重

distinct 针对数据结果进行去重。

  1. 针对职位进行去重.
    1. select position from emps group by position;
    也可以使用 distinct 进行去重
    1. select distinct(position) from emps;
    image.png

distinct() 只能对数据结果进行去重,不能进行数据统计。

这样写 会报错

  1. SELECT DISTINCT(position), COUNT(position) from emps;

image.png

面试问题

  1. 如果有一张表中,有很多重复的数据,去重有哪些方法?

    💎使用group by 或者 distinct 可以去重

  2. 从一张表中找出薪资最高的人员信息。

    👌可以分两步。

    1. 先找最高的薪资。
    2. 使用子查询的方式 根据最高薪资找对应的人。

image.png

  1. 计算每个同学的总成绩 并按照降序方式排序
    1. select name, sum(score) from person group by name
    2. order by sum(score) desc;

总结

在做汇总操作的时候,

  1. 确定要查询对象

    比如按照name分组, select name 如果是按照birthday的年份分组, select year(birthday)

  2. 汇总数据的时候 使用 聚合函数。

  3. 一定记得分组,group by 后面跟 查询对象。