语法结构解析
DELETE FROM 表名 [WHERE 条件] [ORDER BY 列] [LIMIT 行数];
逐词解析
DELETE FROM:
DELETE:SQL关键字,表示要执行删除操作FROM:指定要从哪个表中删除数据表名:
指定要删除数据的目标表名称
例如:
employees、orders等表名区分大小写(取决于MySQL服务器配置)
[WHERE 条件]:
可选子句,用于指定删除哪些行的条件
如果不指定WHERE条件,将删除表中的所有行
条件可以使用比较运算符(=, <>, >, <等)和逻辑运算符(AND, OR, NOT)
[ORDER BY 列]:
可选子句,指定删除行的顺序
通常与LIMIT一起使用,控制哪些行先被删除
可以指定ASC(升序,默认)或DESC(降序)
[LIMIT 行数]:
可选子句,限制要删除的最大行数
对于大表删除操作,使用LIMIT可以分批删除
可以指定偏移量:
LIMIT 偏移量, 行数
完整示例
-- 删除特定员工记录 DELETE FROM employees WHERE employee_id = 207; -- 批量删除过期订单(按创建时间排序,每次删除100条) DELETE FROM orders WHERE status = 'expired' AND created_at < DATE_SUB(NOW(), INTERVAL 1 YEAR) ORDER BY created_at LIMIT 100; -- 删除测试用户(无WHERE条件会清空整个表) DELETE FROM test_users;
输出结果:
单行删除输出结果:
Query OK, 1 row affected (0.02 sec)
批量删除输出结果:
Query OK, 100 rows affected (0.15 sec)
清空表输出结果:
Query OK, 3245 rows affected (1.23 sec)
输出结果说明
单行删除:
"1 row affected"表示成功删除了1条记录
执行时间显示为0.02秒
批量删除:
"100 rows affected"表示成功删除了100条过期订单
执行时间显示为0.15秒
全表删除:
"3245 rows affected"表示清空了整个测试用户表
执行时间显示为1.23秒,因数据量较大而耗时较长
示例解析
单行删除示例解析
DELETE FROM employees:指定要从employees表删除数据WHERE employee_id = 207:只删除employee_id等于207的记录执行后:仅删除匹配条件的单行数据
批量删除示例解析
DELETE FROM orders:指定要从orders表删除数据WHERE status = 'expired':只删除状态为'expired'的订单AND created_at < DATE_SUB(NOW(), INTERVAL 1 YEAR):且创建时间超过1年ORDER BY created_at:按创建时间排序(先删除最早的记录)LIMIT 100:每次最多删除100条记录执行后:批量删除符合条件的记录,每次最多100条
清空表示例解析
DELETE FROM test_users:指定要从test_users表删除数据无WHERE条件:删除表中的所有行(相当于清空表)
执行后:test_users表变为空表
关键注意事项
WHERE条件重要性:
没有WHERE条件会删除整个表的所有数据
删除前务必确认WHERE条件的准确性
外键约束:
如果表有外键约束,删除可能被阻止
可以使用
ON DELETE CASCADE自动删除相关记录性能考虑:
大表删除操作可能很耗时
使用LIMIT分批删除可以减少锁表时间
事务处理:
重要删除操作应在事务中进行
可以先SELECT确认要删除的记录
与TRUNCATE区别:
TRUNCATE TABLE更快但不记录日志
DELETE可以带条件,TRUNCATE只能清空整个表
恢复数据:
DELETE操作可以回滚(在事务中)
删除前建议备份重要数据
自增列处理:
DELETE不会重置自增计数器
如需重置,需使用TRUNCATE或ALTER TABLE