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

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

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

SQL COMMAND · 查询与数据操作

VALUES

计算一组行

VALUES查询与数据操作引入 10(基线)现存至 20 devel0 次语法变更

动词
VALUES
对象
—
引入版本
10(基线)
状态
现存
语法变更次数
0
手册小节数
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 Clause。

operator

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

count

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

start

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

注解

应避免使用行数非常多的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时,需要有一个AS子句,这一点与SELECT相同。虽然AS子句不要求为所有列都指定名称,但这样做是一个好习惯。(在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 13← 12正文更新

    正文更新

同组命令

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