↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

百科 / SQL 命令 / 查询与数据操作

SQL COMMAND · 查询与数据操作

VALUES

计算一组行

计算一组行

VALUES查询与数据操作引入 8.2现存至 20 devel1 次语法变更

动词
VALUES
对象
—
引入版本
8.2
状态
现存
语法变更次数
1
手册小节数
6

本站手册 · 18官方文档 ↗

版本轨迹

相对 PostgreSQL 17 无变化。

语法铁道图 PostgreSQL 18

沿轨道从左向右阅读,分岔表示选择,绕行表示可选,回环表示重复。方框为参数,点击带下划线的参数可展开子规则。

VALUES ( expression , ) , ORDER BY sort_expression ASC DESC USING operator , LIMIT count ALL OFFSET start ROW ROWS FETCH FIRST NEXT count ROW ROWS ONLY

语法概要

VALUES ( expression [, ...] ) [, ...]
    [ ORDER BY sort_expression [ ASC | DESC | USING operator ] [, ...] ]
    [ LIMIT { count | ALL } ]
    [ OFFSET start [ ROW | ROWS ] ]
    [ FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } ONLY ]

PostgreSQL 18 手册 · 查看完整参考页

描述

VALUES 计算由值表达式指定的一个行值或一组行值。它最常用于在更大的命令中生成一个“常量表”,但也可以单独使用。

当指定多于一行时,所有行都必须具有相同数量的元素。结果表各列的数据类型由出现在该列中的表达式的显式类型或推断类型组合决定,所用规则与 UNION 相同(见第 10.5 节)。

在更大的命令中,从语法上说,凡是允许出现 SELECT 的地方,也都允许出现 VALUES。因为在语法中它被当作 SELECT 处理,所以可以对 VALUES 命令使用 ORDER BY、LIMIT(或者等效的 FETCH FIRST)以及 OFFSET 子句。

参数

expression

要在结果表(行集合)中相应位置计算并插入的常量或表达式。在出现在 INSERT 顶层的 VALUES 列表中,expression 可以用 DEFAULT 替代,以表示应插入目标列的默认值。当 VALUES 出现在其他上下文中时,不能使用 DEFAULT。

sort_expression

一个指示结果行如何排序的表达式或整数常量。该表达式可以将 VALUES 结果的列引用为 column1、column2 等。详细信息参见 SELECT 文档中的 ORDER BY 子句。

operator

一个排序操作符。详细信息参见 SELECT 文档中的 ORDER BY 子句。

count

返回的最大行数。详细信息参见 SELECT 文档中的 LIMIT 子句。

start

开始返回行之前要跳过的行数。详细信息参见 SELECT 文档中的 LIMIT 子句。

注解

应避免使用行数非常多的 VALUES 列表,因为这可能导致内存不足错误或性能不佳。出现在 INSERT 中的 VALUES 属于一种特殊情况(因为所需的列类型可以从 INSERT 的目标表得知,并且无须通过扫描 VALUES 列表来推断),因此它能处理比其他上下文中实际可行的更大的列表。

示例

一个独立的 VALUES 命令:

VALUES (1, 'one'), (2, 'two'), (3, 'three');

这将返回一个两列三行的表。它实际上等效于:

SELECT 1 AS column1, 'one' AS column2
UNION ALL
SELECT 2, 'two'
UNION ALL
SELECT 3, 'three';

更常见的是,VALUES 会用在更大的 SQL 命令中。最常见的用法是在 INSERT 中:

INSERT INTO films (code, title, did, date_prod, kind)
    VALUES ('T_601', 'Yojimbo', 106, '1961-06-16', 'Drama');

在 INSERT 的上下文中,VALUES 列表中的项可以写成 DEFAULT,表示此处应使用该列的默认值,而不是显式指定一个值:

INSERT INTO films VALUES
    ('UA502', 'Bananas', 105, DEFAULT, 'Comedy', '82 minutes'),
    ('T_601', 'Yojimbo', 106, DEFAULT, 'Drama', DEFAULT);

VALUES 也可以用在原本可以编写子 SELECT 的地方,例如在 FROM 子句中:

SELECT f.*
  FROM films f, (VALUES('MGM', 'Horror'), ('UA', 'Sci-Fi')) AS t (studio, kind)
  WHERE f.studio = t.studio AND f.kind = t.kind;

UPDATE employees SET salary = salary * v.increase
  FROM (VALUES(1, 200000, 1.2), (2, 400000, 1.4)) AS v (depno, target, increase)
  WHERE employees.depno = v.depno AND employees.sales >= v.target;

注意,在 FROM 子句中使用 VALUES 时,表别名是可选的。为 VALUES 列表的列指定别名也是可选的,但这样做是一个好习惯。(在 PostgreSQL 中,VALUES 的默认列名是 column1、column2 等,但在其他数据库系统中,这些名称可能不同。)

当在 INSERT 中使用 VALUES 时,所有值都会自动转换为相应目标列的数据类型。当它用于其他上下文时,可能有必要指定正确的数据类型。如果各项都是带引号的字符串常量,只需转换第一项,就足以为所有项确定假定的数据类型:

SELECT * FROM machines
WHERE ip_address IN (VALUES('192.168.0.1'::inet), ('192.168.0.10'), ('192.168.1.43'));

提示

对于简单的 IN 测试,最好使用 IN 的标量列表形式,而不是写一个像上面那样的 VALUES 查询。标量列表方法写法更简洁,而且通常效率更高。

兼容性

VALUES 符合 SQL 标准。LIMIT 和 OFFSET 是 PostgreSQL 扩展,另见 SELECT。

另见

语法演化

相邻大版本之间的差异,新的在前。版本号链接到对应快照。

  1. PostgreSQL 19← 18正文更新

    正文更新
  2. PostgreSQL 15← 14正文更新

    正文更新
  3. PostgreSQL 13← 12正文更新

    正文更新
  4. PostgreSQL 10← 9.6正文更新

    正文更新
  5. PostgreSQL 8.4← 8.3语法变化

    + [ OFFSET start [ ROW | ROWS ] ]+ [ FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } ONLY ]正文更新
  6. PostgreSQL 8.3← 8.2正文更新

    正文更新
  7. PostgreSQL 8.2← 8.1新增此命令

同组命令

命令动词对象版本变动最近变更
QUERIES & DATA查询与数据操作10 条↑
COPYCOPY— 1917 次
在文件和表之间复制数据现存
DELETEDELETE— 1811 次
删除表中的行现存
EXPLAINEXPLAIN— 1910 次
显示一个语句的执行计划现存
INSERTINSERT— 1912 次
在表中插入新行现存
LOCKLOCK— 9.07 次
锁定表现存
MERGEMERGE— 182 次
有条件地插入、更新或删除表中的行现存
SELECTSELECT— 1722 次
从表或视图中检索行现存
UPDATEUPDATE— 1813 次
更新表中的行现存
VALUESVALUES— 8.41 次
计算一组行现存
SELECT INTOSELECTINTO 1913 次
根据查询结果定义一个新表现存