MariaDB 或 MySQL 是否实现了 VALUES(表达式)表值构造函数?

Eva*_*oll 5 mysql mariadb sql-standard mariadb-10.3

我只是想知道 MariaDB 或 MySQL 是否<table value constructor>在 SQL 规范中实现了。在SQL ServerPostgreSQL 中,这是通过标准化的VALUES (expression)?

SELECT *
FROM ( VALUES (1) ) AS t(x);
 x 
---
 1
(1 row)
Run Code Online (Sandbox Code Playgroud)

(来自语法)。

小智 8

MariaDB 10.3+

是的,谈到MariaDB 10.3.3 和更高版本,它似乎支持表值构造函数。

选择 1,t.7
FROM (VALUES (7),(42)) AS t;
 1 | 7
--------
 1 | 7
 1 | 42

你会发现,不存在用于支持column_aliasFROM条款,而不是要求你使用table_alias和名称第一行的该列的值。但是在 CTE 的WITH子句中允许 column_alias ,

WITH t(a) AS ( VALUES (1),(2) )
SELECT t.a, t.a AS b
FROM t;
 a |  b
--------
 1 |  1
 2 |  2
Run Code Online (Sandbox Code Playgroud)

此外,您可以通过为第一行指定一个明确的别名来绕过这一点。

SELECT 1 AS x ,2 AS y
UNION VALUES (3,4),(5,6);
 x | y
-------
 1 | 2
 3 | 4
 5 | 6
Run Code Online (Sandbox Code Playgroud)

另请参阅https://jira.mariadb.org/browse/MDEV-12172 中的示例


PostgreSQL 允许在 FROM 子句中使用列别名,如上所示t(x),MariaDB 也不支持此语法

MariaDB <10.3;MySQL 5.x 和 8.x(解决方法)

在 MariaDB 10.3 之前,所有版本的 MySQL 都不支持该VALUES表达式。

SELECT * FROM ( VALUES (1) ) AS t(x);
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'VALUES (1) ) AS t(x)' at line 1
Run Code Online (Sandbox Code Playgroud)

但是,它确实支持带有文字的子选择。

SELECT * FROM (SELECT (1) AS x) AS t;
-- more simply
-- SELECT * FROM (SELECT 1 AS x) AS t;
+---+
| x |
+---+
| 1 |
+---+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

PostgreSQL 也支持这种语法。

SELECT * FROM ( SELECT 1 AS x ) AS t;
 x 
---
 1
(1 row)
Run Code Online (Sandbox Code Playgroud)

但是,如果您执行多行,则使用此语法会变得更加冗长。下面来自 MariaDB,也适用于 PostgreSQL

SELECT * FROM ( SELECT 1 AS x UNION ALL SELECT 2 ) AS t;
+---+
| x |
+---+
| 1 |
| 2 |
+---+
Run Code Online (Sandbox Code Playgroud)

而 with VALUES,它只是VALUES (1),(2)