# DELETE
#### 功能描述
从指定的表里删除满足WHERE子句的行。如果WHERE子句不存在，将删除表中所有行，结果只保留表结构。
#### 注意事项
- 要删除表中的数据，用户必须对它有DELETE权限。同样也必须有USING子句引用的表以及condition上读取的表的SELECT权限。
- 对于复制表，仅支持两种场景下的DELETE操作：
  - 有主键约束的场景。
  
  - 执行计划能下推的场景。
   
- 对于列存表，暂时不支持RETURNING子句。
![](https://support.huaweicloud.com/sqlreference-dws/public_sys-resources/warning_3.0-zh-cn.png)
- 避免使用UPDATE/DELETE大批量刷新和删除数据，考虑使用TRUNCATE PARTITION/DROP PARTITION代替。
- 更多开发设计规范参见[总体开发设计规范](https://support.huaweicloud.com/devg-dws/dws_04_0075.html)。
 
#### 语法格式
```
[ WITH [ RECURSIVE ] with_query [, ...] ]
    DELETE [/*+ plan_hint */] FROM [ ONLY ] table_name [ * ] [ [ AS ] alias ]
    [ PARTITION ( partition_name ) | PARTITION FOR ( partition_key_value [, ...] ) ]
    [ USING using_list ]
    [ WHERE condition | WHERE CURRENT OF cursor_name ]
    [ RETURNING { * | { output_expr [ [ AS ] output_name ] } [, ...] } ];
```
#### 参数说明
表1DELETE参数说明 
| 参数                                           | 描述                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  | 取值范围                                                                                                                                                |
|:---|:---|:---|
| WITH \[ RECURSIVE \] with_query \[, ...\] | 用于声明一个或多个可以在主查询中通过名字引用的子查询，相当于临时表。 如果声明了RECURSIVE，则允许SELECT子查询通过名字引用它自己。 其中with_query的详细格式为： ``` with_query_name [ ( column_name [, ...] ) ] AS ( {select | values | insert | update | delete} ) ``` -- with_query_name指定子查询生成的结果集名字，在查询中可使用该名称访问子查询的结果集。 -- column_name指定子查询结果集中显示的列名。 -- 每个子查询可以是SELECT，VALUES，INSERT，UPDATE或DELETE语句。 | -                                                                                                                                                   |
| plan_hint子句                                 | 以/\*+ \*/的形式在关键字后，用于对指定语句块生成的计划进行hint调优，详细用法请参见[使用Plan Hint进行调优](https://support.huaweicloud.com/devg-dws/dws_04_0454.html)章节。                                                                                                                                                                                                                                                                                                                                                                                                                                                    | -                                                                                                                                                     |
| ONLY                                       | 如果指定ONLY，则只有指定表被删除；如果没有指定ONLY，则指定表及其所有继承表都会被删除。 该参数仅为了兼容PG保留，DWS不支持继承表。                                                                                                                                                                                                                                                                                                                                                                                                                                                             | -                                                                                                                                                   |
| table_name                                  | 目标表的名字（可以有模式修饰）。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     | 已存在的表名。                                                                                                                                             |
| alias                                      | 目标表的别名。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              | 字符串，符合标识符命名规范。详情请参见[标识符命名规范](https://support.huaweicloud.com/sqlreference-dws/dws_06_0007.html#ZH-CN_TOPIC_0000001811634529__section1475018612353)。 |
| partition_name                               | 分区名。仅8.2.1及以上集群版本支持该选项。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            | 已存在的分区名。                                                                                                                                             |
| partition_key_value                           | 分区键值。 通过PARTITION FOR ( partition_key_value \[, ...\] )子句指定的这一组值，可以唯一确定一个分区。                                                                                                                                                                                                                                                                                                                                                                                                                                                       | -                                                                                                                                                   |
| using_list                                 | using子句。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           | -                                                                                                                                                 |
| condition                                  | 一个返回boolean值的表达式，用于判断哪些行需要被删除。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      | -                                                                                                                                                   |
| WHERE CURRENT OF cursor_name              | 当前不支持，仅保留语法接口。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     | -                                                                                                                                                   |
| output_expr                                 | DELETE命令删除行之后计算输出结果的表达式。该表达式可以使用表的任意字段。可以使用\*返回被删除行的所有字段。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            | -                                                                                                                                                    |
| output_name                                 | 一个字段的输出名称。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          | 字符串，符合标识符命名规范。详情请参见[标识符命名规范](https://support.huaweicloud.com/sqlreference-dws/dws_06_0007.html#ZH-CN_TOPIC_0000001811634529__section1475018612353)。 |
   
#### 示例
创建表tpcds.customer_address：
```
DROP SCHEMA IF EXISTS tpcds CASCADE;
CREATE SCHEMA tpcds;
CREATE TABLE tpcds.customer_address
(
    ca_address_sk             bigint               not null ,
    ca_address_id             char(16)              not null,
    ca_street_number          char(10)                      ,
    ca_street_name            varchar(60)                   ,
    ca_street_type            char(15)                      ,
    ca_suite_number           char(10)                      ,
    ca_city                   varchar(60)                   ,
    ca_county                 varchar(30)                   ,
    ca_state                  char(2)                       ,
    ca_zip                    char(10)                      ,
    ca_country                varchar(20)                   ,
    ca_gmt_offset             decimal(5,2)                  ,
    ca_location_type          char(20)
) 
 with (orientation = column)
distribute by hash (ca_address_sk);
```
删除tpcds.customer_address中ca_address_sk小于14888的职员：
```
DELETE FROM tpcds.customer_address WHERE ca_address_sk < 14888;
```
删除tpcds.customer_address中ca_address_sk为14891，14893和14895的职员：
```
DELETE FROM tpcds.customer_address WHERE ca_address_sk in (14891,14893,14895);
```
删除tpcds.customer_address中所有数据：
```
DELETE FROM tpcds.customer_address;
```
先通过子查询（删除行存表tpcds.warehouse_t30）得到一张临时表temp_t，然后查询临时表temp_t中的所有数据：
```
CREATE TABLE tpcds.warehouse_t30 (a int, b int);
WITH temp_t AS (DELETE FROM tpcds.warehouse_t30 RETURNING *) SELECT * FROM temp_t ORDER BY 1;
```
删除分区表test_range_row的指定分区p1：
```
DROP TABLE IF EXISTS test_range_row;
CREATE TABLE test_range_row(a int, d int)
DISTRIBUTE BY hash(a) PARTITION BY RANGE(d)
(
    PARTITION p1 values LESS THAN (60),
    PARTITION p2 values LESS THAN (75),
    PARTITION p3 values LESS THAN (90),
    PARTITION p4 VALUES LESS THAN (maxvalue)
);
INSERT OVERWRITE INTO test_range_row PARTITION(p1) VALUES(55,51);
INSERT OVERWRITE INTO test_range_row PARTITION(p3) VALUES(85,80);
DELETE FROM test_range_row PARTITION(p1);
```
