数据库系统原理:不相关子查询
数据查询是数据库的核心操作。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”来实现