我們之前曾介紹過MYSQL聚合函數:
第二十二日-MYSQL聚合函數:MAX、MIN、AVG、SUM、COUNT
今天要介紹另外一個重要的聚合函數:GROUP BY,搭配HAVING使用。
MYSQL語法和函數分開一個一個看,其實都不會到非常難,
難的是各種COMBO,今天的語法會融合之前學到的函數,
以下盡量拆解成步驟來介紹!
GROUP BY可以把資料分類,
例如我們之前在使用SUM()時,只能計算全部資料的SUM(),或是用WHERE來限制資料,
但有GROUP BY後,我們可以指定SUM()的資料要GROUP BY類別。
舉例而言,我們可以GROUP BY性別,這樣就能選出男性與女性分別的COUNT,計算出各性別人數,
或是我們可以用MIN(出生日期),GROUP BY class,計算出每個class裡面出生日期最小的學生,
GROUP BY 讓我們可以把資料分類比較。
GROUP BY擺放的位置會在選取的資料後面,
也就是:
例如我們選出每堂課程的名稱和學生人數,並且照課程id排序:
拆解步驟的話會是:
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就是GROUP BY的WHERE,
HAVING可以過濾GROUP BY以後的資料,
例如說計算出各性別人數後,可以HAVING人數大於10的,代表我們只選出大於10的性別。
HAVING既然是用來過濾GROUP BY後的資料,
自然是放在GROUP BY後面。
下面就是選出2019年學費總額超過1000的課程,並照課程id排序。
拆解步驟的話會是:
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。
關於HAVING例子的拆解方法裡的第6點
用HAVING選出費用大於2000=>HAVING SUM(fee)>2000
大於2000應該改成大於1000
用HAVING選出費用大於1000=>HAVING SUM(fee)>1000