DELETE

从表中移除行。您可以使用 WHERE 子句来指定应移除哪些行。如果需要使用子查询或附加表来标识要移除的行,请在 USING 子句中指定子查询或表。

重要

TRUNCATE TABLE 不同,此命令 不会 删除外部文件加载历史记录。如果从暂存文件中删除加载到表中的行,则无法再次从该文件加载数据,除非修改该文件并再次暂存。

语法

DELETE FROM <table_name>
            [ USING <additional_table_or_query> [, <additional_table_or_query> ] ]
            [ WHERE <condition> ]
Copy

必填参数

table_name

指定要从中移除行的表。

可选参数

USING additional_table_or_query [, ... ]

如果需要在 WHERE 子句中引用其他表来帮助确定要移除的行,请在 USING 子句中指定这些表的名称。还可以使用 USING 子句指定标识要移除的行的子查询。

如果指定子查询,则将子查询放在括号中。

如果指定多个表或查询,请使用逗号分隔它们。

WHERE condition

指定用于选择要移除的行的条件。如果省略此参数,则将移除表中的所有行,但保留该表。

使用说明

  • 当基于 JOIN(通过指定 USING 子句)进行删除时,目标表中的一行可能会与 USING 表中的多行联接。如果任何联接组合都满足 DELETE 条件,则删除目标行。

    例如,给定带有列 (k number, v number) 的表 tab1tab2

    select * from tab1;
    
    -------+-------+
       k   |   v   |
    -------+-------+
       0   |   10  |
    -------+-------+
    
    Select * from tab2;
    
    -------+-------+
       k   |   v   |
    -------+-------+
       0   |   20  |
       0   |   30  |
    -------+-------+
    
    Copy

    如果运行以下查询,tab1 中的行将与 tab2 中的两行相联接:

    DELETE FROM tab1 USING tab2 WHERE tab1.k = tab2.k
    
    Copy

    由于至少有一个联接对满足条件,因此将删除该行。因此,语句完成后,tab1 为空。

示例

假设租赁自行车的组织使用下表:

  • 名为 leased_bicycles 的表列出了已出租的自行车。

  • 名为 returned_bicycles 的表列出了最近归还的自行车。这些自行车需要从租赁自行车的表中移除。

创建表:

CREATE TABLE leased_bicycles (bicycle_id INTEGER, customer_id INTEGER);
CREATE TABLE returned_bicycles (bicycle_id INTEGER);
Copy

加载数据:

INSERT INTO leased_bicycles (bicycle_ID, customer_ID) VALUES
    (101, 1111),
    (102, 2222),
    (103, 3333),
    (104, 4444),
    (105, 5555);
INSERT INTO returned_bicycles (bicycle_ID) VALUES
    (102),
    (104);
Copy

此示例显示如何使用 WHERE 子句删除指定的行。此示例按 bicycle_ID 删除:

DELETE FROM leased_bicycles WHERE bicycle_ID = 105;
+------------------------+
| number of rows deleted |
|------------------------|
|                      1 |
+------------------------+
Copy

删除后显示数据:

SELECT * FROM leased_bicycles ORDER BY bicycle_ID;
+------------+-------------+
| BICYCLE_ID | CUSTOMER_ID |
|------------+-------------|
|        101 |        1111 |
|        102 |        2222 |
|        103 |        3333 |
|        104 |        4444 |
+------------+-------------+
Copy

此示例显示如何使用 USING 子句指定要删除的行。此 USING 子句指定 returned_bicycles 表,该表列出了要从 leased_bicycles 表中删除的自行车的 IDs。WHERE 子句将 leased_bicycles 表联接到 returned_bicycles 表,并删除 leased_bicycles 中与 returned_bicycles 中相应行具有相同 bicycle_ID 的行。

BEGIN WORK;
DELETE FROM leased_bicycles 
    USING returned_bicycles
    WHERE leased_bicycles.bicycle_ID = returned_bicycles.bicycle_ID;
TRUNCATE TABLE returned_bicycles;
COMMIT WORK;
Copy

(为了避免将来在不必要或不合适时再次尝试移除相同的行,returned_bicycles 表将作为同一事务的一部分进行截断。)

删除后显示数据:

SELECT * FROM leased_bicycles ORDER BY bicycle_ID;
+------------+-------------+
| BICYCLE_ID | CUSTOMER_ID |
|------------+-------------|
|        101 |        1111 |
|        103 |        3333 |
+------------+-------------+
Copy

现在假设另一辆自行车归还了:

INSERT INTO returned_bicycles (bicycle_ID) VALUES (103);
Copy

以下查询显示了一个 USING 子句,该子句包含一个子查询(而不是一个表),用于指定要从 leased_bicycles 表中移除哪些 bicycle_IDs:

BEGIN WORK;
DELETE FROM leased_bicycles 
    USING (SELECT bicycle_ID AS bicycle_ID FROM returned_bicycles) AS returned
    WHERE leased_bicycles.bicycle_ID = returned.bicycle_ID;
TRUNCATE TABLE returned_bicycles;
COMMIT WORK;
Copy

删除后显示数据:

SELECT * FROM leased_bicycles ORDER BY bicycle_ID;
+------------+-------------+
| BICYCLE_ID | CUSTOMER_ID |
|------------+-------------|
|        101 |        1111 |
+------------+-------------+
Copy
语言: 中文