SQL面试题更新 2026-08-03

请说明在SQL查询中,WHERE子句与HAVING子句的主要区别是什么?在哪些场景下应当分别使用它们?

考察说明

考查对SQL中WHERE与HAVING子句功能差异及适用场景的理解。

回答思路

  1. 【回答框架 1】WHERE子句在分组前对原始行进行过滤,作用于单行记录;HAVING子句在分组后对聚合结果进行过滤,作用于分组。二者执行阶段不同:WHERE先于GROUP BY执行,HAVING后于GROUP BY执行。
  2. 【回答框架 2】WHERE不能使用聚合函数,因为聚合在分组后才会计算;HAVING专门用于对聚合函数结果进行条件筛选,如SUM、COUNT、AVG等。若条件需基于聚合结果,必须使用HAVING。
  3. 【回答框架 3】在一条SQL中,WHERE和HAVING可同时使用:先用WHERE过滤参与分组的行,减少分组数据量,再用HAVING过滤分组后的结果。例如按部门统计工资总额,先WHERE排除离职员工,再HAVING筛出总额超10000的部门。
  4. 【回答框架 4】判断使用哪个子句的要点:若条件针对原始字段,如年龄大于30,使用WHERE;若条件针对聚合结果,如平均工资高于5000,使用HAVING。WHERE不能引用SELECT中的别名,HAVING在部分数据库中可引用别名,但依赖数据库实现。
  5. 【回答框架 5】执行性能上,优先使用WHERE缩小数据量,HAVING在分组后过滤,通常代价更高。因此能放在WHERE中的条件不要放到HAVING。
  6. 【关键点 1】WHERE在分组前过滤行,HAVING在分组后过滤分组。
  7. 【关键点 2】WHERE不能使用聚合函数,HAVING可使用聚合函数。
  8. 【关键点 3】同时使用时,WHERE先执行,HAVING后执行。
  9. 【关键点 4】条件基于原始字段时用WHERE,基于聚合结果时用HAVING。
  10. 【关键点 5】优先使用WHERE减少数据量,避免不必要的分组计算。
  11. 【易错点 1】误以为HAVING只能配合GROUP BY使用,实际上没有GROUP BY时HAVING也可对整体结果过滤。
  12. 【易错点 2】在WHERE中尝试使用聚合函数导致语法错误。
  13. 【易错点 3】将适用于WHERE的简单条件放在HAVING中,造成性能浪费。