Tip

VALUES

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 ]

Description

VALUES计算值表达式指定的行值或行值集。它最常用于在较大的命令中生成“常数表”,但可以单独使用。

指定多个行时,所有行必须具有相同数量的元素。通过使用与UNION相同的规则(请参见Section 10.5),通过组合出现在该列中的表达式的显式或推断类型来确定结果表的列的数据类型。

在较大的命令中,语法上允许SELECT所在位置的VALUES。由于语法将其视为SELECT,因此可以将ORDER BYLIMIT(或等效地FETCH FIRST)和OFFSET子句与VALUES命令一起使用。

Parameters

  • expression

    • 要计算并插入到结果表(行集)中指定位置的常数或表达式。在出现在INSERT顶层的VALUES列表中,* expression *可以用DEFAULT代替,以指示应插入目标列的默认值。当VALUES在其他上下文中出现时,不能使用DEFAULT
  • sort_expression

    • 表示如何对结果行进行排序的表达式或整数常量。该表达式可以将VALUES结果的列称为column1column2等。有关更多详细信息,请参见按条款 Order
  • operator

  • count

    • 要返回的最大行数。有关详细信息,请参见LIMIT Clause
  • start

    • 开始返回行之前要跳过的行数。有关详细信息,请参见LIMIT Clause

Notes

应避免使用VALUES具有大量行的列表,因为您可能会遇到内存不足的故障或性能不佳的情况。出现在INSERT内的VALUES是一种特殊情况(因为所需的列类型是INSERT的目标表中已知的,不需要通过扫描VALUES列表来推断),因此它可以处理比其他情况更大的列表。

Examples

一条简单的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';

通常,在较大的 SQL 命令中使用VALUES。最常见的用法是在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也可以用于可能写入 sub_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的默认列名称是column1column2等,但是在其他数据库系统中,这些名称可能不同.)

INSERT中使用VALUES时,所有值都将自动强制转换为相应目标列的数据类型。在其他上下文中使用它时,可能有必要指定正确的数据类型。如果所有条目都是用引号括起来的 Literals 常量,则强制第一个足以确定所有假定的类型:

SELECT * FROM machines
WHERE ip_address IN (VALUES('192.168.0.1'::inet), ('192.168.0.10'), ('192.168.1.43'));

Tip

对于简单的IN测试,最好是依靠INlist-of-scalars形式,而不是编写上面所示的VALUES查询。标量方法列表需要较少的编写,并且通常效率更高。

Compatibility

VALUES符合 SQL 标准。 LIMITOFFSET是 PostgreSQL 扩展;另请参见SELECT下。

See Also

INSERT, SELECT