0Pricing
SQL Academy · 课时

按单列与多列 GROUP BY

按一个或多个列对行分组,以生成小计和类别明细,并阅读 GROUP BY 查询计划。

按单列与多列 GROUP BY 是 CoddyKit 上的免费 SQL Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 SQL Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 SQL Academy 课程共包含 4 节课。

GROUP BY 的作用

GROUP BY 按一个或多个列值将行划分为多个组,然后对每个组应用聚合函数。

按单列分组

统计每位用户的订单总数:

SELECT user_id, COUNT(*) AS order_count, SUM(total) AS revenue
FROM orders
GROUP BY user_id
ORDER BY revenue DESC;

按多列分组

按类别和国家划分子组:

SELECT country, category, SUM(total) AS revenue
FROM orders o
JOIN products p ON p.id = o.product_id
JOIN users   u ON u.id = o.user_id
GROUP BY country, category
ORDER BY country, revenue DESC;

每个 SELECT 选出的列都必须分组或聚合

标准 SQL 规则:

-- WRONG — email is neither grouped nor aggregated:
SELECT user_id, email, COUNT(*)
FROM orders
GROUP BY user_id;     -- ERROR

-- RIGHT — group by both, or use an aggregate:
SELECT user_id, MAX(email) AS email, COUNT(*)
FROM orders
GROUP BY user_id;

按表达式进行 GROUP BY

按表达式的结果进行分组(例如按月份分组):

SELECT date_trunc('month', created_at) AS month, SUM(total)
FROM orders
GROUP BY date_trunc('month', created_at)
ORDER BY month;

按位置或别名进行 GROUP BY

您可以按 SELECT 列表中的位置或别名进行分组(PostgreSQL):

SELECT date_trunc('month', created_at) AS month, SUM(total)
FROM orders
GROUP BY month             -- alias
ORDER BY 1;                -- position

分组集合、ROLLUP、CUBE

在一次查询中计算多个分组,非常适合计算小计:

SELECT country, category, SUM(total)
FROM orders o JOIN ...
GROUP BY ROLLUP (country, category);

-- Returns:  per (country, category),  per country,  grand total

空分组不存在

GROUP BY 只会返回至少包含一行的分组。如果您希望显示每个类别(包括订单数为零的类别),请从主列表执行 LEFT JOIN,然后进行聚合。

GROUP BY 与索引

规划器可能会使用哈希聚合(构建分组哈希表),也可能使用排序后分组的策略。在分组列上建立索引,可以让第二种方式更快。

窗口函数与 GROUP BY

GROUP BY 会合并行。窗口函数会在保留每一行的同时添加聚合列。请选择合适的工具——相关内容将在“窗口函数深入解析”中介绍。

HAVING 与 WHERE 中的别名

逻辑顺序:FROM → WHERE → GROUP BY → HAVING → SELECT。WHERE 无法查看聚合结果,而 HAVING 可以。

回顾

GROUP BY 是报表查询的主力。

  • 每个 SELECT 选出的列都必须分组或聚合
  • 可以按列、表达式或别名进行分组
  • 使用 ROLLUP/CUBE/GROUPING SETS 创建交叉表

快速检查

在 GROUP BY country 查询中,SELECT 列表是否可以包含既未聚合也未分组的 city 列?

常见问题解答

「按单列与多列 GROUP BY」课时是免费的吗?

是的 — 「按单列与多列 GROUP BY」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 SQL Academy 课程的其余内容,请升级到 CoddyKit PRO。 SQL Academy 课程共包含 4 节课。

「按单列与多列 GROUP BY」这节课中我会学到什么?

按一个或多个列对行分组,以生成小计和类别明细,并阅读 GROUP BY 查询计划。 你通过在浏览器中直接运行的动手代码来练习 SQL Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 SQL Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 SQL Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。

「按单列与多列 GROUP BY」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 SQL Academy 课中编写并运行代码吗?

能。每节 SQL Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. COUNT、SUM、AVG、MIN、MAX
  2. 按单列与多列 GROUP BY
  3. HAVING 与 WHERE
  4. 常见陷阱:聚合中的 NULL
← 返回 SQL Academy