数据库系统原理:不相关子查询

yumo6663个月前 (04-05)技术文章18

数据查询是数据库的核心操作。SQL语言允许多层嵌套查询,也叫子查询。它使用户可以用多个简单的查询构成复杂的查询,从而增强SQL的查询能力。

嵌套查询有两种形式,相关子查询和不相关子查询。

学习SQL的不相关子查询。

一、子查询分类

把一个SELECT-FROM-WHERE语句称为一个查询块,将一个查询块嵌套在另一个查询块的WHERE子句的条件中的查询称为嵌套查询(子查询) 。

从上图可以看出,图中的查询要查找的是“选了c2这门课的学生的姓名”。

SQL的结构化就体现在嵌套上。

子查询的嵌套可以用多个简单的查询构成复杂的查询,从而增强SQL的查询和表达能力,并且提高程序的可读性。

子查询可分成不相关子查询和相关子查询两类。

子查询的查询条件不依赖于父查询,这类子查询称为不相关子查询(也叫一般子查询),不相关子查询一般使用谓词in。

如果子查询的查询条件依赖于外层父查询的某个属性值,称这类查询为相关子查询。相关子查询一般使用谓词exists。

上图的示例表示“选了c2这门课的学生的学号”作为子查询的结果、然后去用学号获得学生的姓名。

二、不相关子查询

不相关子查询的执行过程:

执行顺序由里往外,先执行内层的子查询,将子查询的结果作为外层父查询的条件。根据子查询的结果再执行父查询。

例1: 查询有一门课程成绩等于95分的学号和姓名。

(1)采用多表等值连接实现

Select S.sno,sname

From S, SC

Where S.sno=SC.snoand grade=95

该查询需要S表、SC表两张表,多表连接有一个等值条件即“S表的学号等于SC表的学号”,另外一个选择条件是“成绩是95” ,输出的列的学号和姓名。

(2)采用不相关子查询实现

Select sno,sname

From s

Where sno in(Select sno

From SC

Where grade = 95

子查询实现:首先在SC表中查找“成绩是95分”的学生的学号,再用这些学号到S表中去获得这些学生的姓名。这样的形式就是不相关子查询、用谓词in来实现的。

不相关子查询有以下的特点:

①能独立运行,子查询条件不依赖父查询;

②只能运行一次;(执行一次,获得结果,就完成任务了。)

③先执行子查询。(先执行内部的子查询,后执行外部的查询。)

例2:查询选修了课程名为DB"的学号和姓名。

(1)用多表连接查询来实现

Select S.sno,sname

From S, SC, C

Where S.sno=SC.sno and C.cno=SC.cno and cname= 'DB';

由于课程名在表C中、姓名在表S中选课信息在表SC中,所以该多表连接查询涉及的表有三个,即表S、表SC、表C。有三个表的时候的多表连接需要有两个连接条件,即“S表的学号等于SC表的学号”、“C表的课程号等于SC表的课程号”,一个选择条件是“课程名为DB”,输出的列有两列、学号和姓名。

(2)用不相关子查询实现

Select sno,sname

From s

Where sno in

Select sno

From Sg

Where cno in

Select cno

From C

Where cname= 'DB’));

使用不相关子查询实现,是分了三步:

首先在C表中找出课程名为‘DB’的课程号;

然后,用DB的课程号在SC表中找出选修了该课程的学生的学号;

③最后在S表中取出学号和姓名。

首先执行的是最内侧的子查询,然后是中间的查询,最后是最外侧的查询。

通过不相关子查询,可以看到结构化的特征,程序的可读性也得到提高。

三、总结

在SQL语言中,允许使用多层嵌套查询构成复杂的查询,从而增强SQL的查询能力。以层层嵌套的方式来构造程序正是SQL中“结构化”的含义所在。

不相关子查询是较简单的一类子查询,使用谓词“in”来实现

相关文章

一文搞懂数据库索引原理

前言写数据库,我第一时间就想到了MySQL、Oracle、索引、存储过程、查询优化等等。不知道大家是不是跟我想得一样,我最想写的是索引,为啥呢?以下这个面试场景,不知道大家熟悉不熟悉:面试官:数据库有...

浅析InnoDB引擎的索引和索引原理

什么是InnoDB的索引InnoDB的索引就是一颗B+树。页是InnoDB引擎在内存和磁盘之间交换数据的基本单位,页的大小一般是16KB,页的大小可以在启动MySQL服务的时候通过更改innodb_p...

关系型数据库原理-1 ---关系代数笛卡尔积

1、关系数据库的基本概念(1)属性和域 在现实世界中,要描述一个事物常常取若干特征来表示,这些特征成为属性。例如,用学号、姓名、性别、年龄和籍贯等属性来描述学生。每个属性取值范围对应一个值的集合,成为...