VALUES — 计算一组行
VALUES (expression
[, ...] ) [, ...] [ ORDER BYsort_expression
[ ASC | DESC | USINGoperator
] [, ...] ] [ LIMIT {count
| ALL } ] [ OFFSETstart
[ ROW | ROWS ] ] [ FETCH { FIRST | NEXT } [count
] { ROW | ROWS } ONLY ]
VALUES
计算由值表达式指定的一行值或一组行值。它最常用于在较大的命令中生成一个“常量表”,但也可以单独使用。
当指定多于一行时,所有行必须具有相同数量的元素。结果表的列的数据类型通过结合该列中出现的表达式的显式或推断类型来确定,使用与 UNION
相同的规则(参见 第 10.5 节)。
在较大的命令中,VALUES
在语法上允许出现在 SELECT
允许的任何地方。因为语法上将其视为 SELECT
,所以可以为 VALUES
命令使用 ORDER BY
、LIMIT
(或等效的 FETCH FIRST
)和 OFFSET
子句。
expression
要在结果表中(行集)的指定位置计算并插入的常量或表达式。在 INSERT
的顶层出现的 VALUES
列表中,expression
可以被 DEFAULT
替换,表示应插入目标列的默认值。DEFAULT
不能在 VALUES
出现在其他上下文时使用。
sort_expression
指示如何排序结果行的表达式或整数常量。此表达式可以引用 VALUES
结果的列,名称为 column1
、column2
等。更多详细信息请参见 ORDER BY 子句,在 SELECT 文档中。
operator
排序运算符。有关详细信息,请参见 ORDER BY 子句,在 SELECT 文档中。
count
start
应避免行数非常多的 VALUES
列表,因为您可能会遇到内存不足的错误或性能不佳的问题。VALUES
出现在 INSERT
内是一个特殊情况(因为期望的列类型是从 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;
请注意,当 VALUES
用于 FROM
子句时,需要一个 AS
子句,就像 SELECT
一样。 AS
子句不必为所有列指定名称,但最好这样做。(在 PostgreSQL 中,VALUES
的默认列名称是 column1
、column2
等,但在其他数据库系统中,这些名称可能不同。)
当 VALUES
用于 INSERT
时,所有值都会自动强制转换为相应目标列的数据类型。当它用于其他上下文时,可能需要指定正确的数据类型。如果条目都是带引号的字面量常量,则强制转换第一个就足以确定所有条目的假定类型
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 下的内容。
如果您在文档中看到任何不正确、与您对特定功能的经验不符或需要进一步澄清的内容,请使用 此表格 报告文档问题。