数据库的三个基本表
学生 S(S#,SNAME,AGE,SEX)
选修 SC(S#,C#,GRADE)
课程 C(C#,CNAME,TEACHER) 如何 检索全部学生都选修的课程的课程号与课程名 ?
学生 S(S#,SNAME,AGE,SEX)
选修 SC(S#,C#,GRADE)
课程 C(C#,CNAME,TEACHER) 如何 检索全部学生都选修的课程的课程号与课程名 ?
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
SELECT C# FROM SC GROUP BY S# HAVING COUNT(1)=(SELECT MAX(ROWNUM) FROM 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
现在的问题是记录机比较。
使用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#)