有这样的一张员工表,有不同职位。查询不同的职位有多少人。这些跟统计相关的查询,我们使用分组查询;
基本语法
group by 后跟具体的字段。
- 查询公司的职位有哪些;
select position from emps;
我们希望看到的是 去重之后的结果;
使用 group by 语法
select position from emps group by position;
group by 在使用的时候,需要大家注意, group by 后面跟的字段,与前面select查询的字段 要保持一致。
查询 emps 表中 salary 并去重;
select salary from emps group by salary;
在分组中也可以进行排序, 使用 order by.
使用顺序
按照salary 分组,分组完成之后按照金额的大小 升序排序。
select salary from emps group by salary order by salary asc;
按照 join 入职日期的 年份(Year)分组, 并按照降序排序。
SELECT YEAR(join_in) from emps GROUP BY YEAR(join_in) ORDER BY YEAR(join_in) desc;
查询入职最早的员工
-- 查询入职最早的员工
select join_in from emps where position = "员工" ORDER BY join_in asc limit 1 ;
select * from emps
WHERE join_in = (select join_in from emps where position = "员工" ORDER BY join_in asc limit 1)
and position = "员工";
聚合函数
跟group by 一起常用来统计数据的函数
函数名 | 说明 |
---|---|
max() | 最大值 |
min() | 最小值 |
avg() | 平均值 |
sum() | 总和 |
count() | 总数 |
统计emps 表中每个职位的人数
select position, count(position) from emps group by position;
统计入职日期 按年份year, 统计 每年的入职人数;
SELECT YEAR(join_in), COUNT(*) from emps GROUP BY YEAR(join_in) order by YEAR(join_in);
统计公司总人数
-- 3 统计公司的总人数
select count(*) from emps;
最高薪水。
select max(salary) from emps;
最低薪水。
select min(salary) from emps;
平均薪水。
select avg(salary) from emps;
每月支付的总薪水。
select sum(salary) from emps;
统计每个职位的最高薪水。
select position, max(salary) from emps GROUP BY position;
统计每个职位的最低薪水。
select position, min(salary) from emps GROUP BY position;
统计每个职位平均薪水。
select position, avg(salary) from emps GROUP BY position;
统计每个职位的总薪水。
select position, sum(salary) from emps GROUP BY position;
select position, max(salary), min(salary), avg(salary), sum(salary) from emps GROUP BY position;
练习
- 薪资最高的人员信息 ```sql — 1. 找到最高薪资 select max(salary) from emps;
— 2. 根据最高薪资找人 select * from emps where salary = (select max(salary) from emps);
2. 薪资第二高的人员信息
```sql
-- 1. 找到第二高薪资
SELECT salary from emps GROUP BY salary ORDER BY salary desc LIMIT 1,1;
-- 2. 根据值找到对应的人员
SELECT * from emps
WHERE salary = (SELECT salary from emps GROUP BY salary ORDER BY salary desc LIMIT 1,1);
group by 与distinct 去重
distinct 针对数据结果进行去重。
- 针对职位进行去重.
也可以使用 distinct 进行去重select position from emps group by position;
select distinct(position) from emps;
distinct() 只能对数据结果进行去重,不能进行数据统计。
这样写 会报错
SELECT DISTINCT(position), COUNT(position) from emps;
面试问题
如果有一张表中,有很多重复的数据,去重有哪些方法?
💎使用group by 或者 distinct 可以去重
从一张表中找出薪资最高的人员信息。
👌可以分两步。
- 先找最高的薪资。
- 使用子查询的方式 根据最高薪资找对应的人。
- 计算每个同学的总成绩 并按照降序方式排序
select name, sum(score) from person group by name
order by sum(score) desc;
总结
在做汇总操作的时候,
确定要查询对象
比如按照name分组, select name 如果是按照birthday的年份分组, select year(birthday)
汇总数据的时候 使用 聚合函数。
- 一定记得分组,group by 后面跟 查询对象。