首批通过分布式安全可靠测评,为关键业务系统打造
DELETE
更新时间:2023-09-18 15:46:06
描述
该语句用来删除表中符合条件的行,包括单表删除及多表删除两种方式。
无论是多表删除还是单表删除都不支持直接对子查询进行删除操作,例如 DELETE FROM (SELECT * FROM t1);。
语法
Single-Table-Delete Syntax:
DELETE [hint_options] FROM table_name
[PARTITION (partition_name,...)]
[WHERE where_condition]
[ORDER BY order_expression_list]
[LIMIT row_count]
Multiple-Table-Delete Syntax:
DELETE [hint_options] table_name[.*] [, table_name[.*]] ...
FROM table_references
[WHERE where_condition]
Or:
DELETE [hint_options] FROM table_name[.*] [, table_name[.*]] ...
USING table_references
[WHERE where_condition]
where_condition:
expression
order_expression_list:
order_expression [, order_expression ...]
order_expression:
expression [ASC | DESC]
limit_row_count:
INT_VALUE
table_references:
{table_name | joined_table | table_subquery | select_with_parents} [, ...]
参数解释
| 参数 | 描述 |
|---|---|
| hint_options | 指定 hint 选项。 |
| table_name | 指定需要删除的表名。 |
| partition_name | 需要删除表的对应分区名。 |
| where_condition | 删除的表需要满足的过滤条件。 |
| order_expression_list | 删除的表的排序键列表。 |
| row_count | 指定待删除的表的行数。指定的值只能为整数。 |
| table_references | 多表删除时指定的待选择的表序列。 |
示例
示例表及数据基于以下定义:
obclient> CREATE TABLE t1(c1 INT PRIMARY KEY, c2 INT);
Query OK, 0 rows affected
obclient> SELECT * FROM t1;
+----+------+
| c1 | c2 |
+----+------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
| 4 | 4 |
+----+------+
4 rows in set
obclient> CREATE TABLE t2(c1 INT PRIMARY KEY, c2 INT) PARTITION BY KEY(c1) PARTITIONS 4;
Query OK, 0 rows affected
obclient> SELECT * FROM t2;
+----+------+
| c1 | c2 |
+----+------+
| 5 | 5 |
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
+----+------+
4 rows in set
单表删除:删除
c1=2的行,其中c1列为表t1中的 Primary Key。obclient> DELETE FROM t1 WHERE c1 = 2; Query OK, 1 row affected (0.02 sec) obclient> SELECT * FROM t1; +----+------+ | c1 | c2 | +----+------+ | 1 | 1 | | 3 | 3 | | 4 | 4 | +----+------+ 3 rows in set单表删除:删除表
t1的按照c2列排序之后的第一行数据。obclient> DELETE FROM t1 ORDER BY c2 LIMIT 1; Query OK, 1 row affected obclient> SELECT * FROM t1; +----+------+ | c1 | c2 | +----+------+ | 2 | 2 | | 3 | 3 | | 4 | 4 | +----+------+ 3 rows in set单表删除:执行删除表
t2的p2分区的数据。obclient> DELETE FROM t2 PARTITION(p2); Query OK, 3 rows affected obclient> SELECT * FROM t2; +----+------+ | c1 | c2 | +----+------+ | 5 | 5 | +----+------+ 1 row in set多表删除:删除
t1,t2表中t1.c1 = t2.c1的数据。obclient> DELETE t1, t2 FROM t1, t2 WHERE t1.c1 = t2.c1; Query OK, 3 rows affected obclient> SELECT * FROM t1; +----+------+ | c1 | c2 | +----+------+ | 4 | 4 | +----+------+ 1 row in set obclient> SELECT * FROM t2; +----+------+ | c1 | c2 | +----+------+ | 5 | 5 | +----+------+ 1 row in set多表删除:删除
t1,t2表中t1.c1 = t2.c1的数据。obclient> DELETE FROM t1, t2 USING t1,t2 WHERE t1.c1 = t2.c1; Query OK, 6 rows affected obclient> SELECT * FROM t1; +----+------+ | c1 | c2 | +----+------+ | 4 | 4 | +----+------+ 1 row in set obclient> SELECT * FROM t2; +----+------+ | c1 | c2 | +----+------+ | 5 | 5 | +----+------+ 1 row in set多表删除:删除
t2表中的p2分区中和t1表中满足t1.c1 = t2.c1的数据。obclient> DELETE t2 FROM t1,t2 PARTITION(p2) WHERE t1.c1 = t2.c1; Query OK, 3 rows affected obclient> select * from t2; +----+------+ | c1 | c2 | +----+------+ | 5 | 5 | +----+------+ 1 row in set对可更新视图
v进行删除操作。obclient> CREATE VIEW v AS SELECT * FROM t1; Query OK, 0 rows affected obclient> DELETE FROM v WHERE v.c1 = 1; Query OK, 1 row affected obclient> SELECT * FROM v; +----+------+ | c1 | c2 | +----+------+ | 2 | 2 | | 3 | 3 | | 4 | 4 | +----+------+ 3 rows in set