VALUES
功能描述
根据给定的值表达式计算一个或一组行的值。它通常用于在一个较大的命令内生成一个“常数表”。
注意事项
- 应当避免使用VALUES返回数量非常大的结果行,否则可能会遭遇内存耗尽或者性能低下。出现在INSERT中的VALUES是一个特殊情况,因为目标字段类型可以从INSERT的目标表获知,并不需要通过扫描VALUES列表来推测,所以在此情况下可以处理非常大的结果行。
- 如果指定了多行,那么每一行都必须拥有相同的元素个数。
语法格式
1 2 3 4 |
VALUES {( expression [, ...] )} [, ...] [ ORDER BY { sort_expression [ ASC | DESC | USING operator ] } [, ...] ] [ { [ LIMIT { count | ALL } ] [ OFFSET start [ ROW | ROWS ] ] } | { LIMIT start, { count | ALL } } ] [ FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } ONLY ]; |
参数说明
- expression
用于计算或插入结果表指定地点的常量或者表达式。
在一个出现在INSERT顶层的VALUES列表中,expression可以被DEFAULT替换以表示插入目的字段的缺省值。除此以外,当VALUES出现在其他场合的时候是不能使用DEFAULT的。
- sort_expression
一个表示如何排序结果行的表达式或者整数常量。
- ASC
指定按照升序排列。
- DESC
指定按照降序排列。
- operator
一个排序操作符。
- count
返回的最大行数。
- start
开始返回行之前忽略的行数。
- FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } ONLY
FETCH子句限定返回查询结果从第一行开始的总行数,count的缺省值为1。
示例
创建表reason_t1:
1 2 3 4 5 6 |
CREATE TABLE reason_t1 ( TABLE_SK INTEGER , TABLE_ID VARCHAR(20) , TABLE_NA VARCHAR(20) ); |
向表中插入一条记录:
1
|
INSERT INTO reason_t1(TABLE_SK, TABLE_ID, TABLE_NA) VALUES (1, 'S01', 'StudentA'); |
向表中插入一条记录,和上一条语法等效:
1
|
INSERT INTO reason_t1 VALUES (1, 'S01', 'StudentA'); |
向表中插入TABLE_SK小于1的记录:
1
|
INSERT INTO reason_t1 SELECT * FROM reason_t1 WHERE TABLE_SK < 1; |
向表中插入多条记录:
1 2 3 4 5 6 7 8 |
INSERT INTO reason_t1 VALUES (1, 'S01', 'StudentA'),(2, 'T01', 'TeacherA'),(3, 'T02', 'TeacherB'); SELECT * FROM reason_t1 ORDER BY 1; TABLE_SK | TABLE_ID | TABLE_NAME ----------+----------+------------ 1 | S01 | StudentA 2 | T01 | TeacherA 3 | T02 | TeacherB (3 rows) |
使用INSERT OVERWRITE更新表中的数据,即覆盖式插入数据:
1 2 3 4 5 6 |
INSERT OVERWRITE INTO reason_t1 values (4, 'S02', 'StudentB'); SELECT * FROM reason_t1 ORDER BY 1; TABLE_SK | TABLE_ID | TABLE_NAME ----------+----------+------------ 4 | S02 | StudentB (1 rows) |
将表reason_t1的数据插入到表reason_t1中:
INSERT INTO reason_t1 SELECT * FROM reason_t1;
对独立的字段明确缺省值:
INSERT INTO reason_t1 VALUES (5, 'S03', DEFAULT);
将一个表中的部分数据插入到另一个表中:先通过WITH子查询得到一张临时表temp_t,然后将临时表temp_t中的所有数据插入另一张表reason_t1中:
WITH temp_t AS (SELECT * FROM reason_t1) INSERT INTO reason_t1 SELECT * FROM temp_t ORDER BY 1;