### 13.2.11 子查询

[13.2.11.1 作为标量操作数的子查询](scalar-subqueries.html)
[13.2.11.2 使用子查询进行比较](comparisons-using-subqueries.html)
[13.2.11.3 带有 ANY、IN 或 SOME 的子查询](any-in-some-subqueries.html)
[13.2.11.4 ALL 子查询](all-subqueries.html)
[13.2.11.5 行子查询](row-subqueries.html)
[13.2.11.6 具有 EXISTS 或 NOT EXISTS 的子查询](exists-and-not-exists-subqueries.html)
[13.2.11.7 相关子查询](correlated-subqueries.html)
[13.2.11.8 派生表](derived-tables.html)
[13.2.11.9 横向派生表](lateral-derived-tables.html)
[13.2.11.10 子查询错误](subquery-errors.html)
[13.2.11.11 优化子查询](optimizing-subqueries.html)
[13.2.11.12 对子查询的限制](subquery-restrictions.html)

[](<>)[](<>)[](<>)[](<>)

子查询是[`选择`](select.html)另一个语句中的语句。

支持 SQL 标准所需的所有子查询表单和操作，以及一些特定于 MySQL 的功能。

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

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

在这个例子中，`选择 * 从 t1 ...`是个*外部查询*（要么*外部陈述*）， 和`（从 t2 中选择第 1 列）`是个*子查询*.我们说子查询是*嵌套的*在外部查询中，实际上可以将子查询嵌套在其他子查询中，达到相当的深度。子查询必须始终出现在括号内。

子查询的主要优点是：

-   它们允许查询*结构化的*这样就可以隔离语句的每个部分。

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

-   许多人发现子查询比复杂的连接或联合更具可读性。确实，正是子查询的创新让人们产生了将早期的 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.html)可以包含：`清楚的`,`通过...分组`,`订购方式`,`限制`，连接，索引提示，[`联盟`](union.html)构造、注释、函数等。

从 MySQL 8.0.19 开始，[`桌子`](table.html)和[`价值观`](values.html)语句可用于子查询。子查询使用[`价值观`](values.html)通常是更详细的子查询版本，可以使用集合表示法更紧凑地重写，或者[`选择`](select.html)要么[`桌子`](table.html)句法;假设该表`ts`使用语句创建[`创建表 ts 值 ROW(2)、ROW(4)、ROW(6)`](create-table-select.html)，这里显示的语句都是等价的：

```
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.html)子查询显示在下面的部分中。

子查询的外部语句可以是以下任何一种：[`选择`](select.html),[`插入`](insert.html),[`更新`](update.html),[`删除`](delete.html),[`放`](set-variable.html)， 要么[`做`](do.html).

有关优化器如何处理子查询的信息，请参阅[第 8.2.2 节，“优化子查询、派生表、视图引用和公用表表达式”](subquery-optimization.html).有关子查询使用限制的讨论，包括某些形式的子查询语法的性能问题，请参阅[第 13.2.11.12 节，“对子查询的限制”](subquery-restrictions.html).
