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