產(chǎn)品經(jīng)理學(xué)SQL(二)一天學(xué)會(huì)用SQL解決業(yè)務(wù)查詢(xún)問(wèn)題(上篇)
本篇文章意在幫助大家系統(tǒng)地入門(mén)SQL,教大家如何解決sql查詢(xún)?nèi)蝿?wù)。
前言
回顧一下,上一篇文章我們已經(jīng)知道了SQL語(yǔ)言的基本框架,并能完成簡(jiǎn)單的單表查詢(xún)和雙表連接查詢(xún)。這篇文章希望能幫助你系統(tǒng)地入門(mén)SQL,從而解決產(chǎn)品經(jīng)理80%的sql查詢(xún)?nèi)蝿?wù)。
和上篇的一個(gè)小時(shí)入門(mén)SQL一樣,這篇文章的建議學(xué)習(xí)時(shí)間為一天。如果沒(méi)看過(guò)上篇文章或想回顧的可以點(diǎn)擊:產(chǎn)品經(jīng)理學(xué)SQL(一)一個(gè)小時(shí)上手SQL
本文用到的數(shù)據(jù)庫(kù)表
為方便學(xué)習(xí),我們?nèi)匀皇褂蒙掀恼掠玫降膶W(xué)生表student和成績(jī)表sc,為了模擬業(yè)務(wù)中復(fù)雜的查詢(xún)?nèi)蝿?wù),我們?cè)僖胝n程表course和教師表teacher。
熟練使用SQL的前提一定是先了解你的數(shù)據(jù)庫(kù)表,現(xiàn)在花點(diǎn)時(shí)間看看這四張表的字段信息(描述每個(gè)字段的意義)和數(shù)據(jù)樣例(給出部分真實(shí)數(shù)據(jù)),關(guān)于業(yè)務(wù)中用到表的結(jié)構(gòu)可以找數(shù)據(jù)小哥拿。
1. 字段信息
1.1 學(xué)生表
Student(SId,Sname,Sage,Ssex)
SId 學(xué)生編號(hào),Sname 學(xué)生姓名,Sage 出生年月,Ssex 學(xué)生性別
1.2 課程表
Course(CId,Cname,TId)
CId 課程編號(hào),Cname 課程名稱(chēng),TId 教師編號(hào)
1.3 教師表
Teacher(TId,Tname)
TId 教師編號(hào),Tname 教師姓名
1.4 成績(jī)表
SC(SId,CId,score)
SId 學(xué)生編號(hào),CId 課程編號(hào),score 分?jǐn)?shù)
2. 數(shù)據(jù)樣例
2.1 學(xué)生表
2.2 課程表
2.3 教師表
2.4 成績(jī)表
SQL的執(zhí)行順序與語(yǔ)法順序
本篇文章關(guān)于SQL語(yǔ)法的部分會(huì)講到條件子句(where子句)、分組查詢(xún)(group by子句和having子句)、結(jié)果呈現(xiàn)(order by和limit)和連接查詢(xún)(left/right/inner join)。
看到這你可能會(huì)瞬間頭大,但是由于SQL語(yǔ)言是有執(zhí)行優(yōu)先級(jí)的,這給了我們分塊講解的機(jī)會(huì),私以為這也是SQL語(yǔ)言易學(xué)的重要原因。
為了解釋清楚SQL語(yǔ)言的執(zhí)行順序和語(yǔ)法順序,讓我們先看看下面這個(gè)Hive單表查詢(xún)的完整結(jié)構(gòu)。
任何一個(gè)單表查詢(xún)的SQL都可以分解成上述格式,實(shí)際上抽象化后的多表連接查詢(xún)也可以分解成如上格式。從上到下是SQL的語(yǔ)法順序(即你書(shū)寫(xiě)SQL的格式),而SQL真實(shí)的執(zhí)行順序如下:
舉個(gè)簡(jiǎn)單的例子加深理解:SQL的語(yǔ)法順序就像小說(shuō)的插敘,而SQL真正的執(zhí)行順序就是小說(shuō)的時(shí)間順序。
通過(guò)一個(gè)實(shí)例復(fù)習(xí)SQL的執(zhí)行順序
上面的講解可能讓你一知半解,在正式介紹各部分SQL語(yǔ)法前我們先通過(guò)一個(gè)實(shí)例復(fù)習(xí)上面SQL的執(zhí)行順序。
例如,有這么一個(gè)業(yè)務(wù)查詢(xún)?nèi)蝿?wù):在限定學(xué)生表學(xué)號(hào)小于等于6的一批學(xué)生中,查詢(xún)每門(mén)課的最高成績(jī)(最高成績(jī)低于70分的課程不顯示),然后根據(jù)課程最高成績(jī)降序排列取前兩條記錄。查詢(xún)的SQL如下:
為方便閱讀,下面列出被查詢(xún)的成績(jī)表sc和查詢(xún)后的結(jié)果:
1. 條件子句——為被查詢(xún)的表增加限制條件
where sid<=6#限制只查詢(xún)學(xué)號(hào)小于等于6的學(xué)生成績(jī)
2. 分組查詢(xún)——實(shí)現(xiàn)聚合(group by&函數(shù))限制聚合條件(having)
如果用過(guò)數(shù)據(jù)透視表的話應(yīng)該比較容易理解分組查詢(xún)的概念,分組查詢(xún)一般和聚合函數(shù)一起實(shí)現(xiàn),例如查看每個(gè)班的平均成績(jī)、查看每個(gè)學(xué)生的最高成績(jī)或者查看每個(gè)班的最低成績(jī)等分組信息。
我們?nèi)匀挥弥庇^的數(shù)據(jù)變化來(lái)展示分組查詢(xún):
group by cid –按照課程分組查看每門(mén)課的聚合信息
max(score) –搭配group by子句使用的聚合函數(shù),表示每門(mén)課的最高成績(jī)
having max(score) >=70 –對(duì)分組后的結(jié)果篩選,選取最高成績(jī)>=70的課程
3. 字段選擇——select
在group by分組后緊跟著我們會(huì)選擇需要呈現(xiàn)的字段,為了方便講解,其實(shí)分組查詢(xún)中呈現(xiàn)的圖片已經(jīng)是select的結(jié)果了。
4. 結(jié)果呈現(xiàn)——排序(order by )和限制條數(shù)(limit)
order by和limit都是為了修改最終呈現(xiàn)結(jié)果。order by首先執(zhí)行,按照某個(gè)字段進(jìn)行排序(desc 關(guān)鍵字表示降序),這部分和excel的排序很相似。最后我們使用limit來(lái)修改結(jié)果展示的條數(shù)。
后續(xù)學(xué)習(xí)
本篇文章的目的主要是幫助非技術(shù)人員在初步知曉SQL語(yǔ)句的情況下在一天之內(nèi)系統(tǒng)入門(mén)SQL,從而解決80%的sql查詢(xún)問(wèn)題。
但是由于建議學(xué)習(xí)時(shí)間為一整天,全部?jī)?nèi)容置于一篇文章一方面過(guò)于冗長(zhǎng),另一方面影響讀者趁熱打鐵(作者是上班族,更新比較慢哈望諒解~),因此我把一天學(xué)會(huì)用SQL解決業(yè)務(wù)查詢(xún)問(wèn)題分為上中下三篇。
上篇已經(jīng)介紹了SQL的語(yǔ)法順序和執(zhí)行順序的區(qū)別并仔細(xì)剖析了SQL的執(zhí)行順序;中篇會(huì)詳細(xì)介紹條件子句、分組查詢(xún)和排序的細(xì)節(jié);下篇會(huì)介紹表的連接和其他常用關(guān)鍵字:if、case when和ditinct等。
希望學(xué)完這三篇后能助你系統(tǒng)地入門(mén)SQL~
作者:Tomocat,女朋友是產(chǎn)品經(jīng)理的數(shù)據(jù)分析師。
本文由 @Tomocat 原創(chuàng)發(fā)布于人人都是產(chǎn)品經(jīng)理,未經(jīng)許可,禁止轉(zhuǎn)載。
題圖來(lái)自 Unsplash,基于CC0協(xié)議。
請(qǐng)問(wèn)這是哪個(gè)數(shù)據(jù)庫(kù)查詢(xún)語(yǔ)言?
感謝分享~
寫(xiě)的很贊!讀完收獲很大!
謝謝~下一篇已經(jīng)寫(xiě)完,等待審核中