VALUES — 计算一组行
VALUES (expression[, ...] ) [, ...] [ ORDER BYsort_expression[ ASC | DESC | USINGoperator] [, ...] ] [ LIMIT {count| ALL } ] [ OFFSETstart[ ROW | ROWS ] ] [ FETCH { FIRST | NEXT } [count] { ROW | ROWS } ONLY ]
VALUES计算由值表达式指定的一个行值或一组行值。 它最常用于在更大的命令中生成一个“常量表”,但也可以单独使用。
当指定多于一行时,所有行都必须具有相同数量的元素。结果表各列的数据类型 由出现在该列中的表达式的显式类型或推断类型组合决定,所用规则与 UNION相同(见Section 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。
如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。