--- title: "09-数据修改(改)" created: 2025-11-25 tags: - 项目筑基 --- # 数据修改(改) ### 修改指定数据 修改徐强老师的性别 ```sql UPDATE 教师 SET 性别='女' WHERE 编号='T013' ``` 可见 不一定要指定主键才能修改 指定列名就行了 where 列名=‘’ ```sql UPDATE 教师 SET 性别='男' WHERE 姓名='徐强' ``` 无论是用编号标识还是用姓名标识 where中的内容只要能确定该条记录就可 ### 对一组数据进行有规律的修改 ```sql UPDATE 选课成绩 SET 成绩=成绩*0.9 SELECT * FROM 选课成绩 ``` ### 挑选某些数据进行修改 更新学院电话 where后面是判断 前面是执行要求 把长度小于等于8的学院电话前面加上027 ```sql UPDATE 学院 SET 学院电话='027-'+学院电话 WHERE LEN(学院电话)<=8 ``` ### 补充:只改前几条 MySQL里update也能配order by和limit 比如把最早注册的三个用户激活 ```sql UPDATE 用户 SET 状态='已激活' ORDER BY 注册时间 ASC LIMIT 3 ``` 这条没写where limit控住了数量 但实际干活还是建议where加上条件 双保险 ### 补充:跨表改 JOIN更新 要改的依据在另一张表里怎么办 比如把选了"数据库"这门课的所有人成绩打9折 课程名在课程表 成绩在选课成绩表 两张表这就得连接着改 ```sql UPDATE 选课成绩 c JOIN 课程 k ON c.课程编号=k.编号 SET c.成绩=c.成绩*0.9 WHERE k.课程名='数据库' ``` UPDATE后面直接跟JOIN ON里写连接条件 SET里指名改哪张表的列 多表联动修改全靠这一手 ### 补充:批量打等级 CASE WHEN 按分数段一次性把等级列全填好 不用一行一行update ```sql UPDATE 选课成绩 SET 等级= CASE WHEN 成绩>=90 THEN '优秀' WHEN 成绩>=80 THEN '良好' WHEN 成绩>=60 THEN '及格' ELSE '不及格' END ``` CASE WHEN扫一遍表 每行按自己的成绩对号入座 一条语句全表等级齐活 ### 血泪教训 改数据之前 先拿同样的WHERE条件跑一遍SELECT 看看圈中的到底是不是要改的那几行 确认了再把SELECT换成UPDATE 手滑的成本天差地别 最容易出的事故就是UPDATE忘写WHERE 一回车全表都改了 (真手滑了立刻停 别提交事务 想办法用备份或者binlog往回捞) --- ⬅️ [[08-数据删除(删)|08-数据删除(删)]] 🏠 [[00-数据库|00-数据库]] ➡️ [[10-关系代数与单表查询|10-关系代数与单表查询]]