VALUES
Name
VALUES -- 计算一个或一组行
Synopsis
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
根据给定的值表达式计算一个或一组行的值。 它通常用于在一个较大的命令内生成一个"常数表",但是它也可以用于自身。
如果指定了多行,那么每一行都必须拥有相同的元素个数。 结果表字段的数据类型将根据表达式的明确或隐含的数据类型确定, 使用的规则与UNION
(Section 10.5)相同。
在大命令里面,VALUES
允许出现在任何SELECT
可以出现的地方。 因为它在语法上非常类似于SELECT
,可以在VALUES
命令中使用 ORDER BY
, LIMIT
(或相等的 FETCH FIRST
), 和 OFFSET
子句。
参数
_expression_
用于计算或插入结果表指定地点的常量或者表达式。在一个出现在INSERT
顶层的VALUES
列表中,_expression_
可以被DEFAULT
替换以表示插入目的字段的缺省值。除此以外, 当VALUES
出现在其他场合的时候是不能使用DEFAULT
的。
_sort_expression_
一个表示如何排序结果行的表达式或者整数常量。这个表达式可以按照column1
, column2
等等引用VALUES
的结果列。更多细节参见 ORDER BY 子句。
_operator_
一个排序操作符。更多细节参见ORDER BY 子句。
_count_
返回的最大行数。更多细节参见 LIMIT 子句。
_start_
在开始返回行之前跳过的行数。更多细节参见LIMIT 子句。
注意
应当避免使用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;
当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'));
Tip: 对于简单的
IN
测试,更好的方法是依赖于IN
的标量列表形式, 而不是使用上述VALUES
查询。标量列表的方法写的更少,而且通常也更有效。
兼容性
VALUES
符合 SQL 标准,此外,LIMIT
和OFFSET
是PostgreSQL扩展; 又见SELECT。