SQL面试题-刷题模式

574 阅读4分钟

Day6:每天刷1道SQL,不信你面试还挂在SQL上

查找所有员工入职时候的薪水情况,给出emp_no以及salary, 并按照emp_no进行逆序(请注意,一个员工可能有多次涨薪的情况)

CREATE TABLE `employees` (
`emp_no` int(11) NOT NULL,
`birth_date` date NOT NULL,
`first_name` varchar(14) NOT NULL,
`last_name` varchar(16) NOT NULL,
`gender` char(1) NOT NULL,
`hire_date` date NOT NULL,
PRIMARY KEY (`emp_no`));
CREATE TABLE `salaries` (
`emp_no` int(11) NOT NULL,
`salary` int(11) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`from_date`));

😊:“读题,入职时候的薪水,加上提示一个员工有多次涨薪的情况,所以本质上是求解每个员工的最低薪水,还要按照emp_no降序排列。

阿,求每个员工的薪水最小值,用group by就可以实现,要输出的字段在salaries这张表中都有,所以别看他给了2张表,只需要1张表就能算出结果。上答案:

select emp_no,
       min(salary)
from salaries
group by emp_no
order by emp_no desc

😄:阔以!知不知道还有其他的解决方式呢?

这里 · 正解

1. 按薪资最小值筛
select emp_no,
       min(salary)
from salaries
group by emp_no
order by emp_no desc
2. 按入职时间筛

所有员工入职道日期都不是同一天,意味着什么?找最晚入职的员工,是不是就是入职日期最大这个?

select emp_no,salary
from salaries
group by emp_no
having min( from_date )
order by emp_no desc
3. 还可以这样解…

员工信息表中记录了每一位员工的入职时间,薪资发放记录表中呢,记录了每一次发薪的起、止时间。

那么对于新员工入职后第一次发放的薪资,开始时间应该是等于入职时间的,截止之间应该是薪资核算周期的期末时间。所以,可以通过2张表的关联来实现。

select t1.emp_no,t1.salary
from salaries t1 inner join employees t2
on t1.emp_no = t2.emp_no and t1.from_date = t2.hire_date
order by t1.emp_no desc

今日知识点

  1. group by分组聚合,这就是Excel中透视表的功能,按一个字段分组后聚合,按多个字段分组后聚合都是可以的。如果你不能很好的理解,请去Excel透视表里拖拖拽拽辅助理解。
  2. group by having组合用法

在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与聚合函数一起使用。HAVING 子句可以让我们筛选分组后的各组数据。So,just treat ‘having’ as ‘where’!

让思绪再飞一会儿…
一天1道题,轻松学习。
Day1:每天刷1道SQL,不信面试你还挂在SQL上
Day2:每天刷1道SQL,不信面试你还挂在SQL上
Day3:每天刷1道SQL,不信面试你还挂在SQL上
Day4:每天刷1道SQL,不信面试你还挂在SQL上
Day5:每天刷1道SQL,不信面试你还挂在SQL上
扫描二维码 关注我们,💁提供职业规划、简历指导、面试辅导服务哦
数据分析之家
QQ交流群:254674155
在这里插入图片描述