VALUES
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 节)。
在更大的命令中,从语法上说,凡是允许出现 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。