Rick's DevNotes
筆記關於我作品集
筆記類別
  • 全部
  • DockerDocker
  • NetworkNetwork
  • RxJSRxJS
  • NginxNginx
  • TypeScriptTypeScript
  • Data_Structure_And_AlgorithmData Structure And Algorithm
  • JavaScriptJavaScript
  • PostgreSQLPostgreSQL
  • ReactReact
  • GitGit

© 2026 Rick's DevNotes. All rights reserved.

# SQL

建立時間:2024/08/08

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 執行順序可以簡單理解為:

  1. FROM:先抓資料。
  2. JOIN:合併其他資料表。
  3. WHERE:先做基本篩選。
  4. GROUP BY:分組。
  5. HAVING:再對分組後的結果做篩選。

範例 1:只選出留言數 > 2 且 photo_id < 3 的照片

範例 2:找出留言超過 20 次,且留言對象是前 50 張照片的使用者

範例 3:哪些手機廠商總營收超過 2,000,000?

資料如下:

解法如下:

參考資料

  • SQL and PostgreSQL: The Complete Developer's Guide