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:指定需要删除数据的分区名。
示例如下:
-
创建表
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'); -
查看表
tbl1中p0和p1分区的数据。SELECT * FROM tbl1 PARTITION(p0, p1);返回结果如下:
+------+------+
| col1 | col2 |
+------+------+
| 5 | A5 |
| 1 | A1 |
| 6 | A6 |
+------+------+
3 rows in set (0.002 sec) -
删除表
tbl1中p0和p1分区的数据。DELETE FROM tbl1 PARTITION(p0, p1);返回结果如下:
Query OK, 3 rows affected
where_condition
expression:指定可用于过滤要删除的行的条件表达式。
示例如下:
-
查看表
tbl1中col1 = 2的数据。SELECT * FROM tbl1 WHERE col1 = 2;返回结果如下:
+------+------+
| col1 | col2 |
+------+------+
| 2 | A2 |
+------+------+
1 row in set (0.001 sec) -
删除表
tbl1中col1 = 2的数据。DELETE FROM tbl1 WHERE col1 = 2;返回结果如下:
Query OK, 1 row affected (0.001 sec)
order_expression
expression [ASC \| DESC]:指定按升序(ASC,默认值)或降序(DESC)排序的表达式。
示例如下:
-
查看表
tbl1中的数据。SELECT * FROM tbl1;返回结果如下:
+------+------+
| col1 | col2 |
+------+------+
| 7 | A7 |
| 3 | A3 |
| 8 | A8 |
| 4 | A4 |
| 9 | A9 |
+------+------+
5 rows in set (0.003 sec) -
从表
tbl1中删除按照col1列降序排序后的第一个行(即删除排序后最大的一行数据)。DELETE FROM tbl1
ORDER BY col1 DESC
LIMIT 1;返回结果如下:
Query OK, 1 row affected (0.003 sec) -
再次查看表
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:表示表的名称,并且也可以指定分区删除数据。示例如下:
-
创建表
tbl2并插入测试数据。CREATE TABLE tbl2(col1 INT PRIMARY KEY, col2 INT);INSERT INTO tbl2 VALUES(1,1),(2,2),(3,3),(4,4),(5,5); -
创建表
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); -
删除
tbl2,tbl3表中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; -
删除
tbl3表中的p0分区中和tbl2表中满足tbl2.col1 = tbl3.col1的数据。DELETE tbl3 FROM tbl2,tbl3 PARTITION(p0) WHERE tbl2.col1 = tbl3.col1;
-
-
joined_table:表示连接的表,即可以指定多个表并且使用JOIN连接。示例如下:
删除
tbl2中与tbl3中col1相等且col1大于1的记录。DELETE tbl2
FROM tbl2 INNER JOIN tbl3 ON tbl2.col1 = tbl3.col1
WHERE tbl2.col1 > 1; -
table_subquery:表示子查询的表。示例如下:
使用子查询的方式删除
tbl2和tbl3表中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;
示例
对可更新视图进行删除操作。
-
创建表
test_tbl1并插入测试数据。CREATE TABLE test_tbl1(col1 INT PRIMARY KEY, col2 INT);INSERT INTO test_tbl1 VALUES(1,1),(2,2),(3,3); -
创建视图
v1。CREATE VIEW v1
AS SELECT * FROM test_tbl1; -
查看
v1数据。SELECT * FROM v1;返回结果如下:
+------+------+
| col1 | col2 |
+------+------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
+------+------+
3 rows in set (0.002 sec) -
删除视图
v1中col1 = 1的值。DELETE FROM v1
WHERE col1 = 1; -
再次查看
v1数据。SELECT * FROM v1;返回结果如下:
+------+------+
| col1 | col2 |
+------+------+
| 2 | 2 |
| 3 | 3 |
+------+------+
2 rows in set (0.003 sec)