https://leetcode.com/problems/classes-more-than-5-students/description/
+---------+------------+
| student | class |
+---------+------------+
| A | Math |
| B | English |
| C | Math |
| D | Biology |
| E | Math |
| F | Computer |
| G | Math |
| H | Math |
| I | Math |
+---------+------------+
查找有五名及以上 student 的 class。
+---------+
| class |
+---------+
| Math |
+---------+
这里学习一下聚合函数,GROUP BY 和 HAVING 的使用
GROUP BY语句从英文的字面意义上理解就是“根据(BY)一定的规则进行分组(GROUP)”。
它的作用是通过一定的规则将一个数据集划分成若干个小的区域,然后针对若干个小区域进行数据处理。
注意:GROUP BY 是先排序后分组;
GROUP BY 和HAVING 的组合:前提必须了解sql语言中一种特殊的函数:聚合函数,
例如SUM, COUNT, MAX, AVG等。这些函数和其它函数的根本区别就是它们一般作用在多条记录上。
WHERE关键字在使用集合函数时不能使用,所以在集合函数中加上了HAVING来起到测试查询结果是否符合条件的作用。
需要注意说明:当同时含有WHERE子句、GROUP BY 子句 、HAVING子句及聚集函数时,执行顺序如下:
- 执行WHERE子句查找符合条件的数据;
- 使用GROUP BY 子句对数据进行分组;对GROUP BY 子句形成的组运行聚集函数计算每一组的值;最后用HAVING子句去掉不符合条件的组;
- HAVING子句中的每一个元素也必须出现在SELECT列表中。有些数据库例外,如oracle;
- HAVING子句和where子句都可以用来设定限制条件以使查询结果满足一定的条件限制;
- HAVING子句限制的是组,而不是行。WHERE子句中不能使用聚集函数,而HAVING子句中可以。
对于本题来说,考虑用聚合函数COUNT 来统计calss大于等于5的课程数,于是应该首先考虑将class分组(GROUP BY),在组内进行数量统计(HAVING COUNT),对于数量大于等于5的情况则SELECT出来,同时还要考虑同组内的student重复的情况,此时应该只计数一次(DISTINCT)。
SELECT class FROM courses GROUP BY class HAVING COUNT(DISTINCT student) >= 5;