目录
[1. alter与update区别](#1. alter与update区别)
[1.1 基本概念](#1.1 基本概念)
[1.2 常见操作](#1.2 常见操作)
[1.3 核心区别比对](#1.3 核心区别比对)
[2. change与modify区别](#2. change与modify区别)
[2.1 常见操作](#2.1 常见操作)
[2.2 功能比对](#2.2 功能比对)
[3. drop、truncate与delete区别](#3. drop、truncate与delete区别)
[3.1 基本概念](#3.1 基本概念)
[3.2 常见操作](#3.2 常见操作)
[3.3 功能比对](#3.3 功能比对)
1. alter与update区别
1.1 基本概念
ALTER 是 DDL(Data Definition Language,数据定义语言)命令,用于修改数据库对象的结构。
UPDATE 是 DML(Data Manipulation Language,数据操作语言)命令,用于修改表中已存在的数据。
1.2 常见操作
ALTER(修改表结构)常见操作
sql
-- 添加新字段
ALTER TABLE users
ADD COLUMN email VARCHAR(100) COMMENT '邮箱';
-- 修改字段类型
ALTER TABLE users
MODIFY COLUMN age SMALLINT;
-- 修改字段名和类型
ALTER TABLE users
CHANGE COLUMN old_name new_name VARCHAR(100);
-- 删除字段
ALTER TABLE users
DROP COLUMN phone;
-- 添加唯一索引
ALTER TABLE users
ADD UNIQUE INDEX uk_phone (phone);
UPDATE(修改表数据)常见操作
sql
--修改字段值
UPDATE users
SET
email = 'newemail@example.com',
phone = '13800138000',
updated_at = NOW()
WHERE id = 1;
-- 使用子查询更新
UPDATE orders o
SET o.total_amount = (
SELECT SUM(quantity * price)
FROM order_items
WHERE order_id = o.id
)
WHERE o.id = 1001;
-- 使用JOIN更新
UPDATE users u
INNER JOIN user_profiles p ON u.id = p.user_id
SET u.nickname = p.display_name
WHERE p.is_verified = 1;
1.3 核心区别比对
| 对比维度 | ALTER | UPDATE |
|---|---|---|
| 作用对象 | 表结构(DDL) | 表数据(DML) |
| 操作类型 | 数据定义语言 | 数据操作语言 |
| 主要用途 | 修改表结构(字段、索引等) | 修改表中的数据 |
| 是否锁表 | 是(会锁表) | 行级锁(InnoDB) |
| 是否可回滚 | 不可回滚 | 可回滚(事务中) |
| 影响范围 | 整个表结构 | 指定的行和列 |
| 执行速度 | 影响整个表结构,较慢 | 只影响指定行,较快 |
| 权限要求 | ALTER权限 | UPDATE权限 |
总结:
| 命令 | 记忆要点 |
|---|---|
| ALTER | 改表结构(字段、索引、表名等) |
| UPDATE | 改表数据(字段值) |
2. change与modify区别
2.1 常见操作
sql
-- 修改字段名
--✅ 必须使用CHANGE
ALTER TABLE users
CHANGE COLUMN email user_email VARCHAR(100);
--修改字段类型
- 方法1:使用MODIFY(推荐,更简洁)
ALTER TABLE users
MODIFY COLUMN age SMALLINT;
-- 方法2:使用CHANGE(也可以,但繁琐)
ALTER TABLE users
CHANGE COLUMN age age SMALLINT;
-- 注意:需要写两次 age,繁琐
2.2 功能比对
| 操作 | CHANGE | MODIFY | RENAME COLUMN (8.0+) |
|---|---|---|---|
| 修改字段名 | ✅ 支持 | ❌ 不支持 | ✅ 支持(最佳) |
| 修改字段类型 | ✅ 支持 | ✅ 支持 | ❌ 不支持 |
| 修改默认值 | ✅ 支持 | ✅ 支持 | ❌ 不支持 |
| 修改注释 | ✅ 支持 | ✅ 支持 | ❌ 不支持 |
| 修改NULL约束 | ✅ 支持 | ✅ 支持 | ❌ 不支持 |
| 修改字段位置 | ✅ 支持 | ✅ 支持 | ❌ 不支持 |
| 同时改名改类型 | ✅ 支持 | ❌ 不支持 | ❌ 不支持 |
核心区别比对:
| 对比维度 | CHANGE | MODIFY |
|---|---|---|
| 主要用途 | 修改字段名 + 类型 | 只修改字段类型/属性 |
| 是否可改名 | ✅ 可以 | ❌ 不可以 |
| 语法复杂度 | 较复杂(需写两次字段名) | 较简单(只写一次) |
| 使用频率 | 需要改名时 | 只改类型时 |
| 易错程度 | 容易写错字段名 | 不易出错 |
总结:MODIFY改类型,CHANGE改名字,选最简单的用!
3. drop、truncate与delete区别
3.1 基本概念
DROP 用于完全删除数据库对象(表、数据库、视图、索引等),包括结构和数据。
TRUNCATE 用于快速删除表中所有数据,保留表结构,重置自增ID。
DELETE 用于删除表中的数据行,但保留表结构。
3.2 常见操作
drop常见操作
sql
-- 删除数据库
DROP DATABASE database_name;
-- 删除表
DROP TABLE table_name;
-- 删除索引
DROP INDEX index_name ON table_name;
truncate常见操作
sql
-- 示例1:清空表
TRUNCATE TABLE logs;
delete常见操作
sql
-- 删除指定行
DELETE FROM table_name WHERE condition;
-- 删除所有行(保留表结构)
DELETE FROM table_name;
-- 基于子查询删除
DELETE FROM orders
WHERE user_id IN (
SELECT id FROM users WHERE status = 0
);
-- 使用JOIN删除
DELETE o FROM orders o
INNER JOIN users u ON o.user_id = u.id
WHERE u.status = 0;
3.3 功能比对
核心功能比对:
| 对比维度 | DROP | DELETE | TRUNCATE |
|---|---|---|---|
| 命令类型 | DDL(数据定义语言) | DML(数据操作语言) | DDL(数据定义语言) |
| 作用对象 | 删除整个表结构+数据 | 删除表中的数据(行) | 删除表中所有数据 |
| 是否保留表结构 | ❌ 不保留 | ✅ 保留 | ✅ 保留 |
| 是否可回滚 | ❌ 不可回滚 | ✅ 可回滚(事务中) | ❌ 不可回滚 |
| 删除速度 | 快 | 慢(逐行删除) | 很快 |
| 自增ID | 删除 | 不重置 | 重置为初始值 |
| 触发器 | 不触发 | 触发DELETE触发器 | 不触发 |
| WHERE条件 | ❌ 不支持 | ✅ 支持 | ❌ 不支持 |
| 释放空间 | 立即释放 | 不立即释放 | 立即释放 |
| 日志记录 | 少量日志 | 记录每行删除 | 少量日志 |
如何选择?
sql
需要删除什么?
│
├─ 删除整个表(结构+数据)
│ └─ 使用 DROP TABLE
│
├─ 清空表中所有数据(保留结构)
│ ├─ 需要重置自增ID?
│ │ ├─ 是 → 使用 TRUNCATE TABLE
│ │ └─ 否 → 使用 DELETE FROM(如需回滚)
│ │
│ └─ 表有外键约束?
│ ├─ 是 → 使用 DELETE FROM
│ └─ 否 → 使用 TRUNCATE TABLE(更快)
│
└─ 删除部分数据(指定条件)
└─ 使用 DELETE FROM ... WHERE
总结:DROP = 删除表(结构+数据) DELETE = 删除数据(保留结构,支持条件) TRUNCATE = 清空数据(保留结构,重置ID)