文档主页
MySQL 8.4 参考手册
相关文档 下载本手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
手册页 (TGZ) - 258.5Kb
手册页 (Zip) - 365.5Kb
信息 (Gzip) - 4.0Mb
信息 (Zip) - 4.0Mb


MySQL 8.4 参考手册  /  ...  /  子查询

15.2.15 子查询

子查询是另一个语句中的 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 可以包含的许多关键字或子句:DISTINCTGROUP BYORDER BYLIMIT、连接、索引提示、UNION 结构、注释、函数等等。

TABLEVALUES 语句可以在子查询中使用。使用 VALUES 的子查询通常是更冗长的子查询版本,可以使用集合符号、或使用 SELECTTABLE 语法更简洁地重写;假设表 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 (SELECT * FROM ts);

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

TABLE 子查询的示例将在后面的章节中展示。

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

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