4道面試題,測測你的SQL能力是否達標!
來? 源:小小的SQL學習筆記/作? 者:小小

熟練SQL技能
是招聘數(shù)據(jù)分析的硬性要求
SQL面試如何考?
必考題型有哪些?
今天通過4道SQL面試題
測測你的SQL能力是否達標!
01
寫出下面語句的實際執(zhí)行順序:
①?SELECT?[DISTINCT]?
②?FROM
③?WHERE
④?GROUP?BY
⑤?HAVING
⑥?UNION
⑦?ORDER?BY
解題思路:
SQL子句邏輯執(zhí)行順序:From → Where ?→ Group by → Having → Select → Distinct → Union → Order by
02
如下為某公司8月份的員工薪資表。請根據(jù)各小題的需求,用代碼實現(xiàn)。

問1:輸出第一個名字(First_name)包含‘o’的所有雇員信息,并按薪資降序排列;
參考代碼:

問2:輸出總支出工資大于1500000 的部門和對應的支出,按降序排序。
參考代碼:

03
題干:現(xiàn)數(shù)據(jù)庫中有如下兩張表,一張為員工信息表,一張為員工獎金表。請根據(jù)各小題的輸出結(jié)果,用一句SQL語句進行查詢。


問1:輸出First_name中包含o的所有雇員信息,并按薪資降序排列。
輸出結(jié)果如下:

解析:
本小題主要考察的是like的模糊查詢,以及order by排序的用法,考核的是大家對基礎知識的掌握。
參考答案:
select?*
from?Employee
where?First_name?like?'%o%'
order?by?Salary?desc;
問2:輸出每月的總支出工資大于1500000的部門和對應的支出,按降序排序。
輸出結(jié)果如下:

解析:
本小題主要考察的是having與where的區(qū)別及使用,having和where都是條件篩選,但是where的執(zhí)行順序是在from之后,group by之前的,而having是在這三者之后,并且是在聚合函數(shù)之后,所以本題可以直接使用having來進行條件的篩選,當然也可以使用子查詢,再使用where進行條件的篩選
參考答案:
select?Department?as?dept_name,
?????sum(salary)?as?tatol_salary
from?Employee
group?by?Department
having?sum(salary)>1500000
order?by?tatol_salary?desc;
04
不同城市、不同性別,2019年支付金額最高的 TOP 10用戶(使用user_info 用戶信息表;user_order 用戶訂單表)。


解題思路
Step1:在訂單信息表中,每一個用戶可以重復下單,所以在這里可以先得到每一個用戶在2019年的總支付金額;
SELECT??user_id
???????,sum(pay_amount)?pay_amount
FROM?user_trade
WHERE?year(dt)=2019
GROUP?BY?user_id
Step2:接著通過公共字段 user_id將用戶訂單表和用戶信息表進行關(guān)聯(lián),獲得包含城市、性別的寬表,然后再通過窗口函數(shù)row_number對不同城市,不同性別的用戶進行排名標記;
SELECT???a.user_name,
?????????b.city,
?????????b.sex,
?????????a.pay_amount,
?????????row_number()?over(partition?by?b.city,b.sex?order?by?a.pay_amount?desc)?rank
FROM(SELECT??user_id
?????????????,sum(pay_amount)?pay_amount
??????FROM?user_order???
??????WHERE?year(dt)=2019
??????GROUP?BY?user_id)a
LEFT?JOIN?user_info?b?on?a.user_id?=?b.user_id
Step3:最后通過嵌套一個子查詢,使用where子句作為篩選條件,篩選出Top10的用戶即可;
--?4.每個城市、不同性別,2019年支付金額最高的TOP10用戶?--
SELECT??c.user_name,
????????c.city,
????????c.sex,
????????c.pay_amount,
????????c.rank
FROM(SELECT???a.user_name,
??????????????b.city,
??????????????b.sex,
??????????????a.pay_amount,
??????????????row_number()?over(partition?by?b.city,b.sex?order?by?a.pay_amount?desc)?rank
??????FROM
??????(SELECT??user_id
???????????????,sum(pay_amount)?pay_amount
??????FROM?user_order???
??????WHERE?year(dt)=2019
??????GROUP?BY?user_id)a
??????LEFT?JOIN?user_info?b?on?a.user_id?=?b.user_id)c
WHERE?c.rank<=10;
面試SQL會有哪些題型?
第一種:構(gòu)建表結(jié)構(gòu)
面試官會給你一個業(yè)務場景,你認為需要建幾張表,每張表的結(jié)構(gòu)字段是什么,表跟表之間的關(guān)聯(lián)關(guān)系是什么?
這種問題他主要考察你對于業(yè)務的理解,構(gòu)建表結(jié)構(gòu)的一個能力。最基本的局部建表,包括外建、主建等等。
第二種:多表聯(lián)查
給你幾張表,讓你進行復雜查詢的實現(xiàn)。
這個主要針對多表多列字段進行嵌套,子查詢等。
第三種:窗口函數(shù)
主要有三種,聚合開窗函數(shù)、排序開窗函數(shù)、同列錯位開窗函數(shù)。
聚合開窗函數(shù):
函數(shù)名如果是聚合函數(shù),則成為聚合開窗函數(shù)
語法:聚合函數(shù)(列) over(partition by 列 order by 列)
常見的聚合函數(shù)有:sum()、count()、average()、max()、min()
排序開窗函數(shù):
row_number(行號)
rank(排名)
dense_rank(密集排名)
ntile(分組排名)
(ps:排序面試題會遇到很多,并且工作中也經(jīng)常寫。)
同列錯位開窗函數(shù),就是移動位置這樣的題目。
lag(col,n):用于統(tǒng)計窗口內(nèi)往上第n行值。
lead(col,n):用于統(tǒng)計窗口內(nèi)往下第n行值。
福利時間到!
愛數(shù)據(jù)持續(xù)更新大廠Mysql面試真題!建議收藏+關(guān)注?。?!https://www.bilibili.com/video/BV1rS4y1w7r2/

關(guān)注公眾號【小小的SQL學習筆記】,后臺回復【50】即可領取《MySQL經(jīng)典50題》~

- END -