SQL查询中HAVING子句是否受WHERE子句过滤结果约束?
SQL HAVING子句统计范围问题解答
你的SQL语句里,HAVING COUNT(sprints.id) > 2统计的是创建时间在x到y之间的冲刺(sprints)数量大于2,而且HAVING子句本身就是基于WHERE子句过滤后的结果进行统计的。
核心逻辑说明
SQL的执行顺序决定了这一点:
- 首先通过
FROM和INNER JOIN关联sprints和users表,得到基础数据集 - 然后执行
WHERE子句,过滤出满足sprints.user_id IN (1,2,3)且sprints.created_at BETWEEN x AND y的记录 - 接着按照
users.id对过滤后的记录分组 - 最后用
HAVING筛选分组结果,这里的COUNT(sprints.id)统计的就是每个用户在WHERE过滤后的冲刺记录数,只有数量超过2的用户ID才会被返回
验证方法
如果想直观确认,可以把统计字段加到SELECT列表中:
SELECT users.id, COUNT(sprints.id) AS filtered_sprint_count FROM sprints INNER JOIN users ON (sprints.user_id = users.id) WHERE sprints.user_id IN (1,2,3) AND sprints.created_at BETWEEN x AND y GROUP BY users.id HAVING COUNT(sprints.id) > 2
返回的filtered_sprint_count就是每个用户在指定时间范围内的冲刺数量,能直接验证统计的是过滤后的结果。
内容的提问来源于stack exchange,提问作者michaelsking1993
相关产品推荐
相关产品推荐

