MySQL 8.4 版本注意事項
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
最多只能返回五列。