有一个courses 表 ,有: student (学生) 和 class (课程)。
请列出所有超过或等于5名学生的课。
例如,表:
+---------+------------+
| student | class |
+---------+------------+
| A | Math |
| B | English |
| C | Math |
| D | Biology |
| E | Math |
| F | Computer |
| G | Math |
| H | Math |
| I | Math |
+---------+------------+
应该输出:
+---------+
| class |
+---------+
| Math |
+---------+
Note:
学生在每个课中不应被重复计算。
题目来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/classes-more-than-5-students
审题:
第一列是学生,第二列是课程。没有重复的学生,所以,每个学生只能上一门课。统计第二列超过五个的课程。
思考:
本题和第一列无关,直接统计第二列超过五个的课程就可以。
解题:
方法一:获取每个班级的学生编号。我们可以使用GROUP BY
和COUNT
,它非常流行用于统计基于表中的某些字符。
SELECT
class, COUNT(DISTINCT student)
FROM
courses
GROUP BY class;
注意:我们DISTINCT
在这里使用,因为学生姓名可能在课程中重复,因为在问题描述中提到了它。
通过将上述查询作为子查询来查询:查询上表结果中大于5的结果。
SELECT
class
FROM
(SELECT
class, COUNT(DISTINCT student) AS num
FROM
courses
GROUP BY class) AS temp_table
WHERE
num >= 5;
方法二:方法:使用GROUP BY
和HAVING
条件。关键点在于HAVING的使用。
使用子查询是向GROUP BY
子句添加某些条件的一种方法,但是,使用HAVING
是另一种更简单和自然的方法。所以我们可以重写上面的解决方案如下。
SELECT
class
FROM
courses
GROUP BY class
HAVING COUNT(DISTINCT student) >= 5;
相关知识:
在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与聚合函数一起使用。
HAVING 子句可以让我们筛选分组后的各组数据。
SQL基本函数,聚合函数对一组值执行计算,并返回单个值,也被称为组函数。 聚合函数经常与 SELECT 语句的 GROUP BY 子句的HAVING一同使用。