Spec-Zone.ru › MySQL 8.4

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.
https://docs.oracle.com/cd/E17952_01/mysql-8.4-en/parenthesized-query-expressions.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API