
# VALUES
#### 功能描述
根据给定的值表达式计算一个或一组行的值。它通常用于在一个较大的命令内生成一个"常数表"。
#### 注意事项
- 应当避免使用VALUES返回数量非常大的结果行，否则可能会遭遇内存耗尽或者性能低下。尤其对于INSERT INTO VALUES语法，建议使用在小数据量插入的场景。对于大数据量的插入，建议使用产品提供的其它导入方式进行。
- 如果指定了多行，那么每一行都必须拥有相同的元素个数。
 
#### 语法格式
```
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：
```
CREATE TABLE reason_t1
(
    TABLE_SK          INTEGER               ,
    TABLE_ID          VARCHAR(20)           ,
    TABLE_NA          VARCHAR(20)
) store AS orc;
```
向表中插入一条记录：
```
INSERT INTO reason_t1(TABLE_SK, TABLE_ID, TABLE_NA) VALUES (1, 'S01', 'StudentA');
```
向表中插入一条记录，和上一条语法等效：
```
INSERT INTO reason_t1 VALUES (1, 'S01', 'StudentA');
```
向表中插入TABLE_SK小于1的记录：
```
INSERT INTO reason_t1 SELECT * FROM reason_t1 WHERE TABLE_SK < 1;
```
向表中插入多条记录：
```
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更新表中的数据，即覆盖式插入数据：
```
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;
```
向分区表的指定分区插入数据：
```
CREATE TABLE test_value_row(a int)PARTITION BY (d int) store AS orc;
INSERT OVERWRITE INTO test_value_row  VALUES(55,51);
INSERT OVERWRITE INTO test_value_row  VALUES(85,80);
ALTER TABLE test_value_row DROP PARTITIONS (d=51);
```
