文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 參考手冊  /  ...  /  括號查詢表達式

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.0 根據上述語法支援以括號括起來的查詢表達式。最簡單的情況下,以括號括起來的查詢表達式包含單個 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 的運算優先於 UNIONEXCEPT,因此以下兩個敘述是等效的。

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 BYLIMIT 子句,它們會在外部集合運算、ORDER BYLIMIT 之前被應用。

您不能在沒有用括號括住查詢區塊的情況下使其具有尾隨的 ORDER BYLIMIT,但括號可以用於以各種方式強制執行。

  • 在每個查詢區塊上強制執行 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 子句。

  • 根據 SQL 標準處理在以括號括起來的查詢表達式中的 ORDER BYLIMIT,並且也應用於外部查詢的情況。

    允許巢狀的以括號括起來的查詢表達式。支援的最大巢狀層級為 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 最多只能返回五行。