圖解面試題:你有多久沒漲過工資了?

【題目】

“僱員表“中記錄了員工的信息,“薪水錶“中記錄了對應員工發放的薪水。兩表通過“僱員編號”關聯。

查找當前所有僱員入職以來的薪水漲幅,給出僱員編號以及其對應的薪水漲幅,並按照薪水漲幅進行升序。

(注:薪水錶中結束日期爲2004-01-01的纔是當前員工,否則是已離職員工)

【解題思路】

要求出當前所有僱員入職以來的薪水漲幅,薪水漲幅=當前薪水-入職薪水

所以,需要知道僱員的入職薪水和當前薪水。

當前薪水是“薪水錶“中的“結束日期”=2004-01-01,這一行對應的薪水。

入職薪水是“僱員表“中的“僱用日期”=“薪水錶“中的“起始日期”,這一行對應的薪水。

【解題步驟】

1. 當前薪水

當前薪水是“薪水錶“中的“結束日期”=2004-01-01。從“薪水錶“給的案例數據可以看出,“僱員編號”(10002)有兩條薪水記錄,說明他經歷過一次漲薪。“僱員編號”(10005)的薪水“結束日期”不是2004-01-01,說明該員工已經離職。“僱員編號”(10006)有一條薪水記錄,說明他沒有經歷過漲薪。

select 僱員編號,薪水 as 當前薪水
from 薪水錶
where 結束日期 = '2004-01-01';

2. 入職薪水

入職薪水是“僱員表“中的“僱用日期”=“薪水錶“中的“起始日期”。

這涉及到兩個表,因此需要用到多表聯結,拿出《猴子 從零學會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?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章