VALUES 语句

最近更新时间:2026-05-06 16:28:13

我的收藏
VALUES 子句不仅可以作为 INSERT 语句的一部分,还可以作为独立的语句或与 SELECT 结合使用。它允许在不创建物理表的情况下,动态构造一个内存中的数据集。

语法

独立使用

VALUES (row)[, (row), ...];

row ::= column [, column, ...]

派生表使用

SELECT select_list
FROM (VALUES (row)[, (row), ...]) [AS alias[(col_alias1, ...)]];

row ::= column [, column, ...]

使用规则与约束

结构一致性: 每一行 (row) 必须包含相同数量的列 (column)。
类型兼容性: 各行中对应列的数据类型必须相互兼容(如数值型与浮点型可兼容,日期字符串与时间戳可兼容)。
命名机制:
若未显式指定派生表名,系统默认分配别名 expr$0。建议使用 AS 关键字显式命名以增强代码可读性。
默认列名遵循 派生表名.expr$N 规范(其中 N 为从 0 开始起始的列索引)。
内容灵活: 列的内容可以是常量、变量或表达式。

示例

构造匿名数据集(默认命名):
-- 构造一个 2 行 3 列的派生表,使用默认列命名
SELECT * FROM (VALUES (4,5,6), (7,8,9));
-- 输出:
-- +-------------------+-------------------+-------------------+
-- | `expr$0`.`expr$0` | `expr$0`.`expr$1` | `expr$0`.`expr$2` |
-- +-------------------+-------------------+-------------------+
-- | 4 | 5 | 6 |
-- | 7 | 8 | 9 |
-- +-------------------+-------------------+-------------------+
指定派生表别名:
-- 通过 AS 关键字定义表名,简化引用路径。
SELECT * FROM (VALUES (4,5,6), (7,8,9)) AS t(x,y,z);

-- 输出结果:
-- +--------------+--------------+--------------+
-- | `t`.`expr$0` | `t`.`expr$1` | `t`.`expr$2` |
-- +--------------+--------------+--------------+
-- | 4 | 5 | 6 |
-- | 7 | 8 | 9 |
-- +--------------+--------------+--------------+
自定义列别名:
-- 在定义表名的同时,通过括号显式指定每一列的名称。
SELECT * FROM (VALUES (4,5,6), (7,8,9)) AS t(x, y, z);

-- 输出结果:
-- +------+------+------+
-- | x | y | z |
-- +------+------+------+
-- | 4 | 5 | 6 |
-- | 7 | 8 | 9 |
-- +------+------+------+