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
,因此可以使用ORDER BY
、LIMIT
(或等效的FETCH FIRST
)和OFFSET
子句与VALUES
命令一起使用。
expression
一个常量或表达式,用于计算并在结果表(行集)的指定位置插入。在出现在INSERT
顶层的VALUES
列表中,expression
可以替换为DEFAULT
以指示应插入目标列的默认值。DEFAULT
不能在VALUES
出现在其他上下文中时使用。
sort_expression
一个表达式或整数常量,指示如何对结果行排序。此表达式可以引用VALUES
结果的列,如column1
、column2
等。有关更多详细信息,请参见SELECT 文档中的 ORDER BY 子句。
operator
一个排序运算符。有关详细信息,请参见SELECT 文档中的 ORDER BY 子句。
count
要返回的最大行数。有关详细信息,请参见SELECT 文档中的 LIMIT 子句。
start
在开始返回行之前要跳过的行数。有关详细信息,请参见SELECT 文档中的 LIMIT 子句。
应避免使用具有大量行的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
子句为所有列指定名称,但最好这样做。(VALUES
的默认列名为column1
、column2
等,在PostgreSQL中,但在其他数据库系统中这些名称可能不同。)
当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。
如果您在文档中看到任何不正确的内容、与您对特定功能的体验不符的内容或需要进一步说明的内容,请使用此表单报告文档问题。