學會了如何查找資料後,接下來就要對資料進行分析處理,比如求和、平均值、加總等等。這些對資料的加工處理通過彙總函數來實作。彙總函數在之前的兩篇文章中都有涉及,這裡采用概念--案例--總結的方式,集中介紹一下。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5SO1MmY4MGNiVDNmNTZzcjNwIzY4UzNkRWZ2YDOxQWZj9CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
1.什麼是彙總函數?
函數是SQL裡的關鍵字,是一種運算指令。
通常來說,函數與字段名稱或表達式聯合使用,處理輸入的資料并産生結果。SQL包含多種類型函數,其中彙總函數為SQL提供合計資訊,比如計數、總和、平均等。
常見的彙總函數有以下幾種:
- count:求某一列的行數
- sum:對某列資料求和
- avg:求某列資料的平均值
- max:求某列資料的最大值
- min:求某列資料的最小值
注意:
1. 如果彙總函數後面有null(空值),那麼都會把空值排除在外進行計算。
2.如果要計算所有的行(包括空值的行),一般用星号表示,例子如下:
select 姓名,count(*)
from student;
3.sum、avg函數,隻能對數值類型的列進行計算,否則會報錯。
count、max、min函數,可以對任何類型計算。
舉個例子說明一下,這裡有一張名為“student”的表,表裡面的有一些學生和課程相關的資訊,如下:
1.你想計算姓名這一列都多少行,需要使用‘count’函數,寫法如下:
select count(姓名)from student;
2.計算成績這一列總和,寫法如下:
select sum(成績)from student;
3.計算成績這一列平均值,寫法如下:
select avg(成績)from student;
4.計算成績這一列的最大值、最小值,寫法如下:
select max(成績),min(成績)from student;
可以發現彙總函數的寫法基本相似。通常來說,彙總函數是一種比較簡單的函數,不會單獨使用,一般都要結合其他函數(group by等)才能更好的達到分析效果。
2.資料分組函數
彙總函數是按照某一列對資料進行計算,比如計算【姓名】列的總數量,現在如果要看的細一點,分别計算男生、女生的總人數,怎麼實作呢?這裡就需要用到分組函數,看下面這張表:
上表一共有三行資料,通過分組函數(‘group by’)來實作分組統計。‘group by’函數一般和彙總函數一起使用。對應的寫法如下:
select 性别,count(*)from studentgroup by 性别;
注意:
1.上面語句的運作順序是:第二行--第三行--第一行,也就是先選擇表,再按照條件對資料分總,最後計總顯示出來。
再舉一個例子:
你想統計出生日期大于‘1990-01-02’的男生總數、女生總數,該如何寫SQL語句?先寫出分析思路:
- 篩選出出生日期大于‘1990-01-02’的資料:where 出生日期 > 1990-01-02’
- 将資料按照性别分組:group by 性别
- 分别計算每一組的人數:count 性别
把上面的分析思路整理成SQL語句,如下:
select 性别,count(*) as 學生人數from student where 出生日期 > 1990-01-02’group by 性别;
以上語句運作的結果如下:
3.對分組結果指定條件
上個栗子,你統計出了出生日期大于‘1990-01-02’的男生總數、女生總數後,隻想顯示男生的資料,該如何寫語句呢?可以使用‘having’語句對分組結果,指定條件,寫法如下:
select 性别,count(*) as 學生人數from student where 出生日期 > 1990-01-02’group by 性别having 性别 = 男;
注意:
這裡為什麼不用‘where’子句來指定條件?因為where隻能指定行的原始資料。
‘having’,用于對分組以後資料,指定條件。
4.對查詢結果排序
統計出資料後,為了友善觀察,通常需要對資料進行排序,簡單的排序有兩種,升序、降序。我們在excel中都使用過類似的功能,那麼在SQL中如何實作?
在SQL通過‘order by’函數來實作,一般有兩種排序,降序(desc):從大到小,升序(asc):從小到大。
舉個例子:
現在有一張成績表‘score’,如下。現在你想計算出平均成績大于80分的課程,并由高到低排列,該如何寫函數?
我們先寫出分析思路,如下:
- 對成績按照課程号分組:group by 課程号
- 求課程的平均值:avg (成績) as 平均成績
- 平均成績大于80分: having 平均成績 >80
- 由高到低排列(降序):order by 平均成績 desc
把上面的分析思路整理成SQL語句,如下:
select 課程号,avg(成績) as 平均成績from scoregroup by 課程号having avg(成績) > 80oorder by 平均成績 desc;
注意:
使用‘order by’語句的時候,如果查詢的列包含空值,空值會在查詢結果的開頭展示。如果資料庫有大量資料,你隻想傳回一部分資料的時候,該怎麼辦?可以使用limit,從查詢結果中,展示指定行的資料。寫法如下:
select *from scorelimit 2;
意思就是隻取前兩行資料。
彙總分析就到這裡了,關于SQL的内容還有最後一節:複雜查詢,講完了會分享一案例和資料分析的基本思路。其實SQL學習來并不很很難,它就是一門工具,你使用的越多就會越熟練。要多多練習!
歡迎持續關注,公号:資料産品經理之路。