您的当前位置:首页正文

嵌套查询

2021-01-31 来源:福吉宠物网
《数据库原理及应用》电子实验报告 题 目:SQL语言(4)数据查询—嵌套查询 日期 2013.10.21 姓 名 实验环境: Windows XP,Sql Server2005 实验目的: 徐雯 学号 20112111136 1.理解嵌套查询的意义,明确嵌套查询的分类 2.理解嵌套查询求解方法 3.掌握带有IN谓词、比较运算符、ANY或ALL谓词、EXISTS谓词的子查询 实验内容: 1. 嵌套查询 1) 嵌套查询的定义 将一个查询块嵌套在另一个查询块的where子句或having 短语的条件中的查询称为嵌套查询。 其中一个select-from-where语句称为一个查询块。 2) 嵌套查询的分类 不相关子查询:子查询的查询条件不依赖于父查询 相关子查询:子查询的查询条件不依赖于父查询 2. 嵌套查询求解方法 1) 不相关子查询 由里向外处理,即先执行子查询,子查询的结果用于建立其父查询的查找条件。 2) 相关子查询 ◆首先取外层查询中表的第一个元组,根据它与内层查询相关的属性值处理内层查询,若where子句返回值为真,则取此元组放入结果表; ◆ 然后再取外层表的下一个元组; ◆重复这一过程,直至外层表全部查完为止。 3. 采用的数据库表 1) 库表结构定义 Student表:

Create table student

(sno char(9) primary key, sname char(20) unique, ssex char(2), sage smallint, sdept char(20) );

Course表;

Create table course

(cno char(4) primary key,

Cname char(40),

Cpno char(4), Ccredit smallint );

Sc表:

Create table sc

(sno char(9),

Cno char(4), Grade smallint

);

2) 库表记录

Student表插入数据:

insert into student values('200215121','李勇','男',20,'CS');

insert into student values('200215122','刘晨','女',19,'CS'); insert into student values('200215123','王敏','女',18,'MA'); insert into student values('200215125','张立','男',19,'IS');

如图:

Course表:

insert into course values('1','数据库','5','4');

insert into course values('2','数学',' ','2'); insert into course values('3','信息系统','1','4'); insert into course values('4','操作系统','6','3'); insert into course values('5','数据结构','7','4'); insert into course values('6','数据处理',' ','2'); insert into course values('7','PASCAL语言','6','4');

如图:

Sc表:

insert into sc values('200215121','1',92);

insert into sc values('200215121','2',85); insert into sc values('200215121','3',88); insert into sc values('200215122','2',90); insert into sc values('200215122','3',80);

如图:

4. 带有IN谓词的子查询

1) IN谓词表达的意义

在嵌套查询中,子查询的结果往往是一个集合,所以用谓词IN加上子查询结果作为父查询的条件。

2) 构造嵌套查询的方法

将第一步查询嵌入到第二步查询的条件中,以此来构造嵌套查询。 3) 实例操作

【实例1】查询与“刘晨”在同一个系学习的学生。

先分步来完成查询,再构造嵌套查询,最后用自身连接来完成查询。 ① 确定“刘晨”所在系名。

Select sdept From student

Where sname=‘刘晨’;

执行结果如下:

② 查找所有在CS系学习的学生。

Select sno,sname,sdept From student Where sdept=‘CS’;

执行结果如下:

将第一步查询嵌入到第二步查询的条件中: 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,sname From student Where sno in ( select sno From sc Where cno in

( select cno From course

Where cname=‘信息系统’)); 执行结果如下图:

用连接查询完成查询: Select student.sno,sname From student,sc,course Where student.sno=sc.sno And course.cno=sc.cno

And course.cname=‘信息系统’; 执行结果如下图:

5. 带有比较运算符的子查询

1) 比较运算符的子查询的含义

父查询与子查询之间用比较运算符进行连接。

当用户能确切知道内层查询返回的是单值时,可用>,<,=,>=,<=,!=或<>等比较运算符。 2) 实例操作

【实例1】找出每个学生超过他选修课程平均成绩的课程号。 Select cno From sc x Where grade>= ( select avg(grade) From sc y

Where y.sno=x.sno); 执行结果如下图:

6. 带有ANY或ALL谓词的子查询

1) ANY或ALL谓词的含义

ANY:任意一个值 ALL:所有值

2) ANY或ALL谓词需要配合使用比较运算符

> ANY 大于子查询结果中的某个值 > ALL 大于子查询结果中的所有值

< ANY 小于子查询结果中的某个值 < ALL 小于子查询结果中的所有值 >= ANY 大于等于子查询结果中的某个值 >= ALL 大于等于子查询结果中的所有值 <= ANY 小于等于子查询结果中的某个值 <= ALL 小于等于子查询结果中的所有值 = ANY 等于子查询结果中的某个值 =ALL 等于子查询结果中的所有值(通常没有实际意义) !=(或<>)ANY 不等于子查询结果中的某个值 !=(或<>)ALL 不等于子查询结果中的任何一个值 3) ANY与ALL与集函数的对应关系 ANY ALL 4) 实例操作 【实例1】查询其他系中比计算机科学系任意一个(其中某一个)学生年龄小的学生姓名和年龄。 Select sname,sage From student Where sage‘CS’; 执行结果如下图: = IN -- <>或!= -- NOTIN < >MIN >MAX >= >=MIN >=MAX

【实例2】查询其他系中比计算机科学系所有学生年龄都小的学生姓名和年龄。 Select sname,sage From student Where sage( select sage From student Where sdept=‘CS’) And sdept <>‘CS’;

执行结果如下图:

7. 带有EXISTS谓词的子查询

1) EXISTS谓词

--存在量词

--带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真值“true”或“false”。 ●若内层查询结果非空,则返回真值 ●若内层查询结果为空,则返回假值

--由EXISTS引出的子查询,其目标表达式通常都用*,因为带EXISTS的子查询只返回真值或假值,给出列名无实际意义。 2) NOT EXISTS 谓词

与EXISTS谓词相对应,使用存在量词NOT EXISTS后,若内层查询结果为空,则外层的where子句返回真值,否则返回假值。 3) 实例操作

【实例1】查询所有选修了1号课程的学生姓名。 Select sname From student Where exists

( select * From sc

Where sno=student.sno And cno=‘1’ );

执行结果如下图:

【实例2】查询没有选修1号课程的学生姓名。 Select sname From student Where not exists

( select * From sc

Where sc.sno=student.sno And cno=‘1’ );

执行结果如下图:

【实例3】查询选修了全部课程的学生姓名。 Select sname From student Where not exists ( select * From course Where not exists ( select * From sc

Where sno=student.sno And cno=course.cno) );

执行结果如下图:

【实例4】查询至少选修了学生200215122选修的课程的全部课程的学生学号。 Select distinct sno From sc scx Where not exists

( select * From sc scy

Where scy.sno=‘200215122’ And not exists

( select * From sc scz

Where scz.sno=scx.sno And scz.sno=scy.sno) );

执行结果如下图:

完成情况: 1 理解了嵌套查询的意义和分类。 2 完成了各种不同类型的嵌套查询,全称量词和存在量词的转换。 出现的问题: 在使用exists和not exists量词做查询时,之间转换出错 ,后通过看课本例题的思路讲解理解了之间的转换,查询成功。

因篇幅问题不能全部显示,请点此查看更多更全内容

Top