1 Star 0 Fork 52

oboboyes / 数据库SQL实战

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
67.超过5名学生的课.md 2.95 KB
一键复制 编辑 原始数据 按行查看 历史
王鹏 提交于 2020-09-27 10:42 . 67.超过5名学生的课

超过5名学生的课

题目描述

有一个courses 表 ,有: student (学生) 和 class (课程)。 请列出所有超过或等于5名学生的课。

例如,表: +---------+------------+ | student | class | +---------+------------+ | A | Math | | B | English | | C | Math | | D | Biology | | E | Math | | F | Computer | | G | Math | | H | Math | | I | Math | +---------+------------+

Create table If Not Exists courses (student varchar(255), class varchar(255))
Truncate table courses
insert into courses (student, class) values ('A', 'Math')
insert into courses (student, class) values ('B', 'English')
insert into courses (student, class) values ('C', 'Math')
insert into courses (student, class) values ('D', 'Biology')
insert into courses (student, class) values ('E', 'Math')
insert into courses (student, class) values ('F', 'Computer')
insert into courses (student, class) values ('G', 'Math')
insert into courses (student, class) values ('H', 'Math')
insert into courses (student, class) values ('I', 'Math')

应该输出: +---------+ | class | +---------+ | Math | +---------+

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

答案

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

题解

方法一:使用 GROUP BY 子句和子查询【通过】 思路 先统计每门课程的学生数量,再从中选择超过 5 名学生的课程。

算法 使用 GROUP BY 和 COUNT 获得每门课程的学生数量。

SELECT
    class, COUNT(DISTINCT student)
FROM
    courses
GROUP BY class
;

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

class COUNT(student)
Biology 1
Computer 1
English 1
Math 6
使用上面查询结果的临时表进行子查询,筛选学生数量超过 5 的课程。
SELECT
    class
FROM
    (SELECT
        class, COUNT(DISTINCT student) AS num
    FROM
        courses
    GROUP BY class) AS temp_table
WHERE
    num >= 5
;

注:COUNT(student) 不能直接在 WHERE 子句中使用,这里将其重命名为 num。

方法二:使用 GROUP BY 和 HAVING 条件【通过】 算法: 在 GROUP BY 子句后使用 HAVING 条件是实现子查询的一种更加简单直接的方法。

SELECT
    class
FROM
    courses
GROUP BY class
HAVING COUNT(DISTINCT student) >= 5
;
SQL
1
https://gitee.com/oboboyes/database-sql-combat.git
git@gitee.com:oboboyes/database-sql-combat.git
oboboyes
database-sql-combat
数据库SQL实战
master

搜索帮助