跳到主要内容

DELETE

描述

该语句用于删除表中符合条件的行(数据),包括单表删除和多表删除两种方式。

使用限制及注意事项

无论是多表删除还是单表删除都不支持直接对子查询进行删除操作,例如 DELETE FROM (SELECT * FROM t1);

权限要求

执行 DELETE 语句,需要当前用户拥有待操作表的 DELETE 权限。有关 seekdb 权限的详细介绍,参见 seekdb 的权限分类

语法

single_table_delete_syntax:
DELETE [hint_options] [IGNORE]
FROM table_name
[PARTITION (partition_name_list)]
[WHERE where_condition_list]
[ORDER BY order_expression_list]
[LIMIT row_count];

partition_name_list:
partition_name [, partition_name ...]

where_condition_list:
where_condition [, where_condition ...]

where_condition:
expression

order_expression_list:
order_expression [, order_expression ...]

order_expression:
expression [ASC | DESC]

multiple_table_delete_syntax:
DELETE [hint_options]
table_name_list
FROM table_references
[WHERE where_condition_list];
Or:
DELETE [hint_options]
FROM table_name_list
USING table_references
[WHERE where_condition_list];

table_name_list:
table_name[.*] [, table_name[.*] ...]

table_references:
table_reference [, table_reference ...]

table_reference:
table_name
| joined_table
| table_subquery

参数解释

参数描述
single_table_delete_syntax表示单表删除行的 SQL 语法。
hint_options可选项,用于指定 hint 选项。有关 Hint 的介绍信息,参见 Optimizer Hint
IGNORE可选项,在删除行的过程中忽略那些可被忽略的错误。当前版本仅支持该关键字语法,功能不生效。
table_name指定需要删除数据的表名。
PARTITION (partition_name_list)可选项,用于指定要删除数据的分区名称列表。如果删除多个分区数据,分区名称间使用英文逗号分隔。删除分区数据的详细介绍可参见下文 partition_name
WHERE where_condition_list可选项,用于指定删除特定行的过滤条件列表。如果没有 WHERE 子句,则删除所有行。删除特定条件数据的详细介绍可参见下文 where_condition
ORDER BY order_expression_list可选项,用于指定要删除行的排序键列表。通常与 LIMIT 子句一起使用。删除顺序的详细介绍可参见下文 order_expression
LIMIT row_count可选项,用于指定最多删除的行数。row_count 的值只能为整数。
multiple_table_delete_syntax表示多表删除行的 SQL 语法。
table_name_list指定要删除数据的表的列表。
注意如果在 table_references 子句中为表声明了别名,则在 table_name_list 子句中引用该表时必须使用该别名。
table_references指定要从中删除数据的表或表的组合,即多表删除时指定的待选择的表序列。详细介绍可参见下文 table_reference
注意仅支持在 table_references 子句中声明表别名,其他地方允许别名引用,但不允许别名声明。

partition_name

partition_name:指定需要删除数据的分区名。

示例如下:

  1. 创建表 tbl1 并插入测试数据。

    CREATE TABLE tbl1(col1 INT, col2 VARCHAR(20))
    PARTITION BY HASH(col1) PARTITIONS 5;
    INSERT INTO tbl1 VALUES(1, 'A1'),(2, 'A2'),(3, 'A3'),(4, 'A4'),(5, 'A5'),(6, 'A6'),(7, 'A7'),(8, 'A8'),(9, 'A9');
  2. 查看表 tbl1p0p1 分区的数据。

    SELECT * FROM tbl1 PARTITION(p0, p1);

    返回结果如下:

    +------+------+
    | col1 | col2 |
    +------+------+
    | 5 | A5 |
    | 1 | A1 |
    | 6 | A6 |
    +------+------+
    3 rows in set (0.002 sec)
  3. 删除表 tbl1p0p1 分区的数据。

    DELETE FROM tbl1 PARTITION(p0, p1);

    返回结果如下:

    Query OK, 3 rows affected

where_condition

expression:指定可用于过滤要删除的行的条件表达式。

示例如下:

  1. 查看表 tbl1col1 = 2 的数据。

    SELECT * FROM tbl1 WHERE col1 = 2;

    返回结果如下:

    +------+------+
    | col1 | col2 |
    +------+------+
    | 2 | A2 |
    +------+------+
    1 row in set (0.001 sec)
  2. 删除表 tbl1col1 = 2 的数据。

    DELETE FROM tbl1 WHERE col1 = 2;

    返回结果如下:

    Query OK, 1 row affected (0.001 sec)

order_expression

expression [ASC \| DESC]:指定按升序(ASC,默认值)或降序(DESC)排序的表达式。

示例如下:

  1. 查看表 tbl1 中的数据。

    SELECT * FROM tbl1;

    返回结果如下:

    +------+------+
    | col1 | col2 |
    +------+------+
    | 7 | A7 |
    | 3 | A3 |
    | 8 | A8 |
    | 4 | A4 |
    | 9 | A9 |
    +------+------+
    5 rows in set (0.003 sec)
  2. 从表 tbl1 中删除按照 col1 列降序排序后的第一个行(即删除排序后最大的一行数据)。

    DELETE FROM tbl1
    ORDER BY col1 DESC
    LIMIT 1;

    返回结果如下:

    Query OK, 1 row affected (0.003 sec)
  3. 再次查看表 tbl1 中的数据。

    SELECT * FROM tbl1;

    返回结果如下:

    +------+------+
    | col1 | col2 |
    +------+------+
    | 7 | A7 |
    | 3 | A3 |
    | 8 | A8 |
    | 4 | A4 |
    +------+------+
    4 rows in set (0.003 sec)

table_reference

table_reference:指的是在 SQL 语句中用于指代表的部分,即指代表的不同方式。具体如下:

  • table_name:表示表的名称,并且也可以指定分区删除数据。

    示例如下:

    1. 创建表 tbl2 并插入测试数据。

      CREATE TABLE tbl2(col1 INT PRIMARY KEY, col2 INT);
      INSERT INTO tbl2 VALUES(1,1),(2,2),(3,3),(4,4),(5,5);
    2. 创建表 tbl3 并插入测试数据。

      CREATE TABLE tbl3(col1 INT PRIMARY KEY, col2 INT) PARTITION BY KEY(col1) PARTITIONS 4;
      INSERT INTO tbl3 VALUES(1,11),(2,22),(3,3),(6,66),(7,77),(8,88);
    3. 删除 tbl2tbl3 表中 tbl2.col1 = tbl3.col1 AND tbl2.col2 = tbl3.col2 的数据。

      DELETE tbl2, tbl3
      FROM tbl2, tbl3
      WHERE tbl2.col1 = tbl3.col1
      AND tbl2.col2 = tbl3.col2;

      或者

      DELETE FROM tbl2, tbl3
      USING tbl2, tbl3
      WHERE tbl2.col1 = tbl3.col1
      AND tbl2.col2 = tbl3.col2;
    4. 删除 tbl3 表中的 p0 分区中和 tbl2 表中满足 tbl2.col1 = tbl3.col1 的数据。

      DELETE tbl3 FROM tbl2,tbl3 PARTITION(p0) WHERE tbl2.col1 = tbl3.col1;
  • joined_table:表示连接的表,即可以指定多个表并且使用 JOIN 连接。

    示例如下:

    删除 tbl2 中与 tbl3col1 相等且 col1 大于 1 的记录。

    DELETE tbl2
    FROM tbl2 INNER JOIN tbl3 ON tbl2.col1 = tbl3.col1
    WHERE tbl2.col1 > 1;
  • table_subquery:表示子查询的表。

    示例如下:

    使用子查询的方式删除 tbl2tbl3 表中 tbl3.col1 < 2 AND tbl2.col1 = t3.col1 的行。

    DELETE FROM t2, t3
    USING tbl2 t2, (SELECT * FROM tbl3 WHERE tbl3.col1 < 2) t3
    WHERE t2.col1 = t3.col1;

示例

对可更新视图进行删除操作。

  1. 创建表 test_tbl1 并插入测试数据。

    CREATE TABLE test_tbl1(col1 INT PRIMARY KEY, col2 INT);
    INSERT INTO test_tbl1 VALUES(1,1),(2,2),(3,3);
  2. 创建视图 v1

    CREATE VIEW v1
    AS SELECT * FROM test_tbl1;
  3. 查看 v1 数据。

    SELECT * FROM v1;

    返回结果如下:

    +------+------+
    | col1 | col2 |
    +------+------+
    | 1 | 1 |
    | 2 | 2 |
    | 3 | 3 |
    +------+------+
    3 rows in set (0.002 sec)
  4. 删除视图 v1col1 = 1 的值。

    DELETE FROM v1
    WHERE col1 = 1;
  5. 再次查看 v1 数据。

    SELECT * FROM v1;

    返回结果如下:

    +------+------+
    | col1 | col2 |
    +------+------+
    | 2 | 2 |
    | 3 | 3 |
    +------+------+
    2 rows in set (0.003 sec)

相关文档

删除数据