图解面试题:你有多久没涨过工资了?

简介:

【题目】

“雇员表“中记录了员工的信息,“薪水表“中记录了对应员工发放的薪水。两表通过“雇员编号”关联。

查找当前所有雇员入职以来的薪水涨幅,给出雇员编号以及其对应的薪水涨幅,并按照薪水涨幅进行升序。
(注:薪水表中结束日期为2004-01-01的才是当前员工,否则是已离职员工)

【解题思路】

要求出当前所有雇员入职以来的薪水涨幅,薪水涨幅=当前薪水-入职薪水。

所以,需要知道雇员的入职薪水和当前薪水。

当前薪水是“薪水表“中的“结束日期”=2004-01-01,这一行对应的薪水。

入职薪水是“雇员表“中的“雇用日期”=“薪水表“中的“起始日期”,这一行对应的薪水。

【解题步骤】

  1. 当前薪水

当前薪水是“薪水表“中的“结束日期”=2004-01-01。从“薪水表“给的案例数据可以看出,“雇员编号”(10002)有两条薪水记录,说明他经历过一次涨薪。“雇员编号”(10005)的薪水“结束日期”不是2004-01-01,说明该员工已经离职。“雇员编号”(10006)有一条薪水记录,说明他没有经历过涨薪。

select 雇员编号,薪水 as 当前薪水
from 薪水表
where 结束日期 = '2004-01-01';

  1. 入职薪水

入职薪水是“雇员表“中的“雇用日期”=“薪水表“中的“起始日期”。

这涉及到两个表,因此需要用到多表联结,拿出《猴子 从零学会SQL》里面的多表联结图。

使用哪种联结呢?

因为题目要求的是“查找当前所有雇员”,所以用“雇员表”为左表,保留左表的全部数据,所以使用左联结。

select a.雇员编号,薪水 as 入职薪水
from 雇员表 as a
left join 薪水表 as b
on a.雇员编号 = b.雇员编号
where a.雇用日期 = b.起始日期;

因为雇员表中还包含了离职员工,而题目要求的是“当前所有雇员“,也就是在职员工,所以需要用where子句筛出在职的员工。也就是结束日期 = '2004-01-01'的员工编号:

where a.雇员编号 in
(select 雇员编号
from 薪水表
where 结束日期 = '2004-01-01');

将两表联结和where条件加入,完整的sql就是:

select a.雇员编号,薪水 as 入职薪水
from 雇员表 as a
left join 薪水表 as b
on a.雇员编号 = b.雇员编号
where a.雇用日期 = b.起始日期 and a.雇员编号 in
(select 雇员编号
from 薪水表
where 结束日期 = '2004-01-01');

3.薪水涨幅

把步骤1的查找结果当做临时表m,把步骤2的查询结果当做临时表n。两表通过“雇员编号”进行多表联结。

使用哪种联结呢?

因为要保留左表(m)的全部数据(在职的全部雇员),所以使用左联结。

select m.雇员编号,当前薪水-入职薪水 as 薪水涨幅
from m
left join n
on m.雇员编号 = n.雇员编号;

4.按薪水涨幅进行升序

使用order by子句对查询结果排序。把表m和表n的sql代码代入,得到:

select m.雇员编号,当前薪水-入职薪水 as 薪水涨幅
from
(select 雇员编号,薪水 as 当前薪水
from 薪水表
where 结束日期 = '2004-01-01') as m
left join
(select a.雇员编号,薪水 as 入职薪水
from 雇员表 as a
left join 薪水表 as b
on a.雇员编号 = b.雇员编号
where a.雇用日期 = b.起始日期 and a.雇员编号 in
(select 雇员编号
from 薪水表
where 结束日期 = '2004-01-01')) as n
on m.雇员编号 = n.雇员编号
order by 薪水涨幅;

【本题考点】

1.考查理解业务的能力。知道如何将“薪水涨幅“指标定义为入职薪水-当前薪水。

2.考查多表联结。需要知道什么情况下使用哪种联结。

【举一反三】

查找所有学生开学以来的成绩涨幅,给出学生编号以及其对应的成绩涨幅,并按照成绩涨幅进行升序。

select m.学生编号,当前成绩-入学成绩 as 成绩涨幅
from
(select 学生编号,成绩 as 当前成绩
from 成绩表
where 结束日期 = '2011-10-02') as m
left join
(select a.学生编号,b.成绩 as 入学成绩
from 学生表 as a
left join 成绩表 as b
on a.学生编号 = b.学生编号
where a.入学日期 = b.起始日期) as n
on m.学生编号 = n.学生编号
order by 成绩涨幅;

推荐:如何从零学会sql?

相关文章
|
监控 编译器 API
[笔记]Windows核心编程《二十二》注入DLL和拦截API(一)
[笔记]Windows核心编程《二十二》注入DLL和拦截API
596 0
|
10月前
|
弹性计算 监控 安全
实测阿里云操作系统控制台:功能、诊断与优化
阿里云操作系统(AliOS)是阿里巴巴专为物联网和智能设备开发的操作系统,提供高效、安全、智能化的解决方案。本文介绍了如何开通和使用阿里云的云服务器ECS,包括注册、选择操作系统、创建用户及授权等步骤。通过控制台,用户可以实时监控设备状态、管理组件、进行性能诊断,并优化资源使用。掌握这些功能有助于提升系统管理和数据处理能力,满足物联网场景的多样化需求。建议进一步丰富系统健康指标和观测功能,以提供更好的用户体验。
562 24
|
10月前
|
存储 消息中间件 NoSQL
【亲测有用】数据中台数据模型管理能力演示
杭州奥零数据科技有限公司成立于2023年,专注于数据中台业务,维护开源项目AllData并提供商业版解决方案。AllData提供数据集成、存储、开发、治理及BI展示等一站式服务,支持AI大模型应用,助力企业高效利用数据价值。
|
12月前
|
Linux 持续交付 调度
HTTPS 证书自动化运维:https证书管理系统-自动化部署
本指南介绍如何部署Linux服务器节点。首先复制生成的Linux脚本命令,然后将其粘贴到目标服务器上运行。接着刷新页面查看节点记录,并点击“配置证书”选择证书以自动部署。最后,节点部署完成,后续将自动调度,无需人工干预。
HTTPS 证书自动化运维:https证书管理系统-自动化部署
|
弹性计算
最新阿里云服务器7月租用费用价格表,ECS降价幅度跳水式!
2024年7月,阿里云服务器推出优惠价格,ECS云服务器2核2G3M带宽99元/年,2核4G5M带宽199元/年。香港30M带宽轻量服务器24元/月,4核8G服务器700元/年。此外,提供不同配置的ECS实例,如ECS经济型、u1实例等,价格从99元到327元不等,具体详情可访问阿里云服务器官方页面。
|
消息中间件 NoSQL 安全
javpower:后端技术革新的开源之旅
🌟 Java后端开发者javpower热衷于开源项目,分享AI、Git、Redis等领域的知识和工具,如JavaVision、EasyGit。擅长JVM优化、数据库事务处理、微服务架构等,积极参与开源社区,为技术世界贡献力量。
627 3
|
算法 程序员
程序员必知:XGB算法梳理
程序员必知:XGB算法梳理
311 0
|
SQL 关系型数据库 数据库连接
ClickHouse(20)ClickHouse集成PostgreSQL表引擎详细解析
ClickHouse的PostgreSQL引擎允许直接查询和插入远程PostgreSQL服务器的数据。`CREATE TABLE`语句示例展示了如何定义这样的表,包括服务器信息和权限。查询在只读事务中执行,简单筛选在PostgreSQL端处理,复杂操作在ClickHouse端完成。`INSERT`通过`COPY`命令在PostgreSQL事务中进行。注意,数组类型的处理和Nullable列的行为。示例展示了如何从PostgreSQL到ClickHouse同步数据。一系列的文章详细解释了ClickHouse的各种特性和表引擎。
631 0
|
Linux 网络安全 开发工具
kali/debain/linux包管理
kali/debain/linux包管理
521 0
|
消息中间件 NoSQL 安全
面试官必问的 3 道 MQ 面试题,还有谁不会??
面试官必问的 3 道 MQ 面试题,还有谁不会??
479 0
面试官必问的 3 道 MQ 面试题,还有谁不会??