8.4 中文镜像

MySQL 8.4 参考手册 · 中文镜像

正文为中文,英文原文默认隐藏。点击任意中文段落即可展开 / 收起对应英文原文。

打开官方英文原文 ↗

译文由机器翻译生成,仅供理解参考;有疑问请以官方英文原文为准。

MySQL 8.4 参考手册 / 15 条 SQL 语句 / 15.2 数据操作语句 / 15.2.11 带括号的查询表达式
中文点击中文段落可显示 / 隐藏英文原文本页译文覆盖 100%

15.2.11 括号大小查询表达式 MySQL15.2.11 Parenthesized Query Expressions

parenthesized_query_expression:
    ( query_expression [order_by_clause] [limit_clause] )
      [order_by_clause]
      [limit_clause]
      [into_clause]

query_expression:
    query_block [set_op query_block [set_op query_block ...]]
      [order_by_clause]
      [limit_clause]
      [into_clause]

query_block:
    SELECT ... | TABLE | VALUES

order_by_clause:
    ORDER BY as for SELECT

limit_clause:
    LIMIT as for SELECT

into_clause:
    INTO as for SELECT

set_op:
    UNION | INTERSECT | EXCEPT

8.4 支持根据前述语法进行括号式查询表达式。在最简单的情况下,括号内的查询表达式包含一个 SELECT 或其他返回结果集的语句,且没有后续可选子句:MySQL 8.4 supports parenthesized query expressions according to the preceding syntax. At its simplest, a parenthesized query expression contains a single SELECT or other statement returning a result set and no following optional clauses:

(SELECT 1);
(SELECT * FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = 'mysql');

TABLE t;

VALUES ROW(2, 3, 4), ROW(1, -2, 3);

括号内的查询表达式也可以包含由一个或多个集合操作链接的查询,例如 UNION,并以任意或全部可选子句结尾:A parenthesized query expression can also contain queries linked by one or more set operations such as UNION, and end with any or all of the optional clauses:

mysql> (SELECT 1 AS result UNION SELECT 2);
+--------+
| result |
+--------+
|      1 |
|      2 |
+--------+
mysql> (SELECT 1 AS result UNION SELECT 2) LIMIT 1;
+--------+
| result |
+--------+
|      1 |
+--------+
mysql> (SELECT 1 AS result UNION SELECT 2) LIMIT 1 OFFSET 1;
+--------+
| result |
+--------+
|      2 |
+--------+
mysql> (SELECT 1 AS result UNION SELECT 2)
       ORDER BY result DESC LIMIT 1;
+--------+
| result |
+--------+
|      2 |
+--------+
mysql> (SELECT 1 AS result UNION SELECT 2)
       ORDER BY result DESC LIMIT 1 OFFSET 1;
+--------+
| result |
+--------+
|      1 |
+--------+
mysql> (SELECT 1 AS result UNION SELECT 3 UNION SELECT 2)
       ORDER BY result LIMIT 1 OFFSET 1 INTO @var;
mysql> SELECT @var;
+------+
| @var |
+------+
|    2 |
+------+

INTERSECT 在 UNION 和 EXCEPT,因此以下两个语句是等价的:INTERSECT acts before UNION and EXCEPT, so that the following two statements are equivalent:

SELECT a FROM t1 EXCEPT SELECT b FROM t2 INTERSECT SELECT c FROM t3;

SELECT a FROM t1 EXCEPT (SELECT b FROM t2 INTERSECT SELECT c FROM t3);

括号内的查询表达式也用作查询表达式,因此通常由查询块组成的查询表达式也可能包含括号内的查询表达式:Parenthesized query expressions are also used as query expressions, so a query expression, usually composed of query blocks, may also consist of parenthesized query expressions:

(TABLE t1 ORDER BY a) UNION (TABLE t2 ORDER BY b) ORDER BY z;

查询块可能带有后尾 ORDER BY 和 LIMIT 子句,这些子句在外集操作之前应用,ORDER BY,以及 LIMITQuery blocks may have trailing ORDER BY and LIMIT clauses, which are applied before the outer set operation, ORDER BY, and LIMIT.

你不能让查询块后尾带有 ORDER BY 或 LIMIT 而不用括号包裹,但括号可以以多种方式强制执行:You cannot have a query block with a trailing ORDER BY or LIMIT without wrapping it in parentheses but parentheses may be used for enforcement in various ways:

  • 强制每个查询块的 LIMIT:To enforce LIMIT on each query block:

    (SELECT 1 LIMIT 1) UNION (VALUES ROW(2) LIMIT 1);
    
    (VALUES ROW(1), ROW(2) LIMIT 2) EXCEPT (SELECT 2 LIMIT 1);
    
  • 强制两个查询块和整个查询表达式的 LIMIT:To enforce LIMIT on both query blocks and the entire query expression:

    (SELECT 1 LIMIT 1) UNION (SELECT 2 LIMIT 1) LIMIT 1;
    
  • 强制执行 LIMIT对整个查询表达式(无括号):To enforce LIMIT on the entire query expression (with no parentheses):

    VALUES ROW(1), ROW(2) INTERSECT VALUES ROW(2), ROW(1) LIMIT 1;
    
  • 混合强制:LIMIT,在第一个查询块和整个查询表达Hybrid enforcement: LIMIT on the first query block and on the entire query expression:

    (SELECT 1 LIMIT 1) UNION SELECT 2 LIMIT 1;
    

本节描述的语法受某些限制:The syntax described in this section is subject to certain restrictions:

  • 如果查询表达式后尾INTO 子句,则不允许使用查询表达式的尾随 INTO 子句。A trailing INTO clause for a query expression is not permitted if there is another INTO clause inside parentheses.

  • 括号内的查询表达式内的ORDER BY或LIMIT,且同时应用于外部查询,均按照 SQL 标准处理。An ORDER BY or LIMIT within a parenthesized query expression which is also applied in the outer query is handled in accordance with the SQL standard.

    允许嵌套括号大小的查询表达式。支持的最大嵌套层级为 63 级;这是在解析器完成任何简化或合并之后。Nested parenthesized query expressions are permitted. The maximum level of nesting supported is 63; this is after any simplifications or merges have been performed by the parser.

    此处展示了此类语句的一个示例:An example of such a statement is shown here:

    mysql> (SELECT 'a' UNION SELECT 'b' LIMIT 2) LIMIT 3;
    +---+
    | a |
    +---+
    | a |
    | b |
    +---+
    2 rows in set (0.00 sec)
    

    你应注意,在折叠括号表达式体时,MySQL 遵循 SQL 标准语义,因此更高的外部限制不能覆盖内层的下限。例如,(SELECT ... LIMIT 5) LIMIT 10最多返回五行。You should be aware that, when collapsing parenthesized expression bodies, MySQL follows SQL standard semantics, so that a higher outer limit cannot override an inner lower one. For example, (SELECT ... LIMIT 5) LIMIT 10 can return no more than five rows.