parenthesized_query_expression: (query_expression[order_by_clause] [limit_clause] ) [order_by_clause] [limit_clause] [into_clause]query_expression:query_block[set_opquery_block[set_opquery_block...]] [order_by_clause] [limit_clause] [into_clause]query_block:SELECT... |TABLE|VALUESorder_by_clause: ORDER BY as forSELECTlimit_clause: LIMIT as forSELECTinto_clause: INTO as forSELECTset_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 enforceLIMITon 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 enforceLIMITon both query blocks and the entire query expression:(SELECT 1 LIMIT 1) UNION (SELECT 2 LIMIT 1) LIMIT 1;
强制执行
LIMIT对整个查询表达式(无括号):To enforceLIMITon the entire query expression (with no parentheses):VALUES ROW(1), ROW(2) INTERSECT VALUES ROW(2), ROW(1) LIMIT 1;
混合强制:
LIMIT,在第一个查询块和整个查询表达Hybrid enforcement:LIMITon 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 trailingINTOclause for a query expression is not permitted if there is anotherINTOclause inside parentheses.括号内的查询表达式内的
ORDER BY或LIMIT,且同时应用于外部查询,均按照 SQL 标准处理。AnORDER BYorLIMITwithin 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 10can return no more than five rows.