Spec-Zone.ru › MySQL 9.2

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

Spec-Zone.ru

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