1 . 非相关子查询
非相关子查询,也称嵌套子查询,可以多层嵌套。这种子查询的执行不依赖于外查询。执行过程是,先执行子查询,子查询的结果并不显示出来,而是作为外查询的条件值,然后执行外查询。
非相关子查询的特点:子查询只执行一次,其查询结果不依赖于外查询。而外查询的查询条件依赖于子查询的结果,因此,也可以说外查询的查询结果依赖于子查询的结果。
非相关子查询的结果可以是一行或多行。返回一行的非相关子查询通常用在比较运算符之后;返回多行的非相关子查询通常用在比较运算符与ANY、ALL组成的运算符IN、NOT IN之后。
返回一行的非相关子查询
查询与BugsBug在同一个系学习的学生学号、姓名
返回多行的非相关子查询
如果子查询返回多个值,即一个集合,则外查询条件中不能直接用比较运算符中的任意一个,因为某一行的一个列值不能与一个集合比较。必须在比较运算符之后加ANY或ALL关键字。
使用格式为:
〈列名〉〈比较符〉 [ANY|ALL] 〈子查询 结果〉
ANY的含义为:将一个列值与子查询返回的一组值中的每一个比较。若在某次比较中结果为TRUE,则ANY测试返回TRUE,若每一次比较的结果均为FALSE,则ANY测试返回FALSE。
ALL的含义为:将一个列值与子查询返回的一组值中的每一个比较。若每一次比较中结果均为TRUE,则ALL测试返回TRUE,只要有一次比较的结果为FALSE,则ALL测试返回FALSE。
查询其他系中比Software Designing系所有学生年龄都小的学生基本情况
SELECT * FROM Students
WHERE Sdept<>'Computer' AND Sage <ALL (SELECT Sage FROM Students
WHERE Sdept='Computer')
查询其他系中比Software Designing系某一学生年龄小的学生的基本情况
查询成绩大于80分的学生的学号、姓名。
SELECT Sno, Sname FROM Students
WHERE Sno=ANY ( SELECT Sno
FROM Enrollment WHERE Grade >80 )
查询选修了课程名为English的课程并且成绩大于80 分的学生学号、姓名。
SELECT Sno, Sname FROM Students
WHERE Sno IN
(SELECT Sno FROM Enrollment
WHERE Grade > 80 AND Cno in (SELECT Cno
FROM Courses
WHERE Cname= 'English') )
相关子查询
相关子查询,即子查询的执行依赖于外查询。相关子查询执行过程是先外查询,后内查询,然后又外查询,再内查询,如此反复,直到外查询处理完毕。
使用EXSISTS 或NOT EXSISTS关键字来表达相关子查询。
格式为:EXISTS <子查询>
EXISTS表示存在量词,用来测试子查询是否有结果,如果子查询的结果集中非空(至少有一行),则EXISTS条件为TRUE,否则为FALSE。
由于EXISTS的子查询只测试子查询的结果集是否为空,因此,在子查询中指定列名是没有意义的。所以在有EXISTS的子查询中,其列名序列通常都用“*”表示。
查询选修了C2课程的学生的学号和姓名
查询没有选修C2课程的学生的学号、姓名。
SELECT Sno, Sname FROM Students WHERE NOT EXISTS (SELECT * FROM Enrollment WHERE Sno =Students.Sno AND Cno ='C2')
SELECT 查询—组合查询
在标准SQL中,集合运算的关键字分别为UNION(并)、INTERSECT(交)、MINUS(差)。
因为一个查询的结果是一个表,可以看作是行的集合,因此,可以利用SQL的集合运算关键字,将两个或两个以上查询结果进行集合运算,这种查询通常称为组合查询(也称为集合查询)。
1.将两个查询结果进行并运算
并运算用UNION 运算符。它将两个查询结果合并,并消去重复行而产生最终的一个结果表。
查询选修了C1课程或选修了C2课程的学生学号。
注意:
① 两个查询结果表必须是兼容的。即列的数目相同且对应列的数据类型相同。
② 在两个查询结果合并时,将删除重复行。若UNION后加ALL,则结果集中包含重复行。
2.将两个查询结果进行交运算
交运算符是INTERSECT。它将同时属于两个查询结果表的行,作为整个查询的最终结果表。
查询选修了C1课程并且也选修了C2课程的学生学号。
3.将两个查询结果进行差运算
差运算符是MINUS。它将属于第一个查询结果表而不属于第二个查询结果表的行组成最终的结果表。
查询选修了C1课程但没有选修了C2课程的学生学号。