第15周 数据更新(插入、修改、删除)
第15周 · 数据更新(插入、修改、删除)
前面学的 SELECT 只读不改。这周学 DML 三类写操作:INSERT 加数据、UPDATE 改数据、DELETE 删数据。它们能改变数据,所以安全是第一原则。
一、知识点:三类写操作
| 语句 | 作用 |
|---|---|
INSERT |
插入(增加)行 |
UPDATE |
修改(更新)已有行 |
DELETE |
删除行 |
对比:
DROP/TRUNCATE是删"表/结构",这周DELETE只删"行"。
二、操作教程:INSERT 插入数据
-- 指定列插入(推荐:列名明确,顺序不乱)
INSERT INTO student (sname, sage, sdept)
VALUES ('张三', 19, '计算机系');
-- 一次插多行
INSERT INTO student (sname, sage, sdept) VALUES
('李四', 20, '软件工程系'),
('王五', 18, '计算机系');
-- 不写自增列 sid,系统自动生成
列名和数据要一一对应。自增列、有默认值的列可省略。
三、操作教程:INSERT … SELECT 从查询结果插入
把查询结果直接写进另一张表(常用于备份、筛选建表):
-- 建新表 stu_cs,把"计算机系"学生插进去
CREATE TABLE stu_cs (sid INT, sname VARCHAR(20));
INSERT INTO stu_cs (sid, sname)
SELECT sid, sname FROM student WHERE sdept = '计算机系';
INSERT ... SELECT要求后面 SELECT 的列数、顺序、类型与目标表一致。
四、操作教程:UPDATE 修改数据
-- 把 sid=2024001 且 cid=1 的成绩加 5 分
UPDATE sc
SET grade = grade + 5
WHERE sid = 2024001 AND cid = 1;
要点:
- SET 列 = 新值,多个列用逗号:SET a=1, b=2。
- WHERE 指定改哪些行,漏写 WHERE 会改全表所有行(灾难!)。
五、操作教程:DELETE 删除数据
-- 删除 sid=2024002 的所有选课记录
DELETE FROM sc WHERE sid = 2024002;
不带 WHERE 的
DELETE FROM 表会删除整张表所有行,务必谨慎。
六、知识点:DELETE 与 TRUNCATE 的区别
| 对比 | DELETE | TRUNCATE |
|---|---|---|
| 能否带 WHERE | 能(删部分行) | 不能(只能清空整表) |
| 是否可回滚 | 在事务中可回滚 | 一般不可回滚 |
| 触发触发器 | 会 | 不会 |
| 效率 | 逐行删,慢 | 直接重置,快 |
| 自增计数器 | 保留 | 重置为初始值 |
DELETE FROM sc WHERE sid = 2024002; -- 删指定行
TRUNCATE TABLE sc; -- 清空整表(保留结构)
七、安全铁律(务必记住)
- 改/删前先
SELECT确认影响哪些行:把UPDATE/DELETE的WHERE先拿到SELECT跑一遍,看行数对不对。 - 务必带
WHERE:除非你真的要动全表。 - 操作前备份:
CREATE TABLE 备份 AS SELECT * FROM 原表; - 生产环境建议在事务里做(
BEGIN;→ 检查 →COMMIT;/ 出错ROLLBACK;),可后悔。
八、综合实操:作业三题
-- 题1:成绩 +5
UPDATE sc SET grade = grade + 5 WHERE sid = 2024001 AND cid = 1;
-- 题2:删除某生选课
DELETE FROM sc WHERE sid = 2024002;
-- 题3:筛选建表并插入
CREATE TABLE stu_cs (sid INT, sname VARCHAR(20));
INSERT INTO stu_cs (sid, sname)
SELECT sid, sname FROM student WHERE sdept = '计算机系';
九、易混点排查表
| 现象 | 解决方法 |
|---|---|
| 误把全表改了 | UPDATE/DELETE 漏 WHERE;先 SELECT 确认、操作前备份 |
| UPDATE 报语法错 | SET 用单等号 =;多列用逗号分隔 |
| DELETE 和 DROP 混淆 | DELETE 删行、DROP 删表;别用错 |
| INSERT 列数不匹配 | 列名与 VALUES 数量/顺序必须一致 |
| 自增列插不进 | 自增列可省略不写,系统自动生成 |
| TRUNCATE 后自增从头 | TRUNCATE 重置计数器;要保留用 DELETE |
十、小测验(自测)
- 把某学生某门课成绩加 5 分的 UPDATE 怎么写?为什么必须带 WHERE?
DELETE FROM sc WHERE sid=2024002;和TRUNCATE TABLE sc;的区别?INSERT ... SELECT有什么要求(列数/类型)?举例说明用途。- 执行危险 UPDATE/DELETE 前,应该先做什么来防误伤?
【声明】本文由 AI 辅助生成,仅供 MySQL 数据库教学参考,如有疑误以教材为准。
浙公网安备 33010602011771号