SQL | 数据分析面试必备SQL语句+语法
關(guān)注上方“小詹學(xué)Python”,選擇“星標公眾號”,
關(guān)鍵時間,第一時間送達!
|?作者:無眠
| 來源:知乎
前些天在網(wǎng)上沖浪的時候看到一個案例咨詢,問說世界500強的數(shù)據(jù)分析要不要去,評論區(qū)一片爆炸:“樓主能分享一下文科生怎么轉(zhuǎn)行做數(shù)據(jù)分析嗎??”、“SQL、python這些學(xué)起來好痛苦!”我看著屏幕苦笑,數(shù)據(jù)分析崗位現(xiàn)在的熱門程度如果要形容的話,基本就是隨便抓一個微博網(wǎng)友都知道這個崗位了。
Anyway,言歸正傳,數(shù)據(jù)分析師的招聘JD你們一定不陌生:
可以說,每個數(shù)據(jù)分析崗都需要會SQL。
我本人曾在滴滴、美團、平安科技的數(shù)據(jù)分析類崗位實習(xí)過,實習(xí)期間會大量運用sql進行取數(shù)。也參與了2018年的秋招,做過網(wǎng)易、拼多多、新浪等等公司的數(shù)據(jù)分析筆試題,還是比較了解SQL常考的題目類型的。
寫這篇文章是希望幫助還沒有實戰(zhàn)過SQL的小伙伴、或者了解一些SQL語句,但是擔(dān)心自己了解的太片面的小伙伴。這篇文章主要介紹的是:如果想要面試數(shù)據(jù)分析崗位,最優(yōu)先需要掌握的SQL技能是哪些呢?
讀完本文,你能快速知道:
(1)除了select 這種基本的語句,我最應(yīng)該馬上掌握的SQL語句和知識是什么?
(2)面試中SQL題80%都在考察的語法是什么?
(3)這些語法應(yīng)該怎么使用?
本文將從三大塊介紹入門SQL需要掌握的語法和知識,分別是
最基礎(chǔ)的選擇(select)和連接(join/union)
最常用的函數(shù)(distinct/group by/order by等)
一些小小的進階技巧(組內(nèi)排序、取前百分之多少的值、時間函數(shù))
從一個實習(xí)和秋招過來人的角度看,這些知識基本夠面試的時候用了,如果本身也在數(shù)據(jù)分析崗位實習(xí)或者實習(xí)過,可以在評論區(qū)討論或者補充一些也常常用到的SQL知識,大家一起交流進步~ ps. 本文主要做知識點快速突破,具體的實戰(zhàn)練習(xí)大家必不可少還是要做!
介紹完了三大塊知識后,后續(xù)會有常見的SQL面試/筆試題,可以練習(xí)和交流~
本文對于SQL知識的介紹結(jié)構(gòu)
1. 最基本(選數(shù)據(jù))
怎么把數(shù)據(jù)從表里選出來?
想要的數(shù)據(jù)在多張表里,想取多個字段,該怎么辦?—— 表連接
在這里先介紹一下幾種join: (敲重點,很容易問的哦)
join : hive的join默認是inner join,找出左右都可匹配的記錄;
left join: 左連接,以左表為準,逐條去右表找可匹配字段,如果有多條會逐次列出,如果沒有找到則是NULL;
right join:右連接,以右表為準,逐條去左表找可匹配字段,如果有多條會逐次列出,如果沒有找到則是NULL;
full outer join: 全連接,包含兩個表的連接結(jié)果,如果左表缺失或者右表缺失的數(shù)據(jù)會填充NULL。
每種join 都有on ,>join 之前要確保關(guān)聯(lián)鍵是否去重,是不是刻意保留非去重結(jié)果。
兩張表數(shù)據(jù)的字段一樣,想合并起來,怎么辦?
union和union all 均基于列合并多張表的數(shù)據(jù),所合并的列格式必須完全一致。union的過程中會去重并降低效率,union all 直接追加數(shù)據(jù)。union 前后是兩段select 語句而非結(jié)果集。
2. 最常用(更有多重組合)
為方便大家理解每個函數(shù)的作用,先建一個表,后面以這個為示例。
如果有千萬用戶數(shù)據(jù),想知道有多少去重的用戶數(shù)?—— 去重 distinct
distinct 會對結(jié)果集去重,對全部選擇字段進行去重,并不能針對其中部分字段進行去重。使用count distinct進行去重統(tǒng)計會將reducer數(shù)量強制限定為1,而影響效率,因此適合改寫為子查詢。
想分性別進行統(tǒng)計,看看男女各多少?—— 聚合函數(shù)和group by
聚合函數(shù)幫助我們進行基本的數(shù)據(jù)統(tǒng)計,例如計算最大值、最小值、平均值、總數(shù)、求和
只想查看A公司的男女人數(shù)數(shù)據(jù)?—— 篩選 where/having
希望查詢結(jié)果從高到低/從低到高排序?—— 排序 order by
將數(shù)值型的變量轉(zhuǎn)化為分類型的變量?—— case when 條件函數(shù)
case 函數(shù)的格式為(case when 條件1 then value1 else null end), 其中else 可以省,但是end不可以省。
在這個例子里也穿插了一個CAST的用法,它常用于string/int/double型的轉(zhuǎn)換。
字符串
1. concat( A, B...)返回將A和B按順序連接在一起的字符串,如:concat('foo', 'bar') 返回'foobar'
select concat('www','.iteblog','.com') fromiteblog;--得到 www.iteblog.com2. split(str, regex)用于將string類型數(shù)據(jù)按regex提取,分隔后轉(zhuǎn)換為array。
-- 以","為分隔符分割字符串,并轉(zhuǎn)化為arraySelect split("1,2,3",",")as value_array from table_1;-- 結(jié)合array index,將原始字符串分割為3列select value_array[0],value_array[1],value_array[2] from (select split("1,2,3",",")as value_array from table_1 )t3. substr(str,0,len) 截取字符串從0位開始的長度為len個字符。
select substr('abcde',3,2) fromiteblog; --?得到cd3. 基礎(chǔ)進階
不想全局排序,需要分組排序?—— row_number()
按照depid分組,對salary進行排序(倒序)
除了row_number函數(shù)之外,還有兩個分組排序函數(shù),分別是rank() 和dense_rank()。
rank()排序相同時會重復(fù),總數(shù)不會變 ,意思是會出現(xiàn)1、1、3這樣的排序結(jié)果;
dense_rank() 排序相同時會重復(fù),總數(shù)會減少,意思是會出現(xiàn)1、1、2這樣的排序結(jié)果。
row_number() 則在排序相同時不重復(fù),會根據(jù)順序排序。
想要獲取top10%的值?—— percentile 百分位函數(shù)
想要對時間字段進行操作?—— 時間函數(shù)
to_date函數(shù)可以把時間的字符串形式轉(zhuǎn)化為時間類型,再進行后續(xù)的計算;
常用的日期提取函數(shù)包括 year()/month()/day()/hour()/minute()/second()
日期運算函數(shù)包括datediff(enddate,stratdate) 計算兩個時間的時間差(day);
date_sub(stratdate,days) 返回開始日期startdate減少days天后的日期。
date_add(startdate,days) 返回開始日期startdate增加days天后的日期。
4. 常見筆試/面試題
例:有3個表S,C,SC:
S(SNO,SNAME)代表(學(xué)號,姓名)
C(CNO,CNAME,CTEACHER)代表(課號,課名,教師)
SC(SNO,CNO,SCGRADE)代表(學(xué)號,課號,成績)
問題:
1. 找出沒選過“黎明”老師的所有學(xué)生姓名。
2. 列出2門以上(含2門)不及格學(xué)生姓名及平均成績。
3. 既學(xué)過1號課程又學(xué)過2號課所有學(xué)生的姓名。
1. -- 考察條件篩選select sname from s where sno not in( select sno from sc where cno in (select distinct cno from c where cteacher='黎明' )); 2. -- 考察聚合函數(shù),條件篩選select s.sname, avg_grade from sjoin(select sno from sc where scgrade < 60 group by sno having count(*) >= 2) t1on s.sno = t1.snojoin(select sno, avg(scgrade) as avg_grade from sc group by sno ) t2on s.sno = t2.sno; 3. -- 考察篩選、連接select sname from ( select sno from sc where cno = 1) ajoin (select sno from sc where cno = 2) bon?a.sno?=?b.sno做SQL題的時候注意理解每個題目希望你用的是什么知識點,這樣有助于鞏固。
當(dāng)初我學(xué)SQL的時候,盯著《SQL必知必會》翻來覆去的看,但是知識點真的比較多,也比較零碎。在寫這篇文章之前,也看過知乎上關(guān)于SQL學(xué)習(xí)的文章,有的比較廣泛而全面,有的則很干貨,全部是??蜕系腟QL題目的解析。
基于自己的體會,我寫了這篇SQL面試和筆試的入門文章,主旨是快速、清晰的把握重點。希望大家都能快快入門SQL
END來和小伙伴們一起向上生長呀~~~掃描下方二維碼,添加小詹微信,可領(lǐng)取千元大禮包并申請加入 Python學(xué)習(xí)交流群,群內(nèi)僅供學(xué)術(shù)交流,日常互動,如果是想發(fā)推文、廣告、砍價小程序的敬請繞道!一定記得備注「交流學(xué)習(xí)」,我會盡快通過好友申請哦!(添加人數(shù)較多,請耐心等待) (掃碼回復(fù) 1024? 即可領(lǐng)取IT資料包)總結(jié)
以上是生活随笔為你收集整理的SQL | 数据分析面试必备SQL语句+语法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PyCharm 2020.1 稳定版发布
- 下一篇: 我常用的10个Python实用小Tric