1
数据库技术及应用
1.8.3.2 5.3.2 子查询
5.3.2 子查询

子查询和连接查询一样,提供了使用单个查询访问多个表中的数据的方法。子查询是指将一个查询块嵌套在另一个查询块的WHERE子句或HAVING子句的条件中的查询。在子查询中可以使用IN关键字、EXISTS关键字和比较运算符来连接表。

1.带有IN谓词的子查询

带有IN谓词的子查询是指父查询和子查询之间用IN进行连接,来判断某个属性列值是否在子查询的结果中。

由于在子查询中,子查询的结果往往是一个集合,所以谓词IN是子查询中最经常使用的谓词。

【例5-29】在Course_info表中查询选修了课程名为“时间管理”学生的学号和姓名。

(1)启动MicrosofT-SQL Server Management Studio,单击工具栏上的按钮,建立一个新的查询。

(2)在查询编辑窗口中输入如下T-SQL代码:

(3)单击工具栏上的按钮,执行以上T-SQL代码命令,查看结果,如图531所示。

图5-31 使用带有犐犖谓词的子查询

2.嵌套子查询

在SQL Server2008中,子查询是可以嵌套使用的,并且可以在一个查询中嵌套任意多个子查询,即一个子查询中还可以包含另一个子查询,这种查询方式称为嵌套子查询。在实际应用中,嵌套子查询能够帮助用户从多个表中完成查询任务。

【例5-30】查询与“王强”在同一个系学习的学生的学号、姓名和系编号。

(1)启动MicrosofT-SQL Server Management Studio,单击工具栏上的按钮,建立一个新的查询。

(2)在查询编辑窗口中输入如下T-SQL代码:

(3)单击工具栏上的按钮,执行以上T-SQL代码命令,查看结果,如图532所示。

图5-32 使用嵌套子查询

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

子查询返回单值时可以使用比较运算符,而使用ANY或ALL谓词时则必须同时使用比较运算符。带有ANY或ALL谓词的表达式及语义如表5-1所示。

表5-1 带有ANY和ALL谓词的相关连词

【例5-31】在Student_info中,查询其他系里比系编号为G02003中最小年龄学生(出生日期最大)还要小的学生名单,并按出生日期进行降序排列。

(1)启动MicrosofT-SQL Server Management Studio,执行“文件”→“新建”→“使用当前连接查询”命令,建立一个新的查询。

(2)在查询编辑窗口中输入如下T-SQL代码:

(3)单击工具栏上的按钮,执行以上T-SQL代码命令,查看结果,如图533所示。

图5-33 使用带有ANY谓词的子查询

4.带有EXISTS谓词的子查询

带有EXISTS谓词的子查询不返回任何实际数据,只产生逻辑真值true或逻辑假值false。也就是说,它的作用是在WHERE子句中测试子查询返回的行是否存在。如果存在,则返回真值;如果不存在,则返回假值。

【例5-32】查询所有选修了01006号课程的学生信息。

(1)启动MicrosofT-SQL Server Management Studio,执行“文件”→“新建”→“使用当前连接查询”命令,建立一个新的查询。

(2)在查询编辑窗口中输入如下T-SQL代码:

(3)单击工具栏上的按钮,执行以上T-SQL代码命令,查看结果,如图534所示。

使用存在量词EXISTS后,若内层查询结果为非空,则外层的WHERE子句返回真值,否则返回假值。

图5-34 使用带有犈犡犐犛犜犛谓词的子查询

由EXISTS引出的子查询,其目标列表达式通常都用,因为带有EXISTS的子查询只返回真值或假值,给出列名也无实际意义。

注意:

(1)与EXISTS相对应的是NOTEXISTS谓词,使用NOTEXISTS谓词后,若内层查询结果为空,则外层的WHERE子句返回真值,否则返回假值;

(2)一些带EXISTS或NOTEXISTS谓词的子查询不能被其他形式的子查询等价替换,但带有谓词IN、比较运算符、ANY和ALL谓词的子查询可以用带有EXISTS谓词的子查询等价替换。