• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 位置: MySQL 8 中文手册 -> SQL 语句

    子查询

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

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

    这是一个子查询的示例:

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

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

    子查询的主要优点是:

    • 它们允许结构化的查询,以便可以隔离语句的每个部分。
    • 它们提供了执行操作的替代方法,否则这些操作将需要复杂的联接和联合。
    • 许多人发现子查询比复杂的联接或联合更具可读性。确实,正是子查询的创新使人们有了将早期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结构,注释,函数等等。

    从MySQL 8.0.19开始,TABLEVALUES语句可以在子查询中使用。使用子查询VALUES通常是子查询的详细版本,可以使用设置符号或with SELECTTABLE语法更紧凑地重写子查询。假设该表ts是使用statement创建的CREATE TABLE ts(SELECT * FROM(VALUES ROW(2), ROW(4), ROW(6))AS ts),则此处显示的语句都是等效的:

    SELECT * FROM tt 
        WHERE b > ANY (SELECT * FROM (VALUES ROW(2), ROW(4), ROW(6)) AS ts);
    
    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后续部分中显示了子查询的示例。

    子查询的外部语句可以是任何一个:SELECTINSERTUPDATEDELETESET,或DO

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