子查询
功能描述
子查询,也为嵌套查询,允许出现在任何可以为表达式的地方。子查询可以是一个完整独立的查询语句,可包含选择列表的简单SELECT
查询语句、包含一个甚至多个表或视图名称的FROM
子句、可选的WHERE
子句、可选的GROUP BY
子句、可选的HAVING
子句;子查询中亦可以嵌套子查询。
子查询可在查询选择列表中,如果子查询位于查询选择列表中且作为独立字段则只允许返回单行数据否则数据库抛出错误,若子查询位于WHERE条件后则需配合比较谓词和其他谓词进行使用。
注意:
子查询有以下限制:
- WHERE条件中若需要子查询返回多行则需要使用
EXISTS
、IN
、ANY
、ALL
等关键字修饰。- 比较谓词、
BETWEEN
、LIKE
等关键字引入的子查询必须返回单行且单个字段。- 如果多个子查询中的列与需要查询的列具有相同的名称,则必须对表的列的任何引用加上表名或别名。
示例
字段上的子查询
如果返回字段是子查询,则要求返回数据为单行数据。
sql
SQL> CREATE TABLE sub_sel(id INT,name VARCHAR(30));
SQL> INSERT INTO sub_sel VALUES(1,'one')(2,'two');
SQL> CREATE TABLE sub_sel1(id INT,col1 VARCHAR(30));
SQL> INSERT INTO sub_sel1 VALUES(1,'abc')(66,'bcd');
SQL> SELECT id,name,(SELECT col1 FROM sub_sel1 WHERE id=66) FROM sub_sel;
ID | NAME | EXPR1 |
------------------------------------------------------------------------------
1 | one| bcd|
2 | two| bcd|
WHERE子句上使用比较谓词的子查询
果使用比较谓词,则子查询要求返回数据为单行数据。
sql
SQL> SELECT * FROM sub_sel WHERE id >= (SELECT id FROM sub_sel1 WHERE col1='abc');
ID | NAME |
------------------------------------------------------------------------------
1 | one|
2 | two|
WHERE子句使用IN的子查询
使用IN子查询,则无需限制数据返回行数。
sql
SQL> SELECT * FROM sub_sel WHERE id IN (SELECT id FROM sub_sel1);
ID | NAME |
------------------------------------------------------------------------------
1 | one|
使用ALL的子查询
ALL可引入比较运算符,=ALL则需指定条件等于子查询返回的所有数据,若存在一个不满足则无数据返回;若使用ANY则表示要使某一行满足查询中指定的条件,子查询的列中的值必须至少等于子查询返回的值列表中的一个值。
sql
SQL> SELECT * FROM sub_sel WHERE id = ALL(SELECT id FROM sub_sel1);
ID | NAME |
使用EXISTS的子查询
EXISTS无需指定条件,EXISTS后的子查询在无数据情况下返回false,存在数据情况下返回true,仅用作数据存在判断。
sql
SQL> SELECT * FROM sub_sel WHERE EXISTS(SELECT id FROM sub_sel1);
ID | NAME |
------------------------------------------------------------------------------
1 | one|
2 | two|