sql
SELECT compid,count(*) from s_busi GROUP BY compid为什么只是计算分组后的,而不是全部的, 统计是先分组,还是先统计
解答:
执行顺序
在 SQL 中,先分组,后统计。完整的执行顺序是:
- FROM - 确定数据来源表
- WHERE - 过滤行(在分组前)
- GROUP BY - 按指定列分组
- 聚合函数 (COUNT/SUM/AVG...) - 对每个组进行计算
- HAVING - 过滤分组结果
- SELECT - 选择最终显示的列
你的查询如何执行
sql
复制
sql
SELECT compid, count(*)
FROM s_busi
GROUP BY compid执行过程:
- 扫描
s_busi表的所有数据 - 按
compid列的值进行分组(相同 compid 的行归为一组) - 对每个组分别执行
COUNT(*),统计该组内的行数 - 返回结果:每行显示一个 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 非常重要!