VALUES 子句不仅可以作为 INSERT 语句的一部分,还可以作为独立的语句或与 SELECT 结合使用。它允许在不创建物理表的情况下,动态构造一个内存中的数据集。语法
独立使用
VALUES (row)[, (row), ...];row ::= column [, column, ...]
派生表使用
SELECT select_listFROM (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 |-- +------+------+------+