Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


15.2.15 子查询

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

所有子查询形式和操作都支持,包括MySQL特有的几个功能。

以下是一个子查询的示例:

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

在这个示例中,SELECT * FROM t1 ...外部查询(或外部语句),而(SELECT column1 FROM t2)子查询。我们说子查询是嵌套在外部查询中,并且实际上可以在其他子查询中嵌套,以很深的层次。子查询总是必须出现在括号中。

子查询的主要优点是:

  • 它们允许查询以结构化的方式进行,以便将每个语句的部分隔开。

  • 它们提供了替代复杂连接和并集的方法来执行操作。

  • 许多人认为子查询比复杂的连接或并集更易读。实际上,子查询的创新是早期SQL的创新,使人们开始称呼早期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节,“子查询限制”