SQL 道场
返回资料库

SQL 基础 / 7 min

GROUP BY:把多行合成一行

聚合的核心是“按什么分组”和“每组算什么”。

GROUP BYcountsum

聚合先问两个问题

写 GROUP BY 前,先问:

  1. 按什么分组?
  2. 每组算什么指标?

比如“每个城市有多少用户”:

SELECT city, count(*) AS user_count
FROM users
GROUP BY city;

city 是分组维度,count(*) 是每组指标。

常见聚合函数

count(*)       -- 行数
sum(amount)    -- 总和
avg(amount)    -- 平均值
max(amount)    -- 最大值
min(amount)    -- 最小值

SELECT 里能放什么

用了 GROUP BY 后,SELECT 里通常只能放:

  • 分组字段
  • 聚合函数

比如下面这条就容易出错,因为 name 既不是分组字段,也不是聚合结果:

SELECT city, name, count(*)
FROM users
GROUP BY city;

WHERE 和 HAVING

WHERE 在分组前过滤行,HAVING 在分组后过滤组。

SELECT city, count(*) AS user_count
FROM users
GROUP BY city
HAVING count(*) >= 2;