Skip to content

更新和删除

UPDATE / DELETE / TRUNCATE / WHERE 是安全带

插入数据讲了怎么"增",这一章讲怎么"改"和"删"——也是出事最多的两个操作。

UPDATE:修改数据

基本语法

把张三的工资从 8000 改成 10000:

sql
UPDATE users
SET salary = 10000
WHERE name = '张三';

拆开看:

  • UPDATE users — 改哪张表
  • SET salary = 10000 — 哪一列改成什么值
  • WHERE name = '张三'只改张三这一行

跑完验证:

sql
SELECT name, salary FROM users WHERE name = '张三';
-- 张三 | 10000.00 ✅

同时改多列

SET 后面接多个列,逗号隔开:

sql
UPDATE users
SET city = '成都', salary = 12000
WHERE name = '李四';

李四搬到了成都,涨了工资,一条 SQL 搞定。

用表达式更新

SET 右边可以是计算表达式:

sql
-- 所有人涨 10% 工资
UPDATE users
SET salary = salary * 1.1
WHERE city = '北京';

北京 3 人工资全部上调 10%。

更新多行

WHERE 条件匹配多少行就更新多少行:

sql
-- 上海员工的 age 统一加 1
UPDATE users
SET age = age + 1
WHERE city = '上海';
sql
-- 工资低于 8000 的人涨到 8000
UPDATE users
SET salary = 8000
WHERE salary < 8000;

⚠️ 忘了 WHERE 会怎样?

sql
-- 危险!别跑!
UPDATE users
SET salary = 5000;

这条 SQL 没有 WHERE。MySQL 会把整张表所有行的 salary 都改成 5000。

18 个人的工资变成一模一样——而且除非有备份,改不回来

🚨 写 UPDATE 之前,先用同样的 WHERE 跑一遍 SELECT,确认要改的行是对的

sql
SELECT * FROM users WHERE name = '张三';   -- 先看
UPDATE users SET salary = 10000 WHERE name = '张三';  -- 再改

DELETE:删除数据

基本语法

sql
DELETE FROM users
WHERE name = '马十一';

和 UPDATE 一样的模式——DELETE FROM 表名 WHERE 条件

删完那行就没了,SELECT * FROM users WHERE name = '马十一' 返回空。

删除多行

WHERE 匹配多少行就删多少行:

sql
-- 删除所有工资低于 6000 的人
DELETE FROM users
WHERE salary < 6000;

-- 删除 2023 年之前的所有订单
DELETE FROM orders
WHERE order_date < '2024-01-01';

忘了 WHERE 的后果

sql
-- 千万别跑!
DELETE FROM users;

整张表清空,一行不剩。表结构还在,但数据全没了。

🚨 DELETE 的 WHERE 同样要先 SELECT 验证。养成肌肉记忆。

WHERE 是安全带

UPDATE 和 DELETE 的设计是:

| 有 WHERE | 精准修改/删除目标行 | | 无 WHERE | 全表遭殃 |

这不是 MySQL 的设计缺陷——有的时候确实要批量更新或清空整张表。但没想清楚就写,就是事故

一个好习惯

sql
-- 安全三步走:
-- 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 快:

sql
TRUNCATE TABLE users_backup;
DELETE FROM 表TRUNCATE TABLE 表
速度逐行删除,慢直接释放整张表,快
回滚事务中可以回滚不可回滚
自增计数器保留重置为 1
带 WHERE✅ 可以❌ 不可以

💡 清空测试数据用 TRUNCATE,快且重置自增 ID。但数据宝贵时别手快——没有回头路。

UPDATE/DELETE 的进阶用法

用子查询当条件

sql
-- 删除工资低于公司平均工资的人
DELETE FROM users
WHERE salary < (SELECT AVG(salary) FROM users);

用 JOIN 当条件

sql
-- 删除没有订单的用户(子查询方式)
DELETE FROM users
WHERE id NOT IN (SELECT DISTINCT user_id FROM orders);

⚠️ 涉及 JOIN / 子查询的删除要格外小心——先 SELECT 确认,再动手。

小结

增删改中最容易出事的两个操作,核心就一条——先 CHECK 再动手

  1. UPDATE 配 WHERE — 忘了 WHERE 就是全表修改,灾难级别
  2. DELETE 配 WHERE — 同理,忘写 WHERE 整张表清空
  3. TRUNCATE 清空整表 — 比 DELETE 快,但不能回滚、不能加 WHERE
  4. 安全流程三步走SELECT 确认目标行 → 执行修改 → SELECT 再确认结果
  5. 生产环境开了事务再改START TRANSACTION → 确认 → COMMIT,有问题就 ROLLBACK

💡 不是什么高深技术,但每个踩过坑的人都懂:改数据之前多花 3 秒确认,比花 3 小时恢复划算一万倍。

自主练习

  1. 把"孙七"的工资更新为 7500
  2. 把所有"北京"员工的 age 增加 1
  3. 删除 users 表中 age 为 NULL 的行(如果有的话)
  4. 把工资最低的人的工资更新为全公司平均工资(提示:子查询)
  5. 删除 orders 表中 2024 年 1 月之前的订单

别忘了——每次 UPDATE/DELETE 之前,先用同样的 WHERE 跑 SELECT!


评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v2.15.8