596.超过5名学生的课

警告
本文最后更新于 2020-04-15,文中内容可能已过时。

有一个 course 表,有:student (学生)class (课程)

请列出所有超过或等于5名学生的课。

示例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
+---------+------------+
| student | class      |
+---------+------------+
| A       | Math       |
| B       | English    |
| C       | Math       |
| D       | Biology    |
| E       | Math       |
| F       | Computer   |
| G       | Math       |
| H       | Math       |
| I       | Math       |
+---------+------------+

应该输出:

1
2
3
4
5
+---------+
| class   |
+---------+
| Math    |
+---------+

说明:

  • 学生在每个课中不应该被重复计算。

思路:

先统计每门课程的学生数量,再从中选择超过 5 名学生的课程。

使用 GROUP BYCOUNT 获得每门课程的学生数量。

1
2
3
4
5
6
SELECT
    class, COUNT(DISTINCT student)
FROM
    courses
GROUP BY class
;

注:使用 DISTINCT 防止在同一门课中学生被重复计算。

输出结果:

1
2
3
4
5
6
7
8
+----------+----------------+
| class    | COUNT(student) |
|----------|----------------|
| Biology  | 1              |
| Computer | 1              |
| English  | 1              |
| Math     | 6              |
+----------+----------------+

使用上面查询结果的临时表进行子查询,筛选学生数量超过 5 的课程。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
SELECT
    class
FROM
    (SELECT
        class, COUNT(DISTINCT student) AS num
    FROM
        courses
    GROUP BY class) AS temp_table
WHERE
    num >= 5
;

思路:

GROUP BY 子句后使用 HAVING 条件是实现子查询的一种更加简单直接的方法。

所以我们可以将上面的解决方案重写为:

1
2
3
4
5
6
7
SELECT
    class
FROM
    courses
GROUP BY class
HAVING COUNT(DISTINCT student) >= 5
;