数据库的三个基本表 
学生 S(S#,SNAME,AGE,SEX) 
选修 SC(S#,C#,GRADE) 
课程 C(C#,CNAME,TEACHER) 如何 检索全部学生都选修的课程的课程号与课程名 ?

解决方案 »

  1.   


    select a.c#,a.cname
    from
    (select c.c#,c.cname,count(s.s#) c_s
    from s,sc,c
    where a.s#=sc.s#
    and sc.c#=c.C#
    group by c.c#,c.cname)a,
    ,
    (select count(s#) all_s from s) b
    where a.c_s=b.all_s
      

  2.   

    如果S表的每个S#对应一个学生的。SELECT C#,CNAME FROM C WHERE C# IN(
        SELECT C# FROM SC GROUP BY S# HAVING COUNT(1)=(SELECT MAX(ROWNUM) FROM S)
    )未测试,供参考。
      

  3.   

    其实如果不显示学生名字的话,不用关联S 表的
    select a.c#,a.cname
    from
    //下面的是统计每门课程选择的人数
    (select c.c#,c.cname,count(sc.s#) c_s
    from sc,c
    where sc.c#=c.C#
    group by c.c#,c.cname)a,
    ,
    //下面的是统计总的学生数
    (select count(s#) all_s from s) b
    //最后两个结果集关联下,如果第一个结果集中的选择人数=总的学生数,则显示出来
    where a.c_s=b.all_s
      

  4.   

    使用count的方法不行吧?
    现在的问题是记录机比较。
    使用count则必须要求选修表里的所有记录的课程、学生字段都是学生表和可能表的子集。
    这对数据完成性的要求较高,当然这种方法也比较简单。
    也可以这么做。SELECT C.C# FROM C 
    WHERE NOT EXISTS( 
    SELECT 1 FROM (
    SELECT S#,C# FROM S,C
    MINUS
    SELECT S#,C# FROM SC) TA
    WHERE TA.C#=C.C#)
      

  5.   

    中的MINUS是什么意思??求解