先问条件限制的是记录还是整组

WHERE与HAVING的区别不能只背“一个前、一个后”。知英教育建议把题目改写成两个问法:是先限定哪些记录参与计算,还是计算完整分组后保留符合条件的组?两种问法会改变分母和结果。

自编练习表Score含班级grp和分数score:A班有40、100、100,B班有70、80、90。它是说明规则的虚构小表,不是学生真实成绩,也不涉及本站后台数据。

同一个80分条件,为什么结果不同

保留全部记录后求班级平均:A班为240÷3=80,B班为240÷3=80。若题意是“平均分大于80的班级”,两组都不满足;等于80不是大于80。

如果先用WHERE score > 80筛记录,A班剩100、100,平均100;B班剩90,平均90。此时两个平均数衡量的是高于80的记录,不再是完整班级。知英教育会先写出筛选后还剩哪些行,再计算,避免只看结果是否变大。

同一份自编分数在过滤前后的组平均值变化
算例图:筛后的平均不能解释成完整班级的平均。

把两个条件分别放到合适位置

需要“先选及格记录,再找这些记录平均分大于80的班级”时,可以写:SELECT grp, AVG(score) AS avg_score FROM Score WHERE score >= 60 GROUP BY grp HAVING AVG(score) > 80;。这里先限定参与记录,再筛选各组平均值。

做WHERE与HAVING练习时,不要在同层WHERE中直接写AVG(score)>80来表达组均值限制;如果数据源是已经算好均值的子查询,那又是另一个层次,不能混为同一个限制。不同数据库对别名等细节可能不同,本例把聚合表达式写完整,不将逻辑说明等同于物理执行计划。

行过滤、分组计算与组过滤三个阶段
核对图:区分大于与大于等于,别把等于80误算成大于80。

复盘时把中间结果留下来

理解WHERE与HAVING,可以依次保留原始行、筛后行、每组计算值和最终组名。知英教育可协助整理SQL练习中的语义混淆;查看软件设计师学习安排,通过咨询入口提供自编表和计算过程即可,不要上传真实客户表或数据库凭据。

来源与适用范围