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
列表中,可以用 DEFAULT
代替一个 expression
,以指示应插入目标列的默认值。当 VALUES
出现于其他上下文中时,不能使用 DEFAULT
。
sort_expression
表示如何对结果行进行排序的表达式或整数常数。此表达式可以将 VALUES
结果的列引用为 column1
、column2
,依此类推。有关更多详细信息,请参见 ORDER BY 子句(位于 SELECT 文档中)。
operator
排序运算符。有关详细信息,请参见 ORDER BY 子句(位于 SELECT 文档中)。
count
start
应避免带有超多行数的 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
子句为所有列指定名称,但这是一种很好的做法。(VALUES
在 PostgreSQL 中的默认列名称是 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
的 list-of-scalars 形式,而不是像上文所示的那样编写 VALUES
查询。使用标量列表的方法需要更少的编写,并且通常更有效。
VALUES
符合 SQL 标准。LIMIT
和 OFFSET
是 PostgreSQL 扩展;另请参阅 SELECT 下的内容。