Skip to content
sql
SELECT compid,count(*) from s_busi GROUP BY compid

为什么只是计算分组后的,而不是全部的, 统计是先分组,还是先统计

解答:

执行顺序

在 SQL 中,先分组,后统计。完整的执行顺序是:

  1. FROM - 确定数据来源表
  2. WHERE - 过滤行(在分组前)
  3. GROUP BY - 按指定列分组
  4. 聚合函数 (COUNT/SUM/AVG...) - 对每个组进行计算
  5. HAVING - 过滤分组结果
  6. SELECT - 选择最终显示的列

你的查询如何执行

sql

复制

sql
SELECT compid, count(*) 
FROM s_busi 
GROUP BY compid

执行过程

  1. 扫描 s_busi 表的所有数据
  2. compid 列的值进行分组(相同 compid 的行归为一组)
  3. 每个组分别执行 COUNT(*),统计该组内的行数
  4. 返回结果:每行显示一个 compid 和对应的组内计数

这就是为什么 COUNT(*) 只计算每个分组内的记录数,而不是全表的总数。

如何获取全部记录数?

如果你想在分组结果中同时显示全表的总记录数,可以使用窗口函数

sql

复制

sql
SELECT 
    compid,
    COUNT(*) AS 分组内数量,
    SUM(COUNT(*)) OVER() AS 全表总数
FROM s_busi
GROUP BY compid

或者使用子查询:

sql

复制

sql
SELECT 
    compid,
    COUNT(*) AS 分组内数量,
    (SELECT COUNT(*) FROM s_busi) AS 全表总数
FROM s_busi
GROUP BY compid

总结

  • 先分组 (GROUP BY),再对每个组执行聚合
  • COUNT(*) 在分组之后执行,统计的是组内行数
  • ✅ 要统计全表数据,需使用窗口函数或子查询

理解这个执行顺序对编写复杂 SQL 非常重要!

.