【MySQL 删除数据详解】

文章目录

  • 一、前言
  • [二、MySQL 中的三种删除方式](#二、MySQL 中的三种删除方式)
    • [1. `DELETE` 语句](#1. DELETE 语句)
    • [2. `TRUNCATE` 语句](#2. TRUNCATE 语句)
      • [✅ 基本语法:](#✅ 基本语法:)
      • [🔥 示例:](#🔥 示例:)
    • [3. `DROP` 语句](#3. DROP 语句)
      • [✅ 基本语法:](#✅ 基本语法:)
      • [🔥 示例:](#🔥 示例:)
  • [三、`DELETE` 高级用法](#三、DELETE 高级用法)
    • [1. 使用 `DELETE` 删除多表数据(多表关联删除)](#1. 使用 DELETE 删除多表数据(多表关联删除))
      • [✅ 基本语法:](#✅ 基本语法:)
      • [🔥 示例:](#🔥 示例:)
        • [删除与 `Bob` 相关的订单:](#删除与 Bob 相关的订单:)
    • [2. 使用 `LIMIT` 限制删除条数](#2. 使用 LIMIT 限制删除条数)
      • [✅ 基本语法:](#✅ 基本语法:)
      • [🔥 示例:](#🔥 示例:)
    • [3. 使用 `ORDER BY` 和 `LIMIT`](#3. 使用 ORDER BYLIMIT)
      • [🔥 示例:](#🔥 示例:)
  • [四、`DELETE` 与 `TRUNCATE` 的区别](#四、DELETETRUNCATE 的区别)
  • 五、删除操作的注意事项
  • 六、总结

一、前言

在 MySQL 中,可以使用 DELETETRUNCATEDROP 语句来删除数据。这三者虽然都能达到删除数据的效果,但它们的作用范围、执行效率以及数据恢复能力存在差异。

本文将介绍:

  • DELETETRUNCATEDROP 的用法和区别
  • DELETE 语句的高级用法
  • 删除操作的注意事项和最佳实践

二、MySQL 中的三种删除方式

1. DELETE 语句

DELETE 语句用于删除表中符合条件的数据行,不删除表本身。

✅ 基本语法:

sql 复制代码
DELETE FROM 表名 WHERE 条件;
  • 表名:要操作的表名称。
  • WHERE 条件:指定要删除的记录,省略则删除所有记录。
  • 不加 WHERE 会删除表中所有数据,但表结构仍然保留。

🔥 示例:

假设有以下表 users

sql 复制代码
CREATE TABLE users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50),
    age INT,
    city VARCHAR(50)
);

-- 插入测试数据
INSERT INTO users (name, age, city) VALUES
('Alice', 25, 'Beijing'),
('Bob', 30, 'Shanghai'),
('Charlie', 35, 'Guangzhou');
删除指定行:
sql 复制代码
DELETE FROM users WHERE name = 'Bob';

✅ 结果:删除 name='Bob' 的记录。

删除所有数据:
sql 复制代码
DELETE FROM users;

✅ 结果:清空表中数据,但表结构还在。

删除多行:
sql 复制代码
DELETE FROM users WHERE age > 25;

✅ 结果:删除所有年龄大于 25 岁的用户。


2. TRUNCATE 语句

TRUNCATE 语句用于清空表中的所有数据 ,但不会记录删除操作,效率比 DELETE 更高。

✅ 基本语法:

sql 复制代码
TRUNCATE TABLE 表名;
  • 作用:清空表中的数据,但保留表结构。
  • 效率 :比 DELETE 快,且释放表空间。
  • 自增 ID 重置TRUNCATE 会将 AUTO_INCREMENT 重置为 1。

🔥 示例:

sql 复制代码
TRUNCATE TABLE users;

✅ 结果:

  • 清空表数据。
  • id 自动增长重置为 1。

3. DROP 语句

DROP 语句用于删除表本身,不仅数据被删除,表结构也会消失。

✅ 基本语法:

sql 复制代码
DROP TABLE 表名;
  • 作用:删除表及其数据,无法恢复。
  • 效率:速度快,但不可恢复。

🔥 示例:

sql 复制代码
DROP TABLE users;

✅ 结果:

  • users 被删除,数据和表结构都不存在。

三、DELETE 高级用法

1. 使用 DELETE 删除多表数据(多表关联删除)

在多表关联查询时,可以使用 JOIN 删除多个表中的数据。

✅ 基本语法:

sql 复制代码
DELETE 表别名 FROM 表1 AS 别名1
JOIN 表2 AS 别名2 ON 关联条件
WHERE 条件;

🔥 示例:

假设有以下两张表:

  • orders(订单表)
  • customers(客户表)
sql 复制代码
CREATE TABLE customers (
    customer_id INT PRIMARY KEY,
    name VARCHAR(50)
);

CREATE TABLE orders (
    order_id INT PRIMARY KEY,
    customer_id INT,
    amount DECIMAL(10,2),
    FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);

-- 插入数据
INSERT INTO customers VALUES (1, 'Alice'), (2, 'Bob'), (3, 'Charlie');
INSERT INTO orders VALUES (1, 1, 100.50), (2, 2, 200.75), (3, 3, 300.25);
删除与 Bob 相关的订单:
sql 复制代码
DELETE o FROM orders o
JOIN customers c ON o.customer_id = c.customer_id
WHERE c.name = 'Bob';

✅ 结果:

  • 删除 Bob 相关的订单数据。

2. 使用 LIMIT 限制删除条数

在删除大量数据时,可以使用 LIMIT 限制删除的行数,防止误操作导致大量数据丢失。

✅ 基本语法:

sql 复制代码
DELETE FROM 表名 WHERE 条件 LIMIT N;

🔥 示例:

删除 users 表中的前两条记录:

sql 复制代码
DELETE FROM users ORDER BY id ASC LIMIT 2;

✅ 结果:

  • 仅删除两条数据,防止误删大量数据。

3. 使用 ORDER BYLIMIT

在删除数据时,可以通过 ORDER BYLIMIT 指定删除顺序和数量。

🔥 示例:

删除年龄最大的 2 个用户:

sql 复制代码
DELETE FROM users
ORDER BY age DESC
LIMIT 2;

✅ 结果:

  • 删除年龄最大的两名用户。

四、DELETETRUNCATE 的区别

对比项 DELETE TRUNCATE
数据删除方式 按行删除 整表清空
是否记录日志 记录日志 不记录日志
自增 ID 重置 不重置 重置为 1
删除速度 慢,逐行删除 快,清空整表
是否可回滚 可回滚(开启事务) 不可回滚
触发器是否执行 会触发 不会触发
表空间释放 不释放 释放表空间

五、删除操作的注意事项

  1. 谨慎使用 DELETETRUNCATE

    • TRUNCATE 无法回滚,清空数据前要三思。
    • 在执行删除前,最好使用 SELECT 确认数据范围。
  2. 使用事务防止误操作

    • 在执行大批量删除时,使用事务以便回滚:
    sql 复制代码
    START TRANSACTION;
    DELETE FROM users WHERE age > 30;
    ROLLBACK; -- 撤销操作
    COMMIT;   -- 确认操作
  3. 备份数据

    • 删除操作前,备份重要数据,以防误删。

六、总结

在 MySQL 中,删除数据主要使用以下三种方式:

  • DELETE:按条件删除数据,记录日志,可回滚。
  • TRUNCATE:清空表数据,不记录日志,不可回滚。
  • DROP:删除表及数据,无法恢复。

高级用法:

  • 使用 LIMIT 限制删除条数,防止误删大量数据。
  • 多表关联删除,提高操作灵活性。
  • 使用事务保护数据,防止误删不可恢复。
相关推荐
匹马夕阳32 分钟前
(二十五)安卓开发一个完整的登录页面-支持密码登录和手机验证码登录
android·智能手机
麻花201336 分钟前
sql server分析表大小
数据库
吃饭了呀呀呀40 分钟前
🐳 深度解析:Android 下拉选择控件优化方案——NiceSpinner 实践指南
android·java
MySQL实战1 小时前
基于源码分析 HikariCP 常见参数的具体含义
mysql·连接池
纪元A梦1 小时前
Redis最佳实践——秒杀系统设计详解
数据库·redis·缓存
吃饭了呀呀呀1 小时前
🐳 《Android》 安卓开发教程 - 三级地区联动
android·java·后端
老马啸西风2 小时前
Neo4j GDS-09-neo4j GDS 库中路径搜索算法实现
网络·数据库·算法·云原生·中间件·neo4j·图数据库
_祝你今天愉快2 小时前
深入剖析Java中ThreadLocal原理
android
XY.散人3 小时前
初识Redis · list和hash类型
数据库·redis·哈希算法
Arbori_262153 小时前
Oracle WITH 子句(也称为 公共表表达式,Common Table Expression,CTE)
数据库·oracle