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

18 評(píng)論 18028 瀏覽 152 收藏 8 分鐘

本篇旨在將實(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)

  1. 和excel一樣,可以用多個(gè)字段排序
  2. 關(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é)議。

更多精彩內(nèi)容,請(qǐng)關(guān)注人人都是產(chǎn)品經(jīng)理微信公眾號(hào)或下載App
評(píng)論
評(píng)論請(qǐng)登錄
  1. 知乎上沒(méi)找到呢

    來(lái)自北京 回復(fù)
  2. 那個(gè)排序那邊,默認(rèn)升序ASC吧,按照你要取得成績(jī)前兩位,應(yīng)該在order by 的后面加desc吧

    來(lái)自江蘇 回復(fù)
  3. 受用

    回復(fù)
  4. 請(qǐng)問(wèn)樓主現(xiàn)在的知乎號(hào)叫什么?或者專欄文章名字叫什么?

    來(lái)自北京 回復(fù)
  5. 下載什么軟件啊

    來(lái)自河北 回復(fù)
  6. 非常感謝樓主的分享,清晰易懂,很有幫助

    來(lái)自北京 回復(fù)
  7. 發(fā)文審核顯示觀點(diǎn)不清晰沒(méi)給過(guò),想看下篇可以關(guān)注我的知乎號(hào),然后在專欄里面看。知乎號(hào):網(wǎng)癮大叔。

    回復(fù)
    1. 謝謝樓主的分享!另外,知乎上面找不到您呀,您的文章名字叫什么呢?

      來(lái)自福建 回復(fù)
    2. 找到了!

      來(lái)自福建 回復(fù)
    3. 為什么找不到呀

      來(lái)自北京 回復(fù)
    4. 你找了嗎

      來(lái)自北京 回復(fù)
  8. 下篇呢?

    來(lái)自北京 回復(fù)
  9. 樓主請(qǐng)問(wèn)下篇什么時(shí)候出呢?感恩

    來(lái)自上海 回復(fù)
    1. 抱歉,通不過(guò)人人都是產(chǎn)品經(jīng)理社區(qū)的審核,以后應(yīng)該都在知乎平臺(tái)更新了。

      來(lái)自北京 回復(fù)
  10. 今年放假了,最近兩天想花點(diǎn)時(shí)間做個(gè)2018電影年終盤點(diǎn),sql的教程先擱置下~

    回復(fù)
    1. 今天放假了

      回復(fù)
  11. 之前我都是自己在菜鳥(niǎo)網(wǎng)站上看教程,看得很累,感謝樓主的整理;
    還有就是建議搞些測(cè)試庫(kù),新手純閱讀式學(xué)習(xí),一下就忘了

    來(lái)自香港 回復(fù)
    1. 測(cè)試案例的話后續(xù)會(huì)更新的

      回復(fù)