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 9.2 поддерживает выражения запросов в скобках в соответствии с приведенной выше синтаксической конструкцией. В простейшем случае выражение запроса в скобках содержит один 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.