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 里做報表、匯總、統計的核心工具。