---
title: "DELETE - OceanBase 数据库 V4.5.0 | OceanBase 文档中心"
description: DELETE 描述 该语句用于删除表中符合条件的行（数据），包括单表删除和多表删除两种方式。 使用限制及注意事项 无论是多表删除还是单表删除都不支持直接对子查询进行删除操作，例如 DELETE FROM (SELECT * FROM t1); 。 权限要求 执行 DELETE 语句，需要当前用户拥有待操作表的 DEL…
---
切换语言

- 中文站 - 简体中文
- International - English
- 日本站 - 日本語

文档反馈![](https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*P8CuR4UJ_FkAAAAAAAAAAAAADiGDAQ/original) OceanBase 数据库分布式版 - V 4.5.0

# DELETE

更新时间：2026-04-12 09:45:17

[编辑](https://github.com/oceanbase/oceanbase-doc/edit/V4.5.0/zh-CN/700.reference/500.sql-reference/100.sql-syntax/200.common-tenant-of-mysql-mode/600.sql-statement-of-mysql-mode/3200.delete-of-mysql-mode.md)  

## 描述

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

## 使用限制及注意事项

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

## 权限要求

执行 `DELETE` 语句，需要当前用户拥有待操作表的 `DELETE` 权限。有关 OceanBase 数据库权限的详细介绍，请参见 [MySQL 模式下的权限分类](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000004479241)。

## 语法

```sql
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](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000004480377)。 |
| IGNORE | 可选项，在删除行的过程中忽略那些可被忽略的错误。当前版本仅支持该关键字语法，功能不生效。 |
| table_name | 指定需要删除数据的表名。 |
| PARTITION (partition_name_list) | 可选项，用于指定要删除数据的分区名称列表。如果删除多个分区数据，分区名称间使用英文逗号分隔。删除分区数据的详细介绍可参见下文 [partition_name](#partition_name)。 |
| WHERE where_condition_list | 可选项，用于指定删除特定行的过滤条件列表。如果没有 `WHERE` 子句，则删除所有行。删除特定条件数据的详细介绍可参见下文 [where_condition](#where_condition)。 |
| ORDER BY order_expression_list | 可选项，用于指定要删除行的排序键列表。通常与 `LIMIT` 子句一起使用。删除顺序的详细介绍可参见下文 [order_expression](#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_reference)。   #### 注意    仅支持在 `table_references` 子句中声明表别名，其他地方允许别名引用，但不允许别名声明。 |

### partition_name

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

**示例如下：**

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

   ```sql
   CREATE TABLE tbl1(col1 INT, col2 VARCHAR(20))
       PARTITION BY HASH(col1) PARTITIONS 5;

   ```

   ```sql
   INSERT INTO tbl1 VALUES(1, 'A1'),(2, 'A2'),(3, 'A3'),(4, 'A4'),(5, 'A5'),(6, 'A6'),(7, 'A7'),(8, 'A8'),(9, 'A9');

   ```
 2. 查看表 `tbl1` 中 `p0` 和 `p1` 分区的数据。

   ```sql
   SELECT * FROM tbl1 PARTITION(p0, p1);

   ```

   返回结果如下：

   ```shell
   +------+------+
   | col1 | col2 |
   +------+------+
   |    5 | A5   |
   |    1 | A1   |
   |    6 | A6   |
   +------+------+
   3 rows in set

   ```
 3. 删除表 `tbl1` 中 `p0` 和 `p1` 分区的数据。

   ```sql
   DELETE FROM tbl1 PARTITION(p0, p1);

   ```

   返回结果如下：

   ```shell
   Query OK, 3 rows affected

   ```

### where_condition

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

**示例如下：**

1. 查看表 `tbl1` 中 `col1 = 2` 的数据。

   ```sql
   SELECT * FROM tbl1 WHERE col1 = 2;

   ```

   返回结果如下：

   ```shell
   +------+------+
   | col1 | col2 |
   +------+------+
   |    2 | A2   |
   +------+------+
   1 row in set

   ```
 2. 删除表 `tbl1` 中 `col1 = 2` 的数据。

   ```sql
   DELETE FROM tbl1 WHERE col1 = 2;

   ```

   返回结果如下：

   ```shell
   Query OK, 1 row affected

   ```

### order_expression

`expression [ASC \| DESC]`：指定按升序（`ASC`，默认值）或降序（`DESC`）排序的表达式。

**示例如下：**

1. 查看表 `tbl1` 中的数据。

   ```sql
   SELECT * FROM tbl1;

   ```

   返回结果如下：

   ```shell
   +------+------+
   | col1 | col2 |
   +------+------+
   |    7 | A7   |
   |    3 | A3   |
   |    8 | A8   |
   |    4 | A4   |
   |    9 | A9   |
   +------+------+
   5 rows in set

   ```
 2. 从表 `tbl1` 中删除按照 `col1` 列降序排序后的第一个行（即删除排序后最大的一行数据）。

   ```sql
   DELETE FROM tbl1
       ORDER BY col1 DESC
       LIMIT 1;

   ```

   返回结果如下：

   ```
 3. 再次查看表 `tbl1` 中的数据。

   ```

   返回结果如下：

   ```shell
   +------+------+
   | col1 | col2 |
   +------+------+
   |    7 | A7   |
   |    3 | A3   |
   |    8 | A8   |
   |    4 | A4   |
   +------+------+
   4 rows in set

   ```

### table_reference

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

- `table_name`：表示表的名称，并且也可以指定分区删除数据。

  **示例如下：**

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

       ```sql
       CREATE TABLE tbl2(col1 INT PRIMARY KEY, col2 INT);

       ```

       ```sql
       INSERT INTO tbl2 VALUES(1,1),(2,2),(3,3),(4,4),(5,5);

       ```
     2. 创建表 `tbl3` 并插入测试数据。

       ```sql
       CREATE TABLE tbl3(col1 INT PRIMARY KEY, col2 INT) PARTITION BY KEY(col1) PARTITIONS 4;

       ```

       ```sql
       INSERT INTO tbl3 VALUES(1,11),(2,22),(3,3),(6,66),(7,77),(8,88);

       ```
     3. 删除 `tbl2`，`tbl3` 表中 `tbl2.col1 = tbl3.col1 AND tbl2.col2 = tbl3.col2` 的数据。

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

       ```

       或者

       ```sql
       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` 的数据。

       ```sql
       DELETE tbl3 FROM tbl2,tbl3 PARTITION(p0) WHERE tbl2.col1 = tbl3.col1;

       ```
 - `joined_table`：表示连接的表，即可以指定多个表并且使用 `JOIN` 连接。

  **示例如下：**

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

  ```sql
  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` 的行。

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

  ```

## 示例

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

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

   ```sql
   CREATE TABLE test_tbl1(col1 INT PRIMARY KEY, col2 INT);

   ```

   ```sql
   INSERT INTO test_tbl1 VALUES(1,1),(2,2),(3,3);

   ```
 2. 创建视图 `v1`。

   ```sql
   CREATE VIEW v1
       AS SELECT * FROM test_tbl1;

   ```
 3. 查看 `v1` 数据。

   ```sql
   SELECT * FROM v1;

   ```

   返回结果如下：

   ```shell
   +------+------+
   | col1 | col2 |
   +------+------+
   |    1 |    1 |
   |    2 |    2 |
   |    3 |    3 |
   +------+------+
   3 rows in set

   ```
 4. 删除视图 `v1` 中 `col1 = 1` 的值。

   ```sql
   DELETE FROM v1
       WHERE col1 = 1;

   ```
 5. 再次查看 `v1` 数据。

   ```

   返回结果如下：

   ```shell
   +------+------+
   | col1 | col2 |
   +------+------+
   |    2 |    2 |
   |    3 |    3 |
   +------+------+
   2 rows in set

   ```

## 相关文档

[删除数据](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000004476114)

 上一篇 下一篇 ![有帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*y6ocSqN8cqsAAAAAAAAAAAAAARQnAQ)![无帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*BG9IQJyLHF8AAAAAAAAAAAAAARQnAQ)![反馈](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*eTWdQKCRKHwAAAAAAAAAAAAAARQnAQ)[AI](https://www.oceanbase.com/obi) 咨询热线
