DELETE¶
从表中移除行。您可以使用 WHERE 子句来指定应移除哪些行。如果需要使用子查询或附加表来标识要移除的行,请在 USING 子句中指定子查询或表。
重要
与 TRUNCATE TABLE 不同,此命令 不会 删除外部文件加载历史记录。如果从暂存文件中删除加载到表中的行,则无法再次从该文件加载数据,除非修改该文件并再次暂存。
语法¶
DELETE FROM <table_name>
[ USING <additional_table_or_query> [, <additional_table_or_query> ] ]
[ WHERE <condition> ]
必填参数¶
table_name
指定要从中移除行的表。
可选参数¶
USING additional_table_or_query [, ... ]
如果需要在 WHERE 子句中引用其他表来帮助确定要移除的行,请在 USING 子句中指定这些表的名称。还可以使用 USING 子句指定标识要移除的行的子查询。
如果指定子查询,则将子查询放在括号中。
如果指定多个表或查询,请使用逗号分隔它们。
WHERE condition
指定用于选择要移除的行的条件。如果省略此参数,则将移除表中的所有行,但保留该表。
使用说明¶
当基于 JOIN(通过指定
USING
子句)进行删除时,目标表中的一行可能会与USING
表中的多行联接。如果任何联接组合都满足 DELETE 条件,则删除目标行。例如,给定带有列
(k number, v number)
的表tab1
和tab2
:select * from tab1; -------+-------+ k | v | -------+-------+ 0 | 10 | -------+-------+ Select * from tab2; -------+-------+ k | v | -------+-------+ 0 | 20 | 0 | 30 | -------+-------+
如果运行以下查询,
tab1
中的行将与tab2
中的两行相联接:DELETE FROM tab1 USING tab2 WHERE tab1.k = tab2.k
由于至少有一个联接对满足条件,因此将删除该行。因此,语句完成后,
tab1
为空。
示例¶
假设租赁自行车的组织使用下表:
名为 leased_bicycles 的表列出了已出租的自行车。
名为 returned_bicycles 的表列出了最近归还的自行车。这些自行车需要从租赁自行车的表中移除。
创建表:
CREATE TABLE leased_bicycles (bicycle_id INTEGER, customer_id INTEGER); CREATE TABLE returned_bicycles (bicycle_id INTEGER);
加载数据:
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);
此示例显示如何使用 WHERE
子句删除指定的行。此示例按 bicycle_ID 删除:
DELETE FROM leased_bicycles WHERE bicycle_ID = 105; +------------------------+ | number of rows deleted | |------------------------| | 1 | +------------------------+
删除后显示数据:
SELECT * FROM leased_bicycles ORDER BY bicycle_ID; +------------+-------------+ | BICYCLE_ID | CUSTOMER_ID | |------------+-------------| | 101 | 1111 | | 102 | 2222 | | 103 | 3333 | | 104 | 4444 | +------------+-------------+
此示例显示如何使用 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;
(为了避免将来在不必要或不合适时再次尝试移除相同的行,returned_bicycles 表将作为同一事务的一部分进行截断。)
删除后显示数据:
SELECT * FROM leased_bicycles ORDER BY bicycle_ID; +------------+-------------+ | BICYCLE_ID | CUSTOMER_ID | |------------+-------------| | 101 | 1111 | | 103 | 3333 | +------------+-------------+
现在假设另一辆自行车归还了:
INSERT INTO returned_bicycles (bicycle_ID) VALUES (103);
以下查询显示了一个 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;
删除后显示数据:
SELECT * FROM leased_bicycles ORDER BY bicycle_ID; +------------+-------------+ | BICYCLE_ID | CUSTOMER_ID | |------------+-------------| | 101 | 1111 | +------------+-------------+