select university, avg(question_cnt) as avg_question_cnt, avg(answer_cnt) as avg_answer_cnt from user_profile group by university having avg_question_cnt<5 or avg_answer_cnt<20; # 1. **`WHERE` 子句**: # - 作用于**原始数据行**,在数据分组(`GROUP BY`)之前执行 # - 只能筛选**单个行的字段值**,不能使用聚合函数(如 `AVG()`、`SUM()` 等)作为筛选条件 # 2. **`HAVING` 子句**: # - 作用于**分组后的结果**,在 `GROUP BY` 之后执行 # - 专门用于筛选**聚合函数计算后的结果**(如平均值、总和等) # 在你的查询中,需要筛选的是 `avg(question_cnt) < 5` 或 `avg(answer_cnt) < 20`,这些都是**分组后的聚合结果**,而不是原始数据中的字段值。因此: # - 不能用 `WHERE`,因为 `WHERE` 无法处理聚合函数的结果 # - 必须用 `HAVING`,因为它是专门为筛选分组后的聚合结果设计的 # 简单来说:`WHERE` 管行,`HAVING` 管组。涉及聚合函数的筛选,只能用 `HAVING`。