GROUP BY
是 SQL 中用来“按列分组”的子句。
它把相同值的行分到同一个组,然后通常配合聚合函数(COUNT
, SUM
, AVG
, MAX
, MIN
等)对每个组做统计,最终每组只返回一行结果。
✅ 1. 基本语法
SELECT 列1, 列2, 聚合函数(列3)
FROM 表名
GROUP BY 列1, 列2;
- 规则:
SELECT
后面出现的非聚合列,必须全部出现在GROUP BY
中。
❌SELECT name, age, COUNT(*) FROM emp GROUP BY name;
(错误,age 没分组)
✅SELECT name, age, COUNT(*) FROM emp GROUP BY name, age;
✅ 2. 工作流程(3 步)
- 按 GROUP BY 列的值分组
- 把每组内的行聚合(用聚合函数)
- 每组返回一行结果
✅ 3. 示例表:sales
order_id | region | product | amount |
---|---|---|---|
1 | 华北 | 苹果 | 100 |
2 | 华北 | 苹果 | 200 |
3 | 华南 | 苹果 | 150 |
4 | 华南 | 香蕉 | 80 |
🔍 按 region 分组,统计销售额
SELECT region,
SUM(amount) AS total_sales
FROM sales
GROUP BY region;
结果:
region | total_sales
-------|------------
华北 | 300
华南 | 230
🔍 按 region + product 分组,统计订单数
SELECT region,
product,
COUNT(*) AS order_cnt
FROM sales
GROUP BY region, product;
结果:
region | product | order_cnt
-------|---------|----------
华北 | 苹果 | 2
华南 | 苹果 | 1
华南 | 香蕉 | 1
✅ 4. 常见搭配
搭配 | 作用 | 示例 |
---|---|---|
GROUP BY + HAVING |
对聚合结果再过滤 | HAVING SUM(amount) > 200 |
GROUP BY + ORDER BY |
对分组结果排序 | ORDER BY total_sales DESC |
GROUP BY + 多列 |
更细粒度分组 | GROUP BY region, product |
✅ 5. 易错点
- 在
SELECT
里写了列,却没写进GROUP BY
→ 报错(MySQL 除外,它有宽松模式)。 WHERE
和HAVING
的区别:WHERE
:在分组前过滤原始行。HAVING
:在分组后过滤聚合结果。
✅ 6. 一句话总结
GROUP BY
就是“把相同值的行捆成一组,然后对每组做统计”,是 SQL 里做报表、汇总、统计的核心工具。