目录

  1. DELETE 语句概述
  2. DELETE 语句的基本语法
  3. 使用 WHERE 条件删除数据
  4. 删除所有数据(TRUNCATE 与 DELETE 的区别)
  5. 使用 JOIN 进行删除
  6. DELETE 语句的注意事项
  7. 参考资料

DELETE 语句概述

DELETE 语句用于从 MySQL 数据表中删除一条或多条记录。通常,DELETE 语句会与 WHERE 子句结合使用,以确保只删除满足特定条件的数据。如果省略 WHERE,则表中的所有记录都会被删除(谨慎使用)。


DELETE 语句的基本语法

语法格式

DELETE FROM table_name WHERE condition;

  • table_name:要删除数据的表名。
  • WHERE condition:指定需要删除的记录条件。如果省略 WHERE,则会删除表中的所有行。

示例:删除单条记录

删除 employees 表中 id = 101 的记录:

DELETE FROM employees WHERE id = 101;

示例:删除多条记录

删除 departmentHR 的所有员工:

DELETE FROM employees WHERE department = 'HR';


使用 WHERE 条件删除数据

DELETE 语句通常需要 WHERE 子句来限定删除范围,防止误删数据。

按多个条件删除数据

删除 IT 部门且工作经验小于 2 年的员工:

DELETE FROM employees
WHERE department = 'IT' AND experience < 2;

删除包含 NULL 值的记录

删除 email 为空的用户:

DELETE FROM users
WHERE email IS NULL;


删除所有数据(TRUNCATE 与 DELETE 的区别)

如果需要清空整个表的所有数据,有两种方法:

  1. 使用 DELETE 但不加 WHEREDELETE FROM employees;
    • 特点:删除所有数据,但不会重置 AUTO_INCREMENT 计数器。
  2. 使用 TRUNCATE TABLETRUNCATE TABLE employees;
    • 特点
      • 执行速度更快,适用于清空表数据的情况。
      • 会重置 AUTO_INCREMENT 计数器
      • 不能使用 WHERE 条件,必须删除整个表的数据。

DELETE vs TRUNCATE

特性DELETETRUNCATE
能否使用 WHERE✅ 是❌ 否
影响事务回滚✅ 可以回滚❌ 不能回滚
AUTO_INCREMENT 复位❌ 否✅ 是
触发器(Triggers)✅ 触发❌ 不触发
执行速度⏳ 慢(逐行删除)🚀 快(直接清空)

结论

  • 如果需要条件删除数据,使用 DELETE
  • 如果要清空整个表数据并重置 ID,使用 TRUNCATE

使用 JOIN 进行删除

在某些情况下,我们需要基于另一个表的条件来删除数据,可以使用 DELETE 结合 JOIN

示例:使用 INNER JOIN 删除数据

假设 orders 表存储了客户订单,我们想要删除所有没有下过订单的用户:

DELETE users FROM users
LEFT JOIN orders ON users.id = orders.user_id
WHERE orders.user_id IS NULL;

解释

  • LEFT JOIN 用于查找 orders 表中没有匹配订单的 users 记录。
  • WHERE orders.user_id IS NULL 过滤出没有订单的用户。
  • DELETE users FROM users 只删除 users 表中的数据,而不影响 orders 表。

DELETE 语句的注意事项

  1. 始终使用 WHERE 限定删除范围
    • 如果 DELETE 语句没有 WHERE,会删除表中的所有数据: DELETE FROM employees; -- 慎用!
    • 最好先用 SELECT 预览要删除的数据: SELECT * FROM employees WHERE department = 'HR'; DELETE FROM employees WHERE department = 'HR';
  2. 使用 LIMIT 限制删除数量
    • 为了避免误删过多数据,可以使用 LIMIT 限制删除行数: DELETE FROM employees WHERE department = 'IT' LIMIT 5;
    • 这在批量删除时很有用,特别是对于大表数据。
  3. 启用事务以防误删(适用于 InnoDB)
    • 如果使用的是 InnoDB 存储引擎,可以在删除前启用事务: START TRANSACTION; DELETE FROM employees WHERE id = 105; ROLLBACK; -- 撤销删除 COMMIT; -- 确认删除
    • 这样可以在 ROLLBACK 之前恢复数据,防止误删。
  4. 删除大量数据时注意性能
    • 在大数据表中执行 DELETE 操作可能会导致锁表和性能问题。建议:
      • 使用 LIMIT 进行分批删除。
      • 使用 PARTITION(分区表)优化查询和删除性能。

参考资料


如果你有更多关于 DELETE 语句的需求或问题,请随时告诉我!