获得所有学生选择的课程

时间:2014-09-13 15:10:39

标签: sql database relational-division

现在有两个表学生(sid,名称)课程(cid,名称),这种关系是多对多的。因此,还有另一个表 student_course(sid,cid),用于存储有关由谁选择的课程的信息。

如何编写可以获得所有学生选择的课程的SQL?

2 个答案:

答案 0 :(得分:2)

标准解决方案:使用NOT EXISTS ( ... NOT EXISTS (...))构造:

  • 找到所有学生参加的所有课程
  • ==>> 不得存在参与此课程的学生

SELECT * FROM course c
WHERE NOT EXISTS (
        SELECT * from student s
        WHERE NOT EXISTS (
                SELECT * from student_course cs
                WHERE cs.sid = s.sid
                AND cs.cid = c.cid
                )
        )
        ;

此查询通常比count() == count()变体更快(给定适当的索引)。原因是:您不必计算所有(不同)记录;一旦您找到一个学生参加课程,您可以从列表中省略课程嫌犯。另外:反连接通常可以使用索引[所以可以使用count(),但仍需要计算所有索引中的(不同)键值]

答案 1 :(得分:1)

Select c.cid, c.name 
From course c where 
(select count(1) from student) = (select count(1) from student_course sc where sc.cid = c.cid);

See SQL Fiddle

它会找到student_course表中该课程的参赛人数与学生人数相匹配的所有课程

CID NAME
1   Test Course1
4   Test Course4