產(chǎn)品經(jīng)理學(xué)SQL(二)一天學(xué)會用SQL解決業(yè)務(wù)查詢問題(上篇)

4 評論 18457 瀏覽 166 收藏 9 分鐘

本篇文章意在幫助大家系統(tǒng)地入門SQL,教大家如何解決sql查詢?nèi)蝿?wù)。

前言

回顧一下,上一篇文章我們已經(jīng)知道了SQL語言的基本框架,并能完成簡單的單表查詢和雙表連接查詢。這篇文章希望能幫助你系統(tǒng)地入門SQL,從而解決產(chǎn)品經(jīng)理80%的sql查詢?nèi)蝿?wù)

和上篇的一個小時入門SQL一樣,這篇文章的建議學(xué)習(xí)時間為一天。如果沒看過上篇文章或想回顧的可以點擊:產(chǎn)品經(jīng)理學(xué)SQL(一)一個小時上手SQL

本文用到的數(shù)據(jù)庫表

為方便學(xué)習(xí),我們?nèi)匀皇褂蒙掀恼掠玫降膶W(xué)生表student和成績表sc,為了模擬業(yè)務(wù)中復(fù)雜的查詢?nèi)蝿?wù),我們再引入課程表course和教師表teacher。

熟練使用SQL的前提一定是先了解你的數(shù)據(jù)庫表,現(xiàn)在花點時間看看這四張表的字段信息(描述每個字段的意義)和數(shù)據(jù)樣例(給出部分真實數(shù)據(jù)),關(guān)于業(yè)務(wù)中用到表的結(jié)構(gòu)可以找數(shù)據(jù)小哥拿。

1. 字段信息

1.1 學(xué)生表

Student(SId,Sname,Sage,Ssex)

SId 學(xué)生編號,Sname 學(xué)生姓名,Sage 出生年月,Ssex 學(xué)生性別

1.2 課程表

Course(CId,Cname,TId)

CId 課程編號,Cname 課程名稱,TId 教師編號

1.3 教師表

Teacher(TId,Tname)

TId 教師編號,Tname 教師姓名

1.4 成績表

SC(SId,CId,score)

SId 學(xué)生編號,CId 課程編號,score 分?jǐn)?shù)

2. 數(shù)據(jù)樣例

2.1 學(xué)生表

2.2 課程表

2.3 教師表

2.4 成績表

SQL的執(zhí)行順序與語法順序

本篇文章關(guān)于SQL語法的部分會講到條件子句(where子句)、分組查詢(group by子句和having子句)、結(jié)果呈現(xiàn)(order by和limit)和連接查詢(left/right/inner join)。

看到這你可能會瞬間頭大,但是由于SQL語言是有執(zhí)行優(yōu)先級的,這給了我們分塊講解的機會,私以為這也是SQL語言易學(xué)的重要原因。

為了解釋清楚SQL語言的執(zhí)行順序和語法順序,讓我們先看看下面這個Hive單表查詢的完整結(jié)構(gòu)。

任何一個單表查詢的SQL都可以分解成上述格式,實際上抽象化后的多表連接查詢也可以分解成如上格式。從上到下是SQL的語法順序(即你書寫SQL的格式),而SQL真實的執(zhí)行順序如下:

舉個簡單的例子加深理解:SQL的語法順序就像小說的插敘,而SQL真正的執(zhí)行順序就是小說的時間順序。

通過一個實例復(fù)習(xí)SQL的執(zhí)行順序

上面的講解可能讓你一知半解,在正式介紹各部分SQL語法前我們先通過一個實例復(fù)習(xí)上面SQL的執(zhí)行順序。

例如,有這么一個業(yè)務(wù)查詢?nèi)蝿?wù):在限定學(xué)生表學(xué)號小于等于6的一批學(xué)生中,查詢每門課的最高成績(最高成績低于70分的課程不顯示),然后根據(jù)課程最高成績降序排列取前兩條記錄。查詢的SQL如下:

為方便閱讀,下面列出被查詢的成績表sc和查詢后的結(jié)果:

1. 條件子句——為被查詢的表增加限制條件

where sid<=6#限制只查詢學(xué)號小于等于6的學(xué)生成績

2. 分組查詢——實現(xiàn)聚合(group by&函數(shù))限制聚合條件(having)

如果用過數(shù)據(jù)透視表的話應(yīng)該比較容易理解分組查詢的概念,分組查詢一般和聚合函數(shù)一起實現(xiàn),例如查看每個班的平均成績、查看每個學(xué)生的最高成績或者查看每個班的最低成績等分組信息。

我們?nèi)匀挥弥庇^的數(shù)據(jù)變化來展示分組查詢:

group by cid –按照課程分組查看每門課的聚合信息

max(score) –搭配group by子句使用的聚合函數(shù),表示每門課的最高成績

having max(score) >=70 –對分組后的結(jié)果篩選,選取最高成績>=70的課程

3. 字段選擇——select

在group by分組后緊跟著我們會選擇需要呈現(xiàn)的字段,為了方便講解,其實分組查詢中呈現(xiàn)的圖片已經(jīng)是select的結(jié)果了。

4. 結(jié)果呈現(xiàn)——排序(order by )和限制條數(shù)(limit)

order by和limit都是為了修改最終呈現(xiàn)結(jié)果。order by首先執(zhí)行,按照某個字段進行排序(desc 關(guān)鍵字表示降序),這部分和excel的排序很相似。最后我們使用limit來修改結(jié)果展示的條數(shù)。

后續(xù)學(xué)習(xí)

本篇文章的目的主要是幫助非技術(shù)人員在初步知曉SQL語句的情況下在一天之內(nèi)系統(tǒng)入門SQL,從而解決80%的sql查詢問題。

但是由于建議學(xué)習(xí)時間為一整天,全部內(nèi)容置于一篇文章一方面過于冗長,另一方面影響讀者趁熱打鐵(作者是上班族,更新比較慢哈望諒解~),因此我把一天學(xué)會用SQL解決業(yè)務(wù)查詢問題分為上中下三篇

上篇已經(jīng)介紹了SQL的語法順序和執(zhí)行順序的區(qū)別并仔細剖析了SQL的執(zhí)行順序;中篇會詳細介紹條件子句、分組查詢和排序的細節(jié);下篇會介紹表的連接和其他常用關(guān)鍵字:if、case when和ditinct等。

希望學(xué)完這三篇后能助你系統(tǒng)地入門SQL~

 

作者:Tomocat,女朋友是產(chǎn)品經(jīng)理的數(shù)據(jù)分析師。

本文由 @Tomocat 原創(chuàng)發(fā)布于人人都是產(chǎn)品經(jīng)理,未經(jīng)許可,禁止轉(zhuǎn)載。

題圖來自 Unsplash,基于CC0協(xié)議。

更多精彩內(nèi)容,請關(guān)注人人都是產(chǎn)品經(jīng)理微信公眾號或下載App
評論
評論請登錄
  1. 請問這是哪個數(shù)據(jù)庫查詢語言?

    回復(fù)
  2. 感謝分享~

    來自江蘇 回復(fù)
  3. 寫的很贊!讀完收獲很大!

    來自北京 回復(fù)
    1. 謝謝~下一篇已經(jīng)寫完,等待審核中

      回復(fù)