子查询是SELECT
另一个语句中的一个语句。
支持 SQL 标准要求的所有子查询形式和操作,以及一些 MySQL 特定的功能。
下面是一个子查询的例子:
SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2);
在此示例中,SELECT * FROM t1 ...
是
外部查询(或外部语句),并且(SELECT column1 FROM
t2)
是子查询。我们说子查询嵌套在外层查询中,实际上可以将子查询嵌套在其他子查询中,嵌套到相当深的深度。子查询必须始终出现在括号内。
子查询的主要优点是:
下面是一个示例语句,显示了 SQL 标准指定并在 MySQL 中支持的子查询语法的要点:
DELETE FROM t1
WHERE s11 > ANY
(SELECT COUNT(*) /* no hint */ FROM t2
WHERE NOT EXISTS
(SELECT * FROM t3
WHERE ROW(5*t2.s1,77)=
(SELECT 50,11*s1 FROM t4 UNION SELECT 50,77 FROM
(SELECT * FROM t5) AS t5)));
子查询可以返回标量(单个值)、单行、单列或表(一列或多列的一行或多行)。这些称为标量、列、行和表子查询。返回特定类型结果的子查询通常只能在特定上下文中使用,如以下部分所述。
对可以使用子查询的语句类型几乎没有限制。子查询可以包含许多普通查询可以包含的关键字或子句
SELECT
:
、、、、、连接DISTINCT
、索引提示、GROUP BY
构造
ORDER BY
、注释、函数等。
LIMIT
UNION
子查询的外部语句可以是以下任何一项:
SELECT
、
INSERT
、
UPDATE
、
DELETE
、
SET
或
DO
。
在 MySQL 中,您不能修改表并从子查询中的同一个表中进行选择。这适用于
DELETE
,
INSERT
,
REPLACE
,
UPDATE
, and (因为子查询可以在SET
子句中使用)
等语句LOAD DATA
。
有关优化器如何处理子查询的信息,请参阅 第 8.2.2 节,“优化子查询、派生表和视图引用”。有关子查询使用限制的讨论,包括某些形式的子查询语法的性能问题,请参阅 第 13.2.10.12 节,“子查询限制”。