iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 26
0
AI & Data

作者超囉嗦,但一天只要十分鐘的MYSQL真.新手教學系列 第 26

第二十六日-MYSQL聚合函數:GROUP BY搭配HAVING

  • 分享至 

  • xImage
  •  

我們之前曾介紹過MYSQL聚合函數:
第二十二日-MYSQL聚合函數:MAX、MIN、AVG、SUM、COUNT
今天要介紹另外一個重要的聚合函數:GROUP BY,搭配HAVING使用。

MYSQL語法和函數分開一個一個看,其實都不會到非常難,
難的是各種COMBO,今天的語法會融合之前學到的函數,
以下盡量拆解成步驟來介紹!

  • GROUP BY()

GROUP BY可以把資料分類
例如我們之前在使用SUM()時,只能計算全部資料的SUM(),或是用WHERE來限制資料,
但有GROUP BY後,我們可以指定SUM()的資料要GROUP BY類別。

舉例而言,我們可以GROUP BY性別,這樣就能選出男性與女性分別的COUNT,計算出各性別人數,
或是我們可以用MIN(出生日期),GROUP BY class,計算出每個class裡面出生日期最小的學生,
GROUP BY 讓我們可以把資料分類比較
GROUP BY擺放的位置會在選取的資料後面,
也就是:

  1. 選取的資料(SELECT...FROM...WHERE)
  2. GROUP BY(欄位)
  3. (ORDER BY)

例如我們選出每堂課程的名稱和學生人數,並且照課程id排序:

拆解步驟的話會是:

  1. 把student表和class表先JOIN=>FROM education.student s JOIN class c ON s.class=c.id
  2. 選出要的欄位=>SELECT class,subject,COUNT(*) AS '人數'
  3. 用以上兩行組成選取的資料,再開始分類
  4. 用class分類=>GROUP BY s.class
  5. 用class排序=>ORDER BY class
SELECT class,subject,COUNT(*) AS '人數' FROM education.student s  JOIN  class c ON s.class=c.id GROUP BY s.class ORDER BY class;
  • HAVING

HAVING就是GROUP BY的WHERE,
HAVING可以過濾GROUP BY以後的資料
例如說計算出各性別人數後,可以HAVING人數大於10的,代表我們只選出大於10的性別。

HAVING既然是用來過濾GROUP BY後的資料,
自然是放在GROUP BY後面。

下面就是選出2019年學費總額超過1000的課程,並照課程id排序。

拆解步驟的話會是:

  1. 把student表和class表先JOIN=>FROM education.student s JOIN class c ON s.class=c.id
  2. 選出要的欄位=>subject,SUM(fee)
  3. 篩出2019年的學生=>WHERE YEAR(start_date)='2019'
  4. 用以上三行組成選取的資料,再開始分類
  5. 用class分類=>GROUP BY s.class
  6. 用HAVING選出費用大於2000=>HAVING SUM(fee)>2000
  7. 最後再用class排序=>ORDER BY class
SELECT class,subject,SUM(fee) FROM education.student s JOIN  class c ON s.class=c.id WHERE YEAR(start_date)='2019' GROUP BY s.class HAVING SUM(fee)>1000 ORDER BY class;

最後選出來的應該會是'guitar' 1800。


上一篇
第二十五日-MYSQL常用字串函數:用分隔符取字串、字串合併
下一篇
第二十七日-MYSQL的「如果」:IF、CASE基本用法
系列文
作者超囉嗦,但一天只要十分鐘的MYSQL真.新手教學30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
kouhei
iT邦新手 5 級 ‧ 2023-10-27 09:48:53

關於HAVING例子的拆解方法裡的第6點

用HAVING選出費用大於2000=>HAVING SUM(fee)>2000

大於2000應該改成大於1000

用HAVING選出費用大於1000=>HAVING SUM(fee)>1000

我要留言

立即登入留言