日期:2014-05-16  浏览次数:20466 次

实验七 嵌套查询(V2.0)

实验七  嵌套查询

[实验目标]

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的游标指向的(首次为第一行)元组