数据库原理与应用实验指导
SELECT SNAME,CNAME,GRADE
FROM (SELECT SNAME,CNAME,GRADE
FROM STUDENT,SC,COURSE
WHERE SSEX='女' AND STUDENT.SNO=SC.SNO AND http://www.77cn.com.cnO=http://www.77cn.com.cnO)
AS TEMP(SNAME,CNAME,GRADE)
WHERE GRADE>90; -- 特意用查询表达式实现,完全可用其它方式实现
但如下使用查询表达式的查询,则不易改写为其它形式。
[例27] 查询各不同平均成绩所对应的学生人数(给出平均成绩与其对应的人数)。 Select avgr,COUNT(*)
From (Select sno,avg(grade) From SC
Group By sno) as SG(Sno,avgr)
Group By avgr;
[例28] 查出学生、课程及成绩的明细信息及课程门数、总成绩及平均成绩。
SELECT sno,cno,grade -- COMPUTE的其它使用方法,请参阅帮助。
FROM sc
ORDER BY sno
COMPUTE count(cno),SUM(grade),avg(grade) BY sno
[例29] 建立信息系学生的视图(含有学号、姓名、年龄及性别),并要求进行修改和插入操作时仍须保证该视图只有信息系的学生。通过视图查找年龄大于等于18岁的女学生。
CREATE VIEW IS_Student
AS SELECT Sno,Sname,Sage,Ssex
FROM Student
WHERE Sdept='IS' WITH CHECK OPTION;
SELECT * FROM IS_Student WHERE Sage>=18 AND Ssex='女';
[例30] 设有学生-课程关系数据库,其数据库关系模式为:
学生S(学号S#,姓名SN,所在系SD,年龄SA)、课程C(课程号C#,课程名称CN,先修课号PC#)、学生选课SC(学号S#,课程号C#,成绩G)。
试用SQL语言分别写出下列查询(只需写出SQL命令):
(1) 求学生'98001'(为学号)所选的成绩为60以上的课程号。
(2) 求选读了“数据库概论”,并成绩为80或90的学生学号和姓名。
(3) 求选修了全部课程的学生学号、姓名及其所在系名。
(4) 找出没有学生选修的课程号及课程名称。
(5) 列出选课数超过3门的学生学号、其所修课程数及平均成绩。
(6) 删除“数据结构”课程及所有对它的选课情况。
解:
(1) SELECT C# FROM SC WHERE S#='98001' AND G>=60;
(2) SELECT S#,SN FROM S,SC,C
WHERE C.C#= SC.C# AND SC.S#=S.S# AND http://www.77cn.com.cn='数据库概论'
8