数据库语言SQL作业解答.doc
文本预览下载声明
SQL语言习题
1. 关系数据模型如下:
学生S(SNO,SN,SEX,AGE)
课程C(CNO,CN,PCNO) PCNO为直接先行课号
选课SC(SNO,CNO,GR) GR为课程考试成绩
用SQL写出查询程序:
选修课程“DB”的学生姓名SN。
方法1.
SELECT SN
FROM S
WHERE SNO IN ( SELECT SNO
FROM SC
WHERE CNO IN ( SELECT CNO /* = */
FROM C
WHERE CN = ‘DB’ ) );
方法2.
SELECT SN
FROM S, SC, C
WHERE S.SN=SC.SNO
AND SC.CNO=C.CNO
AND CN = “DB”;
2. 关系数据模型如下:
学生S(SNO,SN,SEX,AGE)
课程C(CNO,CN,PCNO) PCNO为直接先行课号
选课SC(SNO,CNO,GR) GR为课程考试成绩
用SQL写出查询程序:
查询课程名和它的直接先行课的课程名以及它的间接先行课的课程名。
SELECT CN, CX.CN, CY.CN
FROM C,C CX,C CY
WHERE C.PCNO=CX.CNO
AND CX.PCNO=CY.CNO
[例41]找出每个学生超过他选修课程平均成绩的课程号。
SELECT Sno,Cno
FROM SC x
WHERE Grade = ( SELECT AVG(Grade) FROM SC y
WHERE y.Sno=x.Sno );
3. 关系数据模型如下 P84 例4.26
学生S(SNO,SN,SEX,AGE)
课程C(CNO,CN,PCNO) PCNO为直接先行课号
选课SC(SNO,CNO,GR) GR为课程考试成绩
用SQL写出查询程序:
所有学生都选修的课程名CN。
方法1.
SELECT CN
FROM C
WHERE NOT EXISTS
( SELECT *
FROM S
WHERE NOT EXISTS
( SELECT *
FROM SC
WHERE SNO=S.SNO
AND CNO=C.CNO);
变换后语义:不存在这样的学生x,该学生没有选修P。
方法2.
SELECT CN
FROM C
WHERE CNO IN ( SELECT CNO
FROM SC
GROUP BY CNO
HAVING COUNT(*) = ( SELECT COUNT(*)
FROM S ));
[例46] 查询选修了全部课程的学生姓名。
SELECT Sname
FROM Student
WHERE NOT EXISTS
(SELECT *
FROM Course
WHERE NOT EXISTS
(SELECT *
FROM SC
WHERE Sno= Student.Sno
AND Cno= Course.Cno
)
);
x,该学生没有选修P。
4. 假设学生一课程数据库关系模式如下:
Student(Sno,Sn
显示全部