更新和删除
UPDATE / DELETE / TRUNCATE / WHERE 是安全带
插入数据讲了怎么"增",这一章讲怎么"改"和"删"——也是出事最多的两个操作。
UPDATE:修改数据
基本语法
把张三的工资从 8000 改成 10000:
UPDATE users
SET salary = 10000
WHERE name = '张三';拆开看:
UPDATE users— 改哪张表SET salary = 10000— 哪一列改成什么值WHERE name = '张三'— 只改张三这一行
跑完验证:
SELECT name, salary FROM users WHERE name = '张三';
-- 张三 | 10000.00 ✅同时改多列
SET 后面接多个列,逗号隔开:
UPDATE users
SET city = '成都', salary = 12000
WHERE name = '李四';李四搬到了成都,涨了工资,一条 SQL 搞定。
用表达式更新
SET 右边可以是计算表达式:
-- 所有人涨 10% 工资
UPDATE users
SET salary = salary * 1.1
WHERE city = '北京';北京 3 人工资全部上调 10%。
更新多行
WHERE 条件匹配多少行就更新多少行:
-- 上海员工的 age 统一加 1
UPDATE users
SET age = age + 1
WHERE city = '上海';-- 工资低于 8000 的人涨到 8000
UPDATE users
SET salary = 8000
WHERE salary < 8000;⚠️ 忘了 WHERE 会怎样?
-- 危险!别跑!
UPDATE users
SET salary = 5000;这条 SQL 没有 WHERE。MySQL 会把整张表所有行的 salary 都改成 5000。
18 个人的工资变成一模一样——而且除非有备份,改不回来。
🚨 写 UPDATE 之前,先用同样的 WHERE 跑一遍 SELECT,确认要改的行是对的:
sqlSELECT * FROM users WHERE name = '张三'; -- 先看 UPDATE users SET salary = 10000 WHERE name = '张三'; -- 再改
DELETE:删除数据
基本语法
DELETE FROM users
WHERE name = '马十一';和 UPDATE 一样的模式——DELETE FROM 表名 WHERE 条件。
删完那行就没了,SELECT * FROM users WHERE name = '马十一' 返回空。
删除多行
WHERE 匹配多少行就删多少行:
-- 删除所有工资低于 6000 的人
DELETE FROM users
WHERE salary < 6000;
-- 删除 2023 年之前的所有订单
DELETE FROM orders
WHERE order_date < '2024-01-01';忘了 WHERE 的后果
-- 千万别跑!
DELETE FROM users;整张表清空,一行不剩。表结构还在,但数据全没了。
🚨 DELETE 的 WHERE 同样要先 SELECT 验证。养成肌肉记忆。
WHERE 是安全带
UPDATE 和 DELETE 的设计是:
| 有 WHERE | 精准修改/删除目标行 | | 无 WHERE | 全表遭殃 |
这不是 MySQL 的设计缺陷——有的时候确实要批量更新或清空整张表。但没想清楚就写,就是事故。
一个好习惯
-- 安全三步走:
-- 1. SELECT 确认范围
SELECT id, name, salary FROM users WHERE salary < 6000;
-- 2. 写 UPDATE/DELETE,WHERE 和刚才 SELECT 一模一样
DELETE FROM users WHERE salary < 6000;
-- 3. 再 SELECT 确认结果
SELECT id, name, salary FROM users WHERE salary < 6000; -- 应返回空三步下来,改的范围心中有数。
TRUNCATE:快速清空整张表
如果你确实要清空整张表,用 TRUNCATE 比 DELETE 快:
TRUNCATE TABLE users_backup;| DELETE FROM 表 | TRUNCATE TABLE 表 | |
|---|---|---|
| 速度 | 逐行删除,慢 | 直接释放整张表,快 |
| 回滚 | 事务中可以回滚 | 不可回滚 |
| 自增计数器 | 保留 | 重置为 1 |
| 带 WHERE | ✅ 可以 | ❌ 不可以 |
💡 清空测试数据用 TRUNCATE,快且重置自增 ID。但数据宝贵时别手快——没有回头路。
UPDATE/DELETE 的进阶用法
用子查询当条件
-- 删除工资低于公司平均工资的人
DELETE FROM users
WHERE salary < (SELECT AVG(salary) FROM users);用 JOIN 当条件
-- 删除没有订单的用户(子查询方式)
DELETE FROM users
WHERE id NOT IN (SELECT DISTINCT user_id FROM orders);⚠️ 涉及 JOIN / 子查询的删除要格外小心——先 SELECT 确认,再动手。
小结
增删改中最容易出事的两个操作,核心就一条——先 CHECK 再动手:
- UPDATE 配 WHERE — 忘了 WHERE 就是全表修改,灾难级别
- DELETE 配 WHERE — 同理,忘写 WHERE 整张表清空
- TRUNCATE 清空整表 — 比 DELETE 快,但不能回滚、不能加 WHERE
- 安全流程三步走 —
SELECT 确认目标行 → 执行修改 → SELECT 再确认结果 - 生产环境开了事务再改 —
START TRANSACTION→ 确认 →COMMIT,有问题就ROLLBACK
💡 不是什么高深技术,但每个踩过坑的人都懂:改数据之前多花 3 秒确认,比花 3 小时恢复划算一万倍。
自主练习
- 把"孙七"的工资更新为 7500
- 把所有"北京"员工的 age 增加 1
- 删除
users表中 age 为 NULL 的行(如果有的话) - 把工资最低的人的工资更新为全公司平均工资(提示:子查询)
- 删除 orders 表中 2024 年 1 月之前的订单
别忘了——每次 UPDATE/DELETE 之前,先用同样的 WHERE 跑 SELECT!