VALUES
VALUES¶
计算一组行。
- 语法
-
``` sql 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
相同的规则,组合出现在该列中的表达式的显式或推断类型,来确定结果表的列的数据类型。在较大的命令中,语法上允许
SELECT
所在的任何位置使用VALUES
。 由于语法将其视为SELECT
,因此可以将VALUES
命令与ORDER BY
,LIMIT
(或等效的FETCH FIRST
)和OFFSET
子句一起使用。 - 参数
-
该SQL命令参数见下
expression
- 要计算并插入到结果表中指定位置(行集)的常量或表达式。 在出现在
INSERT
顶层的VALUES
列表中,可以将表达式替换为DEFAULT
以指示应插入目标列的默认值。当VALUES
出现在其他上下文中时,不能使用DEFAULT
。 sort_expression
- 表示如何对结果行进行排序的表达式或整数常量。 该表达式可以将
VALUES
结果的列称为column1
,column2
等。有关更多详细信息,请参见SELECT
参数中的“ORDER BY子句”。 operator
- 排序运算符。 有关更多详细信息,请参见
SELECT
参数中的“ORDER BY子句”。 LIMIT count \| OFFSET start
- 要返回的最大行数。 有关更多详细信息,请参见
SELECT
参数中的“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';
通常,在较大的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
子句为所有列指定名称,但是这样做是一种好习惯。在SeaboxMPP数据库中,VALUES
的默认列名称为column1
,column2
等,但是在其他数据库系统中,这些名称可能不同。在
INSERT
中使用VALUES
时,所有值都将自动强制转换为相应目标列的数据类型。在其他上下文中使用它时,可能有必要指定正确的数据类型。如果所有条目都是用引号括起来的文字常量,则强制第一个足以确定所有假定的类型:SELECT * FROM machines WHERE ip_address IN (VALUES('192.168.0.1'::inet), ('192.168.0.10'), ('192.0.2.43'));
注意: 对于简单的
IN
测试,最好依靠IN
的标量列表形式,而不要像上面所示编写VALUES
查询。标量方法列表需要较少的编写,并且通常效率更高。 - 兼容性说明
VALUES
符合SQL标准。LIMIT
和OFFSET
是SeaboxMPP数据库扩展。- 相关SQL命令
INSERT
,SELECT