FROM Student,Course,SC
WHERE Student.Sno=SC.Sno AND SC.Cno=Course.Cno AND Cname='数据库'
【SY4-04】查询没有选修“数学”课程的学生的学号和姓名。
SELECT Sno,Sname FROM Student WHERE Sno not IN ( SELECT Sno FROM SC WHERE Cno IN (SELECT Cno FROM Course WHERE cname='数学' ) )
2 带有比较运算符的嵌套查询
【SY4-05】将SY4-01改为带有比较运算符的嵌套查询。
SELECT * FROM Student WHERE Dno= ( SELECT Dno FROM Student WHERE Sname='李勇'
)
3 带谓词ANY或ALL的嵌套查询
【SY4-06】查询其它系中比计算机系(DX01)某一学生年龄小的学生。 【方法一】
SELECT * FROM Student
WHERE Sbirth>ANY(SELECT Sbirth FROM Student WHERE Dno='DX01') AND Dno<>'DX01'
【方法二】
SELECT * FROM Student
WHERE Sbirth>(SELECT MIN(Sbirth) FROM Student WHERE Dno='DX01') AND Dno<>'DX01'
【SY4-07】查询其他系中比计算机系(DX01)学生年龄都小的学生。 【方法一】
SELECT * FROM Student
WHERE Sbirth>ALL(SELECT Sbirth FROM Student WHERE Dno='DX01') AND Dno<>'DX01'
【方法二】
SELECT *
12
FROM Student
WHERE Sbirth>(SELECT MAX(Sbirth) FROM Student WHERE Dno='DX01') AND Dno<>'DX01'
4 带谓词EXISTS的嵌套查询
【SY4-08查询所有选修了编号为“1”课程的学生姓名(Sname)。
SELECT Sno,Sname FROM Student WHERE EXISTS ( SELECT * FROM SC
WHERE Sno=Student.Sno AND Cno='1' )
【SY4-09查询所有选修了编号为“2”课程的学生姓名(Sname)。
SELECT Sno,Sname FROM Student WHERE NOT EXISTS ( SELECT * FROM SC
WHERE Sno=Student.Sno AND Cno='2' )
【SY4-10询与“李勇”在同一个系学习的学生信息。将【SY4-01】改为带谓词EXISTS的查询,其SQL语句如下:
SELECT Sno,Sname,Dno FROM Student A
WHERE EXISTS(SELECT * FROM Student B
WHERE B.Dno=A.Dno AND B.Sname='李勇' )
【SY4-11查询选修了所有课程的学生姓名。
由于没有全称量词,可将题目的意思转换成等价的用存在量词的形式:查询这样的学生,没有一门课程是他不选修的。其SQL语句为:
SELECT Sno,Sname FROM Student
WHERE NOT EXISTS(SELECT * FROM Course
WHERE NOT EXISTS(SELECT * FROM SC
WHERE Student.Sno=SC.Sno AND Course.Cno=SC.Cno ) )
13
二、集合查询
1.并运算
【SY4-12查询选修了1号课程或4号课程的学生学号。 【方法一】
SELECT Sno FROM SC WHERE Cno='1' UNION
SELECT Sno FROM SC WHERE Cno='4'
【方法二】
SELECT DISTINCT Sno FROM SC
WHERE Cno='1' OR Cno='4'
【SY4-13查询电子系(DX02)的学生或年龄小于19岁的学生信息。 【方法一】
SELECT * FROM Student WHERE Dno='DX02' UNION
SELECT * FROM Student WHERE YEAR(GETDATE())-YEAR(Sbirth)<19
【方法二】
SELECT * FROM Student WHERE Dno='DX02' OR YEAR(GETDATE())-YEAR(Sbirth)<19
2.交运算
【SY4-14查询选修了1号课程并且同时选修了4号课程的学生学号。 【方法一】
SELECT Sno FROM SC WHERE Cno='1' INTERSECT
SELECT Sno FROM SC WHERE Cno='4'
【方法二】
SELECT Sno FROM SC
WHERE Cno='1' AND Sno IN ( SELECT Sno FROM SC WHERE Cno='4' )
【SY4-15】查询计算机系(DX01)的学生且年龄小于19岁的学生的交集,这实际上就是查询计算机系中年龄小于26岁的学生。 【方法一】
SELECT * FROM Student WHERE Dno='DX01' INTERSECT
SELECT * FROM Student WHERE YEAR(GETDATE())-YEAR(Sbirth)<19
14
【方法二】
SELECT * FROM Student WHERE Dno='DX01' AND YEAR(GETDATE())-YEAR(Sbirth)<19
【SY4-16】查询学号为“2012314101”和“2012394101”的学生同时选修的课程的课程号。 【方法一】
SELECT Cno FROM SC WHERE Sno='2012314101' INTERSECT
SELECT Cno FROM SC WHERE Sno='2012394101'
【方法2】
SELECT Cno FROM SC
WHERE Sno='2012314101' AND Cno IN ( SELECT Cno FROM SC
WHERE Sno='2012394101' )
3.差运算
【SY4-17】查询选修了1号课程但没有选修2号课程的学生学号。 【方法一】
SELECT Sno FROM SC WHERE Cno='1' EXCEPT
SELECT Sno FROM SC WHERE Cno='2'
【方法二】
SELECT Sno FROM SC
WHERE Cno='1' AND Sno NOT IN ( SELECT Sno FROM SC WHERE Cno='2' )
【SY4-18】查询计算机系(DX01)的学生与年龄小于19岁的学生的差集。本查询的等价说法是,查询计算机系中年龄不小于19岁的学生。 【方法一】
SELECT * FROM Student WHERE Dno='DX01' EXCEPT
SELECT * FROM Student WHERE YEAR(GETDATE())-YEAR(Sbirth)<19
【方法二】
SELECT * FROM Student WHERE Dno='DX01' AND YEAR(GETDATE())-YEAR(Sbirth)!<19
【SY4-19】查询学号为“2012314101”的学生选修,但没有被“2012394101”学生所选修的课程的课程号。
15
【方法1】
SELECT Cno FROM SC WHERE Sno='2012314101' EXCEPT
SELECT Cno FROM SC WHERE Sno='2012394101'
【方法2】
SELECT Cno FROM SC
WHERE Sno='2012314101' AND Cno not IN ( SELECT Cno FROM SC
WHERE Sno='2012394101' )
16