產(chǎn)品經(jīng)理學SQL(二)一天學會用SQL解決業(yè)務(wù)查詢問題(中篇)
本篇旨在將實務(wù)中最常出現(xiàn)的詳細情況進行說明,從而解決產(chǎn)品經(jīng)理80%的sql查詢?nèi)蝿?wù);希望對大家有幫助~
前言
之前我們已經(jīng)用一個例子介紹了SQL的語法順序和執(zhí)行順序,想必現(xiàn)在你已經(jīng)知道了一個完整的SQL包括條件子句(關(guān)鍵字where)、分組查詢(關(guān)鍵字group by)、字段選擇(關(guān)鍵字select)和結(jié)果呈現(xiàn)(關(guān)鍵字order by)。本篇我們旨在將實務(wù)中最常出現(xiàn)的詳細情況進行說明,從而解決產(chǎn)品經(jīng)理80%的sql查詢?nèi)蝿?wù)。
產(chǎn)品經(jīng)理學SQL(二)一天學會用SQL解決業(yè)務(wù)查詢問題系列共包括前中后三篇,建議學習時間為一天。
想回顧之前內(nèi)容的可以點擊:
產(chǎn)品經(jīng)理學SQL(一)一個小時上手SQL
產(chǎn)品經(jīng)理學SQL(二)一天學會用SQL解決業(yè)務(wù)查詢問題(上篇)
條件子句(where)
1. 比較運算符(適用于區(qū)間)
比較運算符包括=(等于),>=(大于等于),<=(小于等于),!=(不等于),>(大于),<(小于)。
例如:查詢年齡sage小于30的學生
where sage < 30
2. 確定范圍(適用于連續(xù)范圍)
between … and …為取值限定了一個范圍。
例如:查詢年齡大于等于10小于等于20的學生
where sage between 10 and 20
3. 確定集合(適用于離散的少數(shù)值)
例如:插入年齡為10,20,30的學生
where sage in (10,20,30)
**in可以和not一起使用,表示不在這個區(qū)間的值
**where sage not in (10,20,30)
4. 字符匹配(模糊查詢)
通過like關(guān)鍵字和正則表達式匹配,常用的通配符有%(任意個字符)和_(一個字符)。
例如:查詢名字sname帶“王”的學生
where sname like “%王%”
5. 判斷是否為空值
通過is null關(guān)鍵字判斷值是否為空。
例如:查詢姓名sname不為空的學生
where sname is not null
6. 多個查詢條件
用and(兩個條件同時滿足)和or(兩個條件滿足一個即可)
例如:查詢年齡sage小于20且性別ssex為男的學生
where sage<20 and ssex=’男’
一、分組查詢(group by&聚合函數(shù)&having子句)
分組查詢實現(xiàn)了類似excel中數(shù)據(jù)透視表的功能,可以幫助我們對數(shù)據(jù)進行分層匯總,而我們對分層后的數(shù)據(jù)進行統(tǒng)計的時候需要用到聚合函數(shù)(也就是平均值、求和、最大值和最小值等),最后我們對分層之后的數(shù)據(jù)篩選的時候需要用到having子句。
**where子句是對原始表做篩選的
**having子句是對分層匯總之后的結(jié)果做篩選的
回顧我們上一篇講過的例子:在限定學生表學號小于等于6的一批學生中,查詢每門課的最高成績(最高成績低于70分的課程不顯示),然后根據(jù)課程最高成績降序排列取前兩條記錄。
查詢的SQL如下:
回顧一下執(zhí)行順序,首先我們用where子句對原始數(shù)據(jù)做了學號id需要小于等于6的限制。然后我們用group by和max(score)聚合函數(shù)實現(xiàn)了對課程進行分層,求出每門課的最高成績,為了對聚合之后的結(jié)果作限制,我們用having子句只展示最高分數(shù)大于等于70的記錄。
關(guān)于這個例子詳細解釋可以回顧上篇文章,下面我們詳細介紹每個部分的常用語句。
1. group by
group by不僅可以對一個字段進行分組,還能對多個字段進行分組。這和excel中的數(shù)據(jù)透視表一致。
2. 聚合函數(shù)
3. having子句
和where子句一致,只需注意是對聚合后的結(jié)果作限制。
二、字段選擇(select)
select比較靈活,我們不單單能選擇原始數(shù)據(jù)表的字段,還能使用函數(shù)對字段進行計算,正如我們第一篇提到的,函數(shù)并不是重點,當你需要的時候百度或者問技術(shù)小哥就知道了。我們這里只簡單介紹一下可以對字段進行計算。
例如:查詢各學生的年齡(通過公式計算年齡)
三、結(jié)果呈現(xiàn)(order by)
- 和excel一樣,可以用多個字段排序
- 關(guān)鍵字desc表示降序排列
例如:查詢學生id和年齡,并先按照學號sid降序,再按照年齡sage升序排列
四、后續(xù)學習
本篇文章的目的主要是幫助非技術(shù)人員在初步知曉SQL語句的情況下在一天之內(nèi)系統(tǒng)入門SQL,從而解決80%的sql查詢問題。
但是由于建議學習時間為一整天,全部內(nèi)容置于一篇文章一方面過于冗長,另一方面影響讀者趁熱打鐵(作者是上班族,更新比較慢哈望諒解~),因此我把一天學會用SQL解決業(yè)務(wù)查詢問題分為上中下三篇。
上篇已經(jīng)介紹了SQL的語法順序和執(zhí)行順序的區(qū)別并仔細剖析了SQL的執(zhí)行順序;這篇詳細介紹了條件子句、分組查詢和排序的細節(jié);下篇會介紹表的連接和其他常用關(guān)鍵字。
希望學完這三篇后能助你系統(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é)議。
知乎上沒找到呢
那個排序那邊,默認升序ASC吧,按照你要取得成績前兩位,應(yīng)該在order by 的后面加desc吧
受用
請問樓主現(xiàn)在的知乎號叫什么?或者專欄文章名字叫什么?
下載什么軟件啊
非常感謝樓主的分享,清晰易懂,很有幫助
發(fā)文審核顯示觀點不清晰沒給過,想看下篇可以關(guān)注我的知乎號,然后在專欄里面看。知乎號:網(wǎng)癮大叔。
謝謝樓主的分享!另外,知乎上面找不到您呀,您的文章名字叫什么呢?
找到了!
為什么找不到呀
你找了嗎
下篇呢?
樓主請問下篇什么時候出呢?感恩
抱歉,通不過人人都是產(chǎn)品經(jīng)理社區(qū)的審核,以后應(yīng)該都在知乎平臺更新了。
今年放假了,最近兩天想花點時間做個2018電影年終盤點,sql的教程先擱置下~
今天放假了
之前我都是自己在菜鳥網(wǎng)站上看教程,看得很累,感謝樓主的整理;
還有就是建議搞些測試庫,新手純閱讀式學習,一下就忘了
測試案例的話后續(xù)會更新的