
查询问题:设教学数据库 Education 有三个关系:
学生关系 S〔SNO,SNAME,AGE,SEX,SDEPT〕;学习关
系 SC〔SNO,CNO,GRADE〕;课程关系 C〔CNO,CNAME,
CDEPT,TNAME〕
(1)检索计算机系的全体学生的学号,姓名和性别;
(2)检索学习课程号为 C2 的学生学号与姓名;
(3)检索选修课程名为“DS〞的学生学号与姓名;
〔4〕检索选修课程号为 C2 或 C4 的学生学号;
〔5〕检索至少选修课程号为 C2 和 C4 的学生学号;
〔6〕检索不学 C2 课的学生姓名和年龄;
〔7〕检索学习全部课程的学生姓名;
〔8〕查询所学课程包含学生 S3 所学课程的学生学号。
〔1〕检索计算机系的全体学生的学号,姓名和性别;
SELECT Sno,Sname,Sex
FROM S
WHERE Sdept =’CS’;
〔2〕检索学习课程号为 C2 的学生学号与姓名;
〔3〕检索选修课程名为“DS〞的学生学号与姓名
本查询涉及到学号、姓名和课程名三个属性,分别
存放在 S 和 C 表中,但 S 和 C 表没有直接联系,必须通
过 SC 表建立它们二者的联系。 C → SC → S
根本思路:
〔1〕首先在 C 表中找出“DS〞课程的课程号 Cno;
〔2〕然后在 SC 表中找出 Cno 等于第一步给出的 Cno 集
合中的某个元素 Cno;
〔3〕最后在 S 关系中选出 Sno 等于第二步中 Sno 集合
中某个元素的元组,取出 Sno 和 Sname 送入结果表列。
SELECT Sno,Sname
FROM S
WHERE Sno IN
〔SELECT Sno
FROM SC
WHERE Cno IN
〔SELECT Cno
FROM C
WHERE Cname=‘DS’〕〕;
(4)检索选修课程号为 C2 或 C4 的学生学号;
SELECT Sno
FROM SC
WHERE Cno=‘C2’ OR Cno=‘C4’;
(5)检索至少选修课程号为 C2 和 C4 的学生学号;
SELECT Sno
FROM SC X,SC Y
WHERE X.Sno=Y.Sno AND X.Cno=‘C2’ AND Y.Cno=
‘C4’ ;
(6)检索不学 C2 课的学生姓名和年龄;
(7)检索学习全部课程的学生姓名;
在表 S 中找学生,要求这个学生学了全部课程。换言之,
在 S 表中找学生,在 C 中不存在一门课程,这个学生没
有学。
SELECT Sname
FROM S
WHERE NOT EXISTS
〔SELECT *
FROM C
WHERE NOT EXISTS
〔SELECT *
FROM SC
WHERE SC.Sno=S.Sno AND
SC.Cno=C.Cno〕);
(8)查询所学课程包含学生 S3 所学课程的学生学号。
分析:不存在这样的课程 Y,学生 S3 选了 Y,而其他学
生没有选。
SELECT DISTINCT Sno
FROM SC AS X
WHERE NOT EXISTS
〔SELECT *
FROM SC AS Y
WHERE Y.Sno=‘S3’ AND NOT EXISTS
〔SELECT *
FROM SC AS Z
WHERE Z.Sno=X.Sno AND Z.Cno=Y.Cno〕);
2.SELECT S.Sno,Sname
FROM S,SC
WHERE S.Sno=SC.Sno
AND SC.Cno=‘C2’;
1.SELECT Sno,Sname
FROM S
WHERE Sno IN
〔 SELECT Sno
FROM SC
WHERE Cno=‘C2’)
1.SELECT Sname
FROM S
WHERE Sno NOT IN
〔 SELECT Sno
FROM SC
WHERE Cno=‘C2’);
2.SELECT Sname
FROM S
WHERE NOT EXISTS
〔 SELECT *
FROM SC
AND Cno=‘C2’);