MySQL 删除数据语句

一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/

截止目前, 星球 内专栏累计输出 66w+ 字,讲解图 2896+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2300+ 小伙伴加入学习 ,欢迎点击围观

在 MySQL 中,DELETE 语句用于从表中删除已存在的记录。通过 DELETE,我们可以有选择性地删除满足特定条件的数据,或者清空表中的所有记录。删除数据是数据库管理中的常见操作,但应谨慎使用,以避免误删除或数据丢失。

1. 基本语法

DELETE 语句的基本语法如下:

DELETE FROM 表名 
[WHERE 条件];
  • 表名:指定要删除数据的表。
  • WHERE:可选项,用于指定删除条件。若省略 WHERE 条件,将删除表中的所有记录

2. 示例:删除特定行数据

假设有一个员工表 t_employee,我们希望删除员工 ID 为 101 的记录:

DELETE FROM t_employee
WHERE employee_id = 101;

此语句会删除 employee_id101 的员工记录。使用 WHERE 条件可以确保只删除特定的行,避免误删整个表的数据。

3. 删除多行数据

DELETE 语句支持使用条件删除多行记录。假设我们要删除所有职位为 "Java工程师" 的员工记录:

DELETE FROM t_employee
WHERE position = 'Java工程师';

此语句会删除 positionJava工程师 的所有员工记录。

4. 删除所有数据:清空表

使用 DELETE 语句删除所有数据时,可以省略 WHERE 条件,但这种方式会记录删除操作的日志。示例:

DELETE FROM t_employee;

使用 TRUNCATE 清空表

除了 DELETE,也可以使用 TRUNCATE 语句来清空表,它通常比 DELETE 更快,尤其是大表时,但会重置表的自增 ID:

TRUNCATE TABLE t_employee;

注意TRUNCATE 是一个 DDL 操作,无法使用 WHERE 限制条件删除部分数据,因此适合清空整个表的场景。

5. 使用 ORDER BYLIMIT 限制删除行数

在某些情况下,我们只想删除满足条件的部分数据,可以结合 ORDER BYLIMIT 使用。例如,删除薪资最低的 5 位员工:

DELETE FROM t_employee
ORDER BY salary ASC
LIMIT 5;

此语句会删除薪资最低的前 5 名员工记录。

6. 使用 JOIN 删除关联数据

在实际应用中,有时需要删除关联表中的数据。通过 DELETEJOIN 的结合,可以实现多表删除。例如,有两个表 t_employeedepartments,我们希望删除 departments 中部门 ID 为 3 的所有员工:

DELETE e
FROM t_employee AS e
JOIN departments AS d ON e.department_id = d.department_id
WHERE d.department_id = 3;

此语句会删除 department_id3 的所有员工。

7. 使用事务保护删除操作

删除操作不可逆,为避免误删,可以使用事务保护删除操作。在删除前开启事务,如果删除出错或需要撤销,可以通过回滚恢复数据:

START TRANSACTION;

DELETE FROM t_employee
WHERE position = 'Intern';

ROLLBACK;  -- 如果需要撤销删除操作
-- COMMIT; -- 确认无误后提交事务

通过 START TRANSACTIONROLLBACKCOMMIT,可以确保删除操作的安全性。

8. DELETETRUNCATE 的区别

特性DELETETRUNCATE
语句类型DMLDDL
删除范围可以有条件地删除部分数据只能清空整个表
日志记录逐行记录不记录逐行日志
自增列重置不会重置自增 ID会重置自增 ID
是否可回滚支持事务回滚不支持事务回滚
触发器执行时触发触发器不触发任何触发器

9. 小结

在 MySQL 中,删除数据主要使用 DELETETRUNCATE 语句。DELETE 适合条件删除,可以选择性地删除数据,并支持事务操作;TRUNCATE 适合清空整个表,速度更快,但不支持条件删除。通过合理选择删除方式并使用事务保护数据安全,我们可以更高效、可靠地管理数据。