日期:2014-05-16 浏览次数:20466 次
实验七 嵌套查询
[实验目标]
1. 掌握不相关子查询
2. 掌握相关子查询
[实验内容]
1. 基础知识
一个SELECT-FROM-WHERE语句称为一个查询块。
将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询称为嵌套查询。
可以参看例1。
>> 根据求解过程分子查询主要有
(1)不相关子查询
子查询的查询条件不依赖于父查询;
由里向外,逐层处理。即每个子查询在上一级查询处理之前求解,子查询的结果用于建立其父查询的查找条件。
(2)相关子查询
子查询的查询条件依赖于父查询。
首先取外层查询中表的第一个元组,根据它与内层查询相关的属性值处理内层查询,若WHERE子句返回值为真,则取此元组放入结果表;
然后再取外层表的下一个元组;
重复这一过程,直至外层表全部检查完为止。
>>根据嵌套的子句类型分嵌套查询主要类型
1)带有IN谓词的子查询
2)带有比较运算符的子查询
3)带有ANY(SOME)或ALL谓词的子查询
4)带有EXISTS谓词的子查询
2. 实验案例
1)带有IN谓词的子查询。
例1.查询选修了2号课程的学生姓名。
--外查询:查询学号在子查询结果内的学生姓名。 select sname from student where sno in ( --子查询:查询选修了2号课程的学生学号。 select sno from sc where cno = '2' )
>>说明:
(1)以上查询中子查询跟外查询没关系,所以可以先做子查询,把结果作为外查询的where子句的一部分,再进行外查询的筛选条件得到结果,这种与外查询没关系的子查询称为为“不相关子查询”。
(2)子查询的限制“不能使用ORDER BY子句”。为什么?子查询是个中间结果,而排序只能对查询结果进行。
(3)层层嵌套方式反映了 SQL语言的结构化。
(4)有些嵌套查询可以用连接运算替代。把例1改成连接运算?
select sname
from student,sc
where student.sno = sc.sno and sc.cno = '2'
2)带有比较运算符的子查询
例2.查询每个学生学号和超过他选修课程平均成绩的课程号。
SELECT Sno,Cno
FROM SC x
WHERE Grade >=
(SELECT AVG(Grade)
FROM SC y
WHEREy.Sno=x.Sno);
>>执行过程
<1> 从外层查询中取出SC的游标指向的(首次为第一行)元组