Documentation Home

13.2.11 子查询

子查询是SELECT另一个语句中的一个语句。

支持 SQL 标准要求的所有子查询形式和操作,以及一些 MySQL 特定的功能。

下面是一个子查询的例子:

SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2);

在此示例中,SELECT * FROM t1 ...外部查询(或外部语句),并且(SELECT column1 FROM t2)子查询。我们说子查询嵌套在外层查询中,实际上可以将子查询嵌套在其他子查询中,嵌套到相当深的深度。子查询必须始终出现在括号内。

子查询的主要优点是:

  • 它们允许结构化的查询,以便可以隔离语句的每个部分。

  • 它们提供了执行操作的替代方法,否则这些操作将需要复杂的连接和联合。

  • 许多人发现子查询比复杂的连接或联合更具可读性。的确,正是子查询的创新让人们产生了将早期的 SQL 称为 结构化查询语言”的最初想法。

下面是一个示例语句,显示了 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、注释、函数等。 LIMITUNION

从 MySQL 8.0.19 开始,子查询中可以使用TABLE and语句。VALUES使用的子查询 VALUES通常是更详细的子查询版本,可以使用集合表示法或 withSELECTTABLE语法更紧凑地重写;假设该表 ts是使用语句创建的 CREATE TABLE ts VALUES ROW(2), ROW(4), ROW(6),此处显示的语句都是等效的:

SELECT * FROM tt
    WHERE b > ANY (VALUES ROW(2), ROW(4), ROW(6));

SELECT * FROM tt
    WHERE b > ANY (2, 4, 6);

SELECT * FROM tt
    WHERE b > ANY (SELECT * FROM ts);

SELECT * FROM tt
    WHERE b > ANY (TABLE ts);

子查询的示例TABLE显示在以下部分中。

子查询的外部语句可以是以下任何一项: SELECTINSERTUPDATEDELETESETDO

有关优化器如何处理子查询的信息,请参阅 第 8.2.2 节,“优化子查询、派生表、视图引用和公用表表达式”。有关子查询使用限制的讨论,包括某些形式的子查询语法的性能问题,请参阅 第 13.2.11.12 节,“子查询限制”