15.2.11 Выражения запросов в скобках
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
MySQL 8.4 поддерживает выражения запросов в скобках согласно предыдущему синтаксису. В простейшем случае, выражение запроса в скобках содержит один SELECT или другой оператор, возвращающий набор результатов, и никаких следующих необязательных пунктов:
(SELECT 1);
(SELECT * FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = 'mysql');
TABLE t;
VALUES ROW(2, 3, 4), ROW(1, -2, 3);
Выражение запроса в скобках также может содержать запросы, связанные одной или несколькими операциями множества, такими как UNION, и заканчиваться любыми или всеми необязательными пунктами:
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, так что следующие два оператора эквивалентны:
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);
Выражения запросов в скобках также используются как выражения запросов, поэтому выражение запроса, обычно состоящее из блоков запросов, также может состоять из выражений запросов в скобках:
(TABLE t1 ORDER BY a) UNION (TABLE t2 ORDER BY b) ORDER BY z;
Блоки запросов могут иметь последующие ORDER BY и LIMIT пункты, которые применяются до внешней операции множества, ORDER BY и LIMIT.
Вы не можете иметь блок запроса с последующим ORDER
BY или LIMIT без помещения его в скобки, но скобки могут использоваться для принудительного применения различными способами:
-
Для принудительного применения
LIMITк каждому блоку запроса:(SELECT 1 LIMIT 1) UNION (VALUES ROW(2) LIMIT 1); (VALUES ROW(1), ROW(2) LIMIT 2) EXCEPT (SELECT 2 LIMIT 1);
-
Для принудительного применения
LIMITк обоим блокам запроса и всему выражению запроса:(SELECT 1 LIMIT 1) UNION (SELECT 2 LIMIT 1) LIMIT 1;
-
Для принудительного применения
LIMITко всему выражению запроса (без скобок):VALUES ROW(1), ROW(2) INTERSECT VALUES ROW(2), ROW(1) LIMIT 1;
-
Гибридное применение:
LIMITк первому блоку запроса и ко всему выражению запроса:(SELECT 1 LIMIT 1) UNION SELECT 2 LIMIT 1;
Синтаксис, описанный в этом разделе, ограничен определенными условиями:
Последовательность
INTOдля выражения запроса не допускается, если имеется другой пунктINTOвнутри скобок.-
ORDER BYилиLIMITвнутри выражения запроса в скобках, которое также применяется во внешнем запросе, обрабатывается в соответствии со стандартом SQL.Вложенные выражения запросов в скобках разрешены. Максимальный уровень вложенности, поддерживаемый, составляет 63; это после любых упрощений или слияний, выполненных анализатором.
Пример такого оператора показан здесь:
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может вернуть не более пяти строк.
© 2025 Oracle
Licensed under the GPLv2 License.