子查询(Sub Query)是嵌套在主查询中的SELECT查询语句,即当一个查询是另一个查询的条件时,称之为子查询。子查询嵌套在一个 SELECT、SELECT...INTO 语句、INSERT...INTO 语句、DELETE 语句、或 UPDATE 语句或嵌套在另一子查询中。
在SQL语言中,一个SELECT-FROM-WHERE语句称为一个查询块。当获得一个查询的答案需要多个步骤的操作,首先必须创建一个查询来确定用户不知道但包含在数据库中的值,将一个查询块嵌套在另一个查询块的WHERE字句或HAVING短语的条件中查询块称为子查询或内层查询。上层的查询块曾为父查询或外层查询。子查询的结果作为输入传递回“父查询”或“外部查询”。父查询将这个值结合到计算中,以便确定最后的输出。
SQL语言允许多层嵌套查询,即一个子查询中还可以嵌套其他子查询。以层层嵌套的方式来构造程序正是SQL中"结构化"的含义所在。
子查询是本质上就是一个完整 的SELECT 语句,它可以使一个 SELECT、SELECT...INTO 语句、INSERT...INTO 语句、DELETE 语句、或 UPDATE 语句或嵌套在另一子查询中。子查询的输出可以包括一个单独的值(单行子查询)、几行值(多行子查询)、或者多列数据(多列子查询)。
可用三种语法来创建子查询:
- comparison ANY | ALL | SOME
- expression [NOT] IN (sqlstatement)
- [NOT] EXISTS (sqlstatement)
其中,comparison是一个表达式及一个比较运算符,将表达式与子查询的结果作比较。expression用以搜寻子查询结果集的表达式。sqlstatement是SELECT 语句,遵从与其他 SELECT 语句相同的格式及规则。它必须括在括号之中。
子查询的使用规则如下:
- 子查询必须自身是一个完整的查询。即它必须至少包括一个SELECT子句和FROM子句。
- 子查询SELECT语句不能包括在ORDER BY子句中。因为ORDER BY字句只能对最终查询结果排序,如果显示的输出需要按照特定顺序显示,那么ORDER BY子句应该作为外部查询的最后一个子句列出。
- 子查询“必须包括在一组括号中”,以便将它与外部查询分开。
- 如果将子查询放在外部查询的WHERE或HAVING子句中,那么该子查询只能位于比较运算符的“右边”。
资料来源:
王珊 萨师煊.数据库系统概率(第5版):高等教育出版社,2014
SQL 子查询 http://www.veryhuo.com/a/manual/sql/dasqlsubqueries.htm