我正在学习设计一个数据库。我找到了以下示例:
您被要求为学院的课程注册系统设计关系数据库。
该系统具有以下要求:
我的设计是这样的:
现在我正在尝试获得超过100名学生的课程名称。我该怎么写这个查询?任何人都可以建议吗?
我尝试过以下方法:
选择c.courseName FROM course c where(select count(*)FROM Enrollment e where e.courseID = c.courseID and)但在那里敲击。
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
我正在回答你的帮助,以便你可以学习SQL并找到一个很好的地方。好吧,这是假期时间。干杯!
所以你需要超过100名学生。现在唯一找到它的桌子是Enrollment
而你需要coursename,所以当然Course
表参与其中。
现在你必须问问自己,他们是否可以加入。当然,两者都有CourseID
。但是SectionNo
怎么样?好吧,嗯,因为一门课程只能有一位老师教它,而且CourseTime
的sectionNo with CourseID,只定义了老师和什么时间。所以这可能是多余的。但你必须验证。
在这种情况下,我们有加入标准,我们只需要知道我们是否可以找到有> 100名学生的课程
100名学生。所以这是聚合问题,所以GROUP BY
。
但是按什么分组呢?好吧,我们需要CourseName,它对于CourseID是唯一的,所以按CourseName分组。
现在,在检查具有条件的聚合时,我们使用 - yes HAVING
所以我们有HAVING Count(1)>100
完整查询如下。希望它有所帮助,也许你会成长,以帮助其他人。
select
C.CourseName
from
Course C INNER JOIN
Enrollment E
on C.CourseID=E.CourseID
group by C.CourseName
having count(1)>100
看来你没有考虑过课程。例如,英语-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名学生的任何内容。现在,要获得课程和所有其他信息,请将这些结果加入到这些表格中......就像这样。
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
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的小修改版