PostgreSQL 筆記 - 分組與彙總操作
接下來的範例,我會用下列這三個資料表作為說明基礎:
使用 GROUP BY 來分組(Grouping)?
GROUP BY是用來把資料根據某個欄位「分組」的功能。- 分組之後,通常會搭配彙總函數(例如 COUNT, SUM)來看每組的結果。
舉例來看:
原本的 comments 表看起來像這樣:
用 GROUP BY user_id 的結果會像這樣:
注意!用 GROUP BY 後,不能直接選原本沒分組的欄位:
如何使用 Aggregation Function?
這些函數可以幫我們把很多筆資料「濃縮」成一筆結果。
常見的函數有:
COUNT():算有幾筆資料。SUM():加總數值。AVG():算平均。MIN():找最小值。MAX():找最大值。
錯誤示範:不能同時選原始欄位又做彙總,除非有 GROUP BY:
結合 GROUP BY + COUNT()
來看看一個實用的範例:
這樣就可以算出每個 user_id 各自留言了幾次。
COUNT() 小細節
如果用 COUNT(user_id),不會算進 NULL 值。
練習題:每張照片有幾則留言?
HAVING:對分組後的結果再做篩選
SQL 執行順序可以簡單理解為:
FROM:先抓資料。JOIN:合併其他資料表。WHERE:先做基本篩選。GROUP BY:分組。HAVING:再對分組後的結果做篩選。
範例 1:只選出留言數 > 2 且 photo_id < 3 的照片
範例 2:找出留言超過 20 次,且留言對象是前 50 張照片的使用者
範例 3:哪些手機廠商總營收超過 2,000,000?
資料如下:
解法如下: