📄 一句话概括
UPDATE 改表里已有的记录——一句【改哪列、改成什么、改谁】;忘写 WHERE 会改掉全表,是 SQL 界名场面级事故。
📝 本节和前面几节的关系
SELECT 只看不动;本节第一次【动真格】——1-4 的【更新成本低】(改一处处处对)、2-3 拆表的动机,全部落到这条命令上。
一、UPDATE 的语法骨架
UPDATE 表名
SET 列 = 新值, 列 = 新值, ...
WHERE 条件;
三段含义:
- SET:改哪几列、改成什么(可一次改多列,逗号隔开)
- WHERE:改谁——只有满足条件的行被改
- 没有 WHERE:全表每一行都改——这就是事故
-- 准备块(没建表先跑 3-6 的准备块)
-- 把赵六的分数改成 70
UPDATE students SET score = 70 WHERE id = 4;
-- 一次改两列:王五调班并加分
UPDATE students SET class = 1, score = 88 WHERE id = 3;
二、WHERE 在 UPDATE 里的分量
查询时忘 WHERE 顶多查全表(浪费);UPDATE 忘 WHERE 是真灾难:
-- ⚠️ 危险演示(别在真数据上跑)
UPDATE students SET score = 100; -- 没写 WHERE:全表 5 人全部变 100!
| 写法 | 影响范围 |
|---|---|
UPDATE ... WHERE id = 4; |
1 行 |
UPDATE ... WHERE class = 2; |
该班所有行 |
UPDATE ...;(无 WHERE) |
全表 |
职业习惯:写 UPDATE 先写 WHERE 再回头补 SET;或先用同条件的 SELECT 看一眼【会改到谁】,确认无误再换成 UPDATE。
三、动手 Demo:改一步验一步
-- ① 先看要改谁
SELECT * FROM students WHERE id = 4; -- 赵六 64
-- ② 改
UPDATE students SET score = 70 WHERE id = 4;
-- ③ 再验:64 变 70
SELECT * FROM students WHERE id = 4;
-- ④ 表达式更新:全体加 5 分(有 WHERE 的全表更新,是有意的)
UPDATE students SET score = score + 5 WHERE score IS NOT NULL;
-- ⑤ 改不存在的行:0 行受影响,不报错
UPDATE students SET score = 0 WHERE id = 999;
看到什么算成功:③从 64 变 70;④后除钱七外人人加 5(李四 97);⑤安静通过——UPDATE 改不到行不报错,只【0 行受影响】;改完没变化时先怀疑 WHERE 是不是没对上。
四、30 秒实验
试试用表达式改:UPDATE students SET score = score * 2 WHERE id = 1;——SET 右边能用旧值算新值(85 变 170)。工资普调、全场打折,全靠这一招。
五、常见误区
- "UPDATE 忘 WHERE 只是多改一点" —— 是改全表。真库上发生一次,简历上就有一行【某年某月某事故】。
- "WHERE 条件没对上会报错提醒我" —— 不会,安静地【0 行受影响】;以为改了其实没改,比报错更阴。
- "SET 一次只能改一列" —— 逗号隔开想改几列改几列。
自测三问(点开对答案)
1. UPDATE 的三段各管什么? **表名(在哪改)、SET(改哪列成什么)、WHERE(改谁)**。 2. 忘写 WHERE 的后果? **全表更新**——SQL 界名场面级事故。 3. UPDATE 影响不到任何行时会报错吗? **不会**,静默【0 行受影响】——改完没变化先查 WHERE。- ☐ 下一节(3-12 DELETE-删除记录)
相关笔记
- IN、LIKE、IS NULL-用于查询的符号2-包含值的数据、查询空数据 —— 上一节:本节 WHERE 里照样能用那些符号
- 🗄️ 数据库基础 · 索引 —— 全课路线图