知识

WHERE, GROUP BY, HAVING

当查询语句的目标列中包含聚合函数时,若没有分组子句,则目标列中只能写聚合函数,而不能再写其他列名。若包含分组子句,则在查询的目标列中除了可以写聚合函数外,只能写分组依据列。
WHERE子句用来筛选FROM子句中指定的数据源所产生的行数据。
GROUP BY子句用来对经WHERE子句筛选后的结果数据进行分组。
HAVING子句用来对分组后的结果数据再进行筛选。
对于可以在分组操作之前应用的搜索条件,在WHERE子句中指定它们更有效,这样可以减少参与分组的数据行。
应当在HAVING子句中指定的搜索条件应该是那些必须在执行分组操作之后应用的搜索条件。
建议将所有行搜索条件放在WHERE子句中而不是HAVING子句中

例38.查询计算机系和信息管理系的学生人数:

SELECT Sdept, COUNT(*) FROM Student
GROUP BY Sdept
HAVING Sdept in ( '计算机系', '信息管理系’)

或:

SELECT Sdept, COUNT (*) 
FROM Student
WHERE Sdept in ( '计算机系', '信息管理系')
GROUP BY Sdept

第二种写法比第一种写法效率要高,因为参与分组的数据会比较少。

题解

题目:现在运营想要查看不同大学的用户平均发帖情况,并期望结果按照平均发帖情况进行升序排列,请你取出相应数据。

SELECT university,AVG(question_cnt)avg_quesition_cnt
FROM user_profile
GROUP BY university
ORDER BY avg_quesition_cnt ASC

示例:user_profile

根据示例,你的查询应返回以下结果: