日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

SQL | 数据分析面试必备SQL语句+语法

發布時間:2024/9/15 数据库 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SQL | 数据分析面试必备SQL语句+语法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

關注上方“小詹學Python”,選擇“星標公眾號”

關鍵時間,第一時間送達!


|?作者:無眠

| 來源:知乎

前些天在網上沖浪的時候看到一個案例咨詢,問說世界500強的數據分析要不要去,評論區一片爆炸:“樓主能分享一下文科生怎么轉行做數據分析嗎??”、“SQL、python這些學起來好痛苦!”我看著屏幕苦笑,數據分析崗位現在的熱門程度如果要形容的話,基本就是隨便抓一個微博網友都知道這個崗位了。

Anyway,言歸正傳,數據分析師的招聘JD你們一定不陌生:

可以說,每個數據分析崗都需要會SQL。

我本人曾在滴滴、美團、平安科技的數據分析類崗位實習過,實習期間會大量運用sql進行取數。也參與了2018年的秋招,做過網易、拼多多、新浪等等公司的數據分析筆試題,還是比較了解SQL常考的題目類型的。

寫這篇文章是希望幫助還沒有實戰過SQL的小伙伴、或者了解一些SQL語句,但是擔心自己了解的太片面的小伙伴。這篇文章主要介紹的是:如果想要面試數據分析崗位,最優先需要掌握的SQL技能是哪些呢?

讀完本文,你能快速知道:

(1)除了select 這種基本的語句,我最應該馬上掌握的SQL語句和知識是什么?

(2)面試中SQL題80%都在考察的語法是什么?

(3)這些語法應該怎么使用?

本文將從三大塊介紹入門SQL需要掌握的語法和知識,分別是

  • 最基礎的選擇(select)和連接(join/union)

  • 最常用的函數(distinct/group by/order by等)

  • 一些小小的進階技巧(組內排序、取前百分之多少的值、時間函數)

從一個實習和秋招過來人的角度看,這些知識基本夠面試的時候用了,如果本身也在數據分析崗位實習或者實習過,可以在評論區討論或者補充一些也常常用到的SQL知識,大家一起交流進步~ ps. 本文主要做知識點快速突破,具體的實戰練習大家必不可少還是要做!

介紹完了三大塊知識后,后續會有常見的SQL面試/筆試題,可以練習和交流~

本文對于SQL知識的介紹結構

1. 最基本(選數據)


  • 怎么把數據從表里選出來?

-- 從table_1中選擇a這一列select a from table_1
  • 想要的數據在多張表里,想取多個字段,該怎么辦?—— 表連接

-- table_1中有id,age; table_2中有id,sex。想取出id,age,sex 三列信息-- 將table_1,table_2 根據主鍵id連接起來select a.id,a.age,b.sex from (select id,age from table_1) a --將select之后的內容存為臨時表ajoin (select id, sex from table_2) b --將select之后的內容存為臨時表bon a.id =b.id

在這里先介紹一下幾種join: (敲重點,很容易問的哦)

join : hive的join默認是inner join,找出左右都可匹配的記錄;

left join: 左連接,以左表為準,逐條去右表找可匹配字段,如果有多條會逐次列出,如果沒有找到則是NULL;

right join:右連接,以右表為準,逐條去左表找可匹配字段,如果有多條會逐次列出,如果沒有找到則是NULL;

full outer join: 全連接,包含兩個表的連接結果,如果左表缺失或者右表缺失的數據會填充NULL。

每種join 都有on ,>join 之前要確保關聯鍵是否去重,是不是刻意保留非去重結果。

  • 兩張表數據的字段一樣,想合并起來,怎么辦?

-- 不去重,合并兩張表的數據select * from (select?id?from?table_1UNION?ALLselect?id?from?table_2)t;

union和union all 均基于列合并多張表的數據,所合并的列格式必須完全一致。union的過程中會去重并降低效率,union all 直接追加數據。union 前后是兩段select 語句而非結果集。

2. 最常用(更有多重組合)

為方便大家理解每個函數的作用,先建一個表,后面以這個為示例。

  • 如果有千萬用戶數據,想知道有多少去重的用戶數?—— 去重 distinct

-- 羅列不同的idselect distinct id from table_1 -- 統計不同的id的個數select count(distinct id) from table_1 -- 優化版本的count distinctselect count(*) from(select?distinct?id?from?table_1)?tb

distinct 會對結果集去重,對全部選擇字段進行去重,并不能針對其中部分字段進行去重。使用count distinct進行去重統計會將reducer數量強制限定為1,而影響效率,因此適合改寫為子查詢。

  • 想分性別進行統計,看看男女各多少?—— 聚合函數和group by

-- 統計不同性別(F、M)中,不同的id個數select count(distinct id) from table_1group by sex-- 其它的聚合函數例如:max/min/avg/sum -- 統計最大/最小/平均年齡select max(age), min(age),avg(age) from table_1group by id

聚合函數幫助我們進行基本的數據統計,例如計算最大值、最小值、平均值、總數、求和

  • 只想查看A公司的男女人數數據?—— 篩選 where/having

-- 統計A公司的男女人數select count(distinct id) from table_1where company = 'A'group?by?sex -- 統計各公司的男性平均年齡,并且僅保留平均年齡30歲以上的公司select company, avg(age) from table_1where sex = 'M'group by companyhaving?avg(age)>30;
  • 希望查詢結果從高到低/從低到高排序?—— 排序 order by

-- 按年齡全局倒序排序取最年邁的10個人select id,age from table_1 order by age DESC limit 10
  • 將數值型的變量轉化為分類型的變量?—— case when 條件函數

-- 收入區間分組select id,(case when CAST(salary as float)<50000 Then '0-5萬'when CAST(salary as float)>=50000 and CAST(salary as float)<100000 then '5-10萬'when CAST(salary as float) >=100000 and CAST(salary as float)<200000 then '10-20萬'when CAST(salary as float)>200000 then '20萬以上'else NULL end from table_1;
  • case 函數的格式為(case when 條件1 then value1 else null end), 其中else 可以省,但是end不可以省。

在這個例子里也穿插了一個CAST的用法,它常用于string/int/double型的轉換。

  • 字符串

1. concat( A, B...)返回將A和B按順序連接在一起的字符串,如:concat('foo', 'bar') 返回'foobar'

select concat('www','.iteblog','.com') fromiteblog;--得到 www.iteblog.com

2. split(str, regex)用于將string類型數據按regex提取,分隔后轉換為array。

-- 以","為分隔符分割字符串,并轉化為arraySelect split("1,2,3",",")as value_array from table_1;-- 結合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 )t

3. substr(str,0,len) 截取字符串從0位開始的長度為len個字符。

select substr('abcde',3,2) fromiteblog; --?得到cd

3. 基礎進階


  • 不想全局排序,需要分組排序?—— row_number()

-- 按照字段salary倒序編號select *, row_number() over (order by salary desc) as row_num from table_1; -- 按照字段deptid分組后再按照salary倒序編號select *, row_number() over (partition by deptid order by salary desc) as rank from table_1;


按照depid分組,對salary進行排序(倒序)

除了row_number函數之外,還有兩個分組排序函數,分別是rank() 和dense_rank()。

  • rank()排序相同時會重復,總數不會變 ,意思是會出現1、1、3這樣的排序結果;

  • dense_rank() 排序相同時會重復,總數會減少,意思是會出現1、1、2這樣的排序結果。

  • row_number() 則在排序相同時不重復,會根據順序排序。

  • 想要獲取top10%的值?—— percentile 百分位函數

-- 獲取income字段的top10%的閾值select percentile(CAST (salary AS int),0.9)) as income_top10p_threshold from table_1; -- 獲取income字段的10個百分位點select percentile(CAST (salary AS int),array(0.0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0)) as income_percentilesfrom table_1;
  • 想要對時間字段進行操作?—— 時間函數

-- 轉換為時間數據的格式select to_date("1970-01-01 00:00:00") as start_time from table_1; -- 計算數據到當前時間的天數差 select datediff('2016-12-30','2016-12-29');-- 得到 "1"

to_date函數可以把時間的字符串形式轉化為時間類型,再進行后續的計算;

  • 常用的日期提取函數包括 year()/month()/day()/hour()/minute()/second()

  • 日期運算函數包括datediff(enddate,stratdate) 計算兩個時間的時間差(day);

  • date_sub(stratdate,days) 返回開始日期startdate減少days天后的日期。

  • date_add(startdate,days) 返回開始日期startdate增加days天后的日期。


4. 常見筆試/面試題

例:有3個表S,C,SC:

S(SNO,SNAME)代表(學號,姓名)

C(CNO,CNAME,CTEACHER)代表(課號,課名,教師)

SC(SNO,CNO,SCGRADE)代表(學號,課號,成績)

問題:

1. 找出沒選過“黎明”老師的所有學生姓名。

2. 列出2門以上(含2門)不及格學生姓名及平均成績。

3. 既學過1號課程又學過2號課所有學生的姓名。

1. -- 考察條件篩選select sname from s where sno not in( select sno from sc where cno in (select distinct cno from c where cteacher='黎明' )); 2. -- 考察聚合函數,條件篩選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題的時候注意理解每個題目希望你用的是什么知識點,這樣有助于鞏固。

當初我學SQL的時候,盯著《SQL必知必會》翻來覆去的看,但是知識點真的比較多,也比較零碎。在寫這篇文章之前,也看過知乎上關于SQL學習的文章,有的比較廣泛而全面,有的則很干貨,全部是??蜕系腟QL題目的解析。

基于自己的體會,我寫了這篇SQL面試和筆試的入門文章,主旨是快速、清晰的把握重點。希望大家都能快快入門SQL

END來和小伙伴們一起向上生長呀~~~掃描下方二維碼,添加小詹微信,可領取千元大禮包并申請加入 Python學習交流群,群內僅供學術交流,日?;?#xff0c;如果是想發推文、廣告、砍價小程序的敬請繞道!一定記得備注「交流學習」,我會盡快通過好友申請哦!(添加人數較多,請耐心等待) (掃碼回復 1024? 即可領取IT資料包)

總結

以上是生活随笔為你收集整理的SQL | 数据分析面试必备SQL语句+语法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。