【问题标题】:Get course name where students are more than 100获取学生人数超过 100 人的课程名称
【发布时间】:2018-05-29 03:54:23
【问题描述】:

我正在学习设计数据库。我找到了以下示例:

你被要求为一所大学的课程注册系统设计一个关系数据库。

系统有以下要求:

  • 一门课程只能分配一位老师
  • 一个老师可以教很多门课
  • 一个学生可以选修很多课程
  • 一门课程可以有很多学生

我的设计是这样的:

  • 课程CourseID主键)、课程名称小时
  • 学生学生ID主键),姓名
  • 教师教师 ID主键),姓名
  • CourseTimeSectionNo主键),CourseID主键), TeacherID, 时间表
  • 注册CourseID主键),SectionNo主键), StudentID (主键)

现在我正在尝试获取超过 100 名学生的课程名称。我将如何为此编写查询?谁能推荐一下?

我尝试了以下方法:

Select c.courseName FROM course c Where (select count(*) FROM Enrollment e where e.courseID=c.courseID and ) 但在那里敲击。

【问题讨论】:

  • 既然这是作业问题,我有义务问-What have you tried so far?
  • 这里会有加入、分组和计数
  • @DhruvJoshi 我正在尝试以这种方式执行此操作: Select c.courseName FROM course c Where (select count(*) FROM Enrollment e where e.courseID=c.courseID and ) 但我是不知道在此之后我应该如何选择超过 100 的学生
  • @StackAcc 请编辑您的问题并在其中添加上述查询。这将防止被窥视的反对票!
  • 显示一些返回相关部分的查询。阅读How to Ask 并采取行动并点击谷歌搜索“stackexchange 作业”。

标签: mysql sql-server database database-design


【解决方案1】:
select a.CourseID,a.CourseName from 
    enrollment a
inner join Course b
on a.CourseID=b.CourseID
    group by a.CourseID,CourseName
    having count(*)>100

-- Fatemeh 的小修改版

【讨论】:

    【解决方案2】:

    您似乎没有考虑过课程部分。例如,English-101 在周一/周三/周五上午 8 点至 10 点提供,周二/周四下午 6 点至 9 点提供。两者都是每周 6 小时,但部分不同。你的周二/周四班可能有 30 名学生,但周一/周三/周五是 100+...

    这是您正在考虑的场景类型吗,首先看一下先获得这 100 个计数的基础...

    select
          e.CourseID,
          e.SectionID,
          count(*) 
       from
          Enrollment e
       group by
          e.CourseID,
          e.SectionID
       having
          count(*) > 100
    

    因此,这将为每门课程 + 部分提供超过 100 名学生的任何内容。现在,要获取课程和所有其他信息,请将 THIS 结果连接到这些表中......类似的东西。

    select
          C.CourseName,
          C.Hours,
          CT.Schedule,
          T.Name,
          PQ.EnrollCount
       from
          ( select
                  e.CourseID,
                  e.SectionID,
                  count(*) EnrollCount
               from
                  Enrollment e
               group by
                  e.CourseID,
                  e.SectionID
               having
                  count(*) > 100 ) PQ
          JOIN Course C
             on PQ.CourseID = C.CourseID
          JOIN CourseTime CT
             on PQ.CourseID = CT.CourseID
            AND PQ.SectionID = CT.SectionID
             JOIN Teacher T
                on CT.TeacherID = T.TeacherID
    

    【讨论】:

      【解决方案3】:

      我正在回答以帮助您,以便您可以学习 SQL 并发现 SO 通常是一个不错的地方。现在是假期时间。干杯!

      所以你需要超过 100 名学生。现在唯一可以找到它的表是 Enrollment

      而且你需要 coursename,所以当然会涉及到 Course 表。

      现在你必须问问自己,他们是否可以加入。 当然,两者都有CourseID。 但是SectionNo 呢? 嗯,嗯,因为一门课程只能有一位老师教,而CourseTime 有带有 CourseID 的 sectionNo,并且只定义了什么老师和什么时间。所以这可能是多余的。但您必须验证这一点。

      在这种情况下,我们有自己的加入标准,我们只需要知道我们是否可以找到学生人数超过 100 人的课程

      100 名学生。所以这是聚合问题,所以GROUP BY

      但是按什么分组?好吧,我们需要 CourseName,它对于 CourseID 是唯一的,所以按 CourseName 分组。

      现在在检查带有条件的聚合时,我们使用-- yes HAVING

      所以我们有HAVING Count(1)>100

      下面的完整查询。希望它有所帮助,愿你长大后在 SO 上帮助他人。

        select 
          C.CourseName 
          from 
          Course C INNER JOIN 
          Enrollment E 
          on C.CourseID=E.CourseID
          group by C.CourseName
          having count(1)>100
      

      【讨论】:

        【解决方案4】:
         select a.CourseID,CourseName from 
            enrollment a
        inner join Course b
        on a.CourseID=b.CourseID
            group by a.CourseID,CourseName
            having count(StudentID)>100
        

        【讨论】:

        • 注册中没有课程名称栏? @FatemehSheikhha
        • 基于问题中的设计,招生中没有课程名称
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-02-03
        • 2022-09-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-24
        • 1970-01-01
        相关资源
        最近更新 更多