DELETE
从指定表中删除一行或多行数据。支持通过 WHERE 子句精确筛选目标行,也支持子查询作为删除条件。
语法
DELETE FROM table_name
[WHERE condition]
参数说明
| 参数 | 类型 | 是否必填 | 说明 |
|---|
table_name
table_name | 标识符 | 必填 | 要删除数据的目标表名,可带 schema 前缀,如 schema_name.table_name
schema_name.table_name |
WHERE condition
WHERE condition | 表达式 | 可选 | 筛选条件,支持比较运算符、逻辑运算符、子查询等。省略时删除表中全部行 |
使用示例
示例 1:按条件删除行
删除
doc_test.products
doc_test.products
表中
category
category
为
'Furniture'
'Furniture'
的所有产品:
DELETE FROM doc_test.products
WHERE category = 'Furniture';
执行后查询验证:
SELECT * FROM doc_test.products;
product_id | name | price | stock | category
-----------+--------+---------+-------+------------
1 | Laptop | 5999.00 | 50 | Electronics
2 | Phone | 2999.00 | 120 | Electronics
5 | Tablet | 3499.00 | 60 | Electronics
原有 2 条 Furniture 记录(Desk、Chair)已被删除,剩余 3 条 Electronics 记录。
示例 2:使用子查询作为删除条件
删除
doc_test.employees
doc_test.employees
表中所有
is_active = false
is_active = false
的员工:
DELETE FROM doc_test.employees
WHERE id IN (
SELECT id FROM doc_test.employees WHERE is_active = false
);
执行后查询验证:
SELECT * FROM doc_test.employees;
id | name | dept | salary | hire_date | is_active
---+---------+-------------+----------+------------+----------
1 | Alice | Engineering | 12000.00 | 2021-03-15 | true
2 | Bob | Marketing | 8500.00 | 2020-07-01 | true
3 | Charlie | Engineering | 11000.00 | 2022-01-10 | true
5 | Eve | Marketing | 9000.00 | 2023-05-08 | true
is_active = false
is_active = false
的员工 Diana(id=4)已被删除。
示例 3:删除表中全部行
省略 WHERE 子句会删除表中所有行,效果等同于清空表。实际执行时建议使用
WHERE 1=1
WHERE 1=1
明确表达意图(部分客户端工具会对无 WHERE 的 DELETE 发出警告或拒绝执行):
DELETE FROM doc_test.products WHERE 1=1;
执行后查询验证:
SELECT COUNT(*) AS row_count FROM doc_test.products;
row_count
---------
0
表中所有行已被删除,表结构保留。
DELETE 与 TRUNCATE 的区别
| 对比项 | DELETE | TRUNCATE |
|---|
| 语法 | DELETE FROM table [WHERE ...]
DELETE FROM table [WHERE ...] | TRUNCATE TABLE table
TRUNCATE TABLE table |
| 是否支持 WHERE 条件 | 支持,可精确筛选 | 不支持,始终清空全表 |
| 操作粒度 | 逐行删除 | 整表清空 |
| 典型场景 | 按条件删除部分行 | 快速清空整张表 |
如果目的是清空整张表,优先使用
TRUNCATE TABLE
TRUNCATE TABLE
,语义更明确。
注意事项
- WHERE 子句非必填,但省略会删除表中全部行,执行前务必确认条件正确。
- DELETE 操作不可逆,建议在执行前先用
SELECT
SELECT
语句验证 WHERE 条件筛选出的行是否符合预期。
- 执行 DELETE 需要对目标表拥有 DELETE 权限。
- 支持子查询作为 WHERE 条件,子查询可引用其他表。
- 部分客户端工具(如 cz-cli)对无 WHERE 的 DELETE 有安全拦截,需使用
WHERE 1=1
WHERE 1=1
或相应参数绕过。
相关指南
- 数据更新与清理:UPDATE/DELETE 的典型场景、条件过滤、级联清理等使用模式
- SQL DML使用指南:INSERT/UPDATE/DELETE/MERGE 的注意事项与最佳实践