第四题:Classes More Than 5 Students

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;

 

posted @ 2019-02-25 11:03  小林子奋斗的点滴  阅读(186)  评论(0编辑  收藏  举报