有一个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:

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

1.groud by 和 having

select class from courses  GROUP BY class having count(DISTINCT student) >=5;

思路: 计算超过5名学生的课程,因此需要使用分组groud by 分组后 就可以统计了 但是where是在groud by之前进行行级别的过滤 而having是在组级别上进行过滤,因此就可以确定使用 groud by+having组合来解决 去重的化 我想了很久还是不会,看了下答案 答案上是这么写的 count()函数里进行去重 这里重点标记一下。

2.ground by +子查询

SELECT
    class
FROM
    (SELECT
        class, COUNT(DISTINCT student) AS num
    FROM
        courses
    GROUP BY class) AS temp_table
WHERE
    num >= 5
;

思路:前提是需要进行分组操作,所以select class ,count(distinct student) from courses group by class 可以查到分组之后的信息了 ,将查询的表 当作一个临时表来进行操作。