VALUES
VALUES - 计算一组行
语法格式
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 相同的规则。
在较大的命令中, VALUES 在语法上允许 SELECT所在的任何位置。。因为它被语法视为 SELECT ,所以可以将 ORDER BY , LIMIT(或等效 FETCH FIRST )和 OFFSET 子句与 VALUES 命令一起使用。
参数说明
expression
要在结果表(行集)中的指定位置计算和插入的常量或表达式。在出现在 INSERT顶层的 VALUES 列表中, expression 可以替换为 DEFAULT,以指示应插入目标列的默认值。当 VALUES 出现在其他上下文中时,不能使用DEFAULT 。
sort_expression
表示如何对结果行进行排序的表达式或整型常量。此表达式可以将 VALUES结果的列引用为 column1 , column2 等。有关详细信息,请参阅 ORDER BY Clause。
operator
排序运算符。有关详细信息,请参阅 ORDER BY Clause。
count
要返回的最大行数。有关详细信息,请参阅 LIMIT Clause。
start
开始返回行之前要跳过的行数。有关详细信息,请参阅 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 的上下文中, VALUES 列表的条目可以是 DEFAULT,以指示此处应使用列默认值而不是指定值:
INSERT INTO films (code, title, did, date_prod, kind)
VALUES ('T_601', 'Yojimbo', 106, '1961-06-16', 'Drama');
VALUES 也可以在可能写入子 SELECT 的地方使用,例如在 FROM 子句中:
INSERT INTO films VALUES
('UA502', 'Bananas', 105, DEFAULT, 'Comedy', '82 minutes'),
('T_601', 'Yojimbo', 106, DEFAULT, 'Drama', DEFAULT);
请注意,在 FROM 子句中使用 VALUES 时需要 AS 子句,就像 SELECT 一样。 AS子句不需要为所有列指定名称,但这样做是很好的做法。 (Vastbase E100中VALUES 的默认列名是 column1 , column2等,但这些名称在其他数据库系统中可能有所不同。)
在 INSERT 中使用 VALUES时,值将全部自动强制转换为相应目标列的数据类型。当它在其他上下文中使用时,可能需要指定正确的数据类型。如果条目都是引用的文字常量,则强制第一个就足以确定所有的假定类型:
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;
注意
对于简单的 IN 测试,最好依赖于 IN 的 list-of-scalars形式,而不是如上所示编写 VALUES查询。标量列表方法需要较少的写入,并且通常更有效。