1、带有IN谓词的子查询
查询与“刘晨”在同一个系学习的学生
SELECT Sno,Sname,Sdept FROM Student WHERE Sdept IN (SELECT Sdept FROM Student WHERE Sname='刘晨‘)本题也可以用自身连接完成
SELECT S1.Sno,S1.Sname,S1.Sdept FROM Student S1,Student S2 WHERE S1.Sdept=S2.Sdept AND S2.Sname=’刘晨‘2、带有比较运算符的子查询
找出每个学生超过他选修课程平均成绩的课程号。
SELECT Sno,Cno FROM SC x WHERE Grade>=(SELECT AVG(Grade) FROM SC y WHERE y.Sno=x.Sno);3、带有ANY(SOME)或ALL谓词的子查询
查询其它系中比计算机科学系某一学生年龄小的学生姓名和年龄。
SELECT Sname,Sage FROM Student WHERE Sage<ANY(SELECT Sage FROM Student WHERE Sdept='CS') AND Sdept!='CS'; /*注意这是父查询块中的条件*/ /*注意这是父查询块中的条件*/DSMS执行此查询时,首先处理子查询,找出CS系中所有学生的年龄,构成一个集合A,然后处理父查询,找所有不是CS系且年龄小于A中某个值的学生。
本例也可以用聚集函数来实现
SELECT Sname,Sage FROM Student WHERE Sage< (WHERE MAX(Sage) FROM Student WHERE Sdept='CS') AND Sdept<>'CS';查询其它系中比计算机科学系所有学生年龄都小的学生姓名及年龄。
SELECT Sname,Sage FROM Student WHERE Sage<ALL (SELECT Sage FROM Student WHERE Sdept='CS') AND Sdept<>'CS'; FROM Student WHERE Sdept='CS') AND Sdept<>'CS';4、带有EXISTS谓词的子查询
EXISTS代表存在量词。带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真值“true"或逻辑假值"false"。
查询所有选修了1号课程的学生姓名。
SELECT Sname,Sage FROM Student WHERE EXISTS (SELECT * FROM SC WHERE Sno=S AND Cno='1');由EXISTS引出的子查询,其目标列表达式通常都用*,因为带有EXISTS的子查询只返回真值或假值,给出列明无实际意义。
集合查询
查询计算机科学系的学生及年龄不大于19岁的学生
SELECT * FROM Student WHERE Sdept='CS' UNION SELECT * FROM Student WHERE Sage<=19;本查询实际上是求计算机科学系的所有学生与年龄不大于19岁的学生的并集。使用UNION将多个查询结果合并起来时,系统就会自动去掉重复元组。如果要保留重复元组则用UNION ALL操作符。
查询即选修了课程1又选修了课程2的学生。就是查询选修课程1的学生集合与选修课程2的学生集合的交集。
SELECT Sno FROM SC WHERE Cno='1' INTERSECT SELECT Sno FROM SC WHERE Cno='2';本例也可以表示为:
SELECT Sno FROM SC WHERE Cno='1' AND Sno IN (SELECT Sno FROM SC WHERE Cno='2'); (SELECT Sno FROM SC WHERE Cno='2');