实验4 SQL语言——SELECT查询操作
( SELECT * FROM SC SCY
WHERE SCY.Sno='98001' AND
NOT EXISTS
( SELECT * FROM SC SCZ
WHERE SCZ.Sno=SX.Sno AND http://www.77cn.com.cno=http://www.77cn.com.cno));
[例22] 查询选修了课程1或者选修了课程2的学生学号集。
SELECT Sno FROM SC WHERE Cno='1'
UNION
SELECT Sno FROM SC WHERE Cno='2';
[注意] 扩展的SQL中有集合操作并(UNION)、集合操作交(INTERSECT)和集合操作差(EXCEPT或MINUS)等。SQL的集合操作要求相容即属性个数、类型必须一致,属性名无关,最终结果集采用第一个结果的属性名,缺省为自动去除重复元组,各子查询不带Order By,Order By放在整个语句的最后。
[例23] 查询计算机科学系的学生与年龄不大于19岁的学生的交集。
SELECT * FROM Student WHERE Sdept='CS'
INTERSECT
SELECT * FROM Student WHERE Sage<=19; -- SQL Server 2000不支持运行
本查询等价于“查询计算机科学系中年龄不大于19岁的学生。”,为此变通法为: SELECT * FROM Student WHERE Sdept='CS' AND Sage<=19;
[例24] 查询选修课程1的学生集合与选修课程2的学生集合的差集。
SELECT Sno FROM SC WHERE Cno='1'
EXCEPT(或MINUS)
SELECT Sno FROM SC WHERE Cno='2'; -- SQL Server 2000不支持运行
本例实际上是查询选修了课程1但没有选修课程2的学生。为此变通法为:
SELECT Sno FROM SC
WHERE Cno='1' AND Sno NOT IN
(SELECT Sno FROM SC WHERE Cno='2');
[例25] 查询平均成绩大于85分的学号、姓名、平均成绩。
Select stu_no,sname,avgr
From Student,( Select sno,avg(grade) From SC
Group By sno) as SG(stu_no,avgr)
Where Student.sno=SG.stu_no And avgr>85;
SQL-92允许在 From中使用查询表达式,并必须为查询表达式取名。
它等价于如下未使用查询表达式的形式:
Select Student.Sno,Sname,AVG(Grade)
From Student,SC Where Student.Sno = SC.Sno
Group By Student.Sno,Sname HAVING AVG(Grade)>85;
[例26] 查出课程成绩在90分以上的女学生的姓名、课程名和成绩。
7