🍃
🌿
🍀
第5章 · 5.3 数据表中数据的操纵

INSERT · UPDATE · DELETE

学会往表里"添数据、改数据、删数据"——数据操纵三剑客

1

向数据表中添加数据(INSERT)

💡 通俗理解
CREATE TABLE 是"盖好了一栋空楼",INSERT 就是"往楼里搬入住户"。
你可以一次搬入一户,也可以一次搬入多户,还可以只填部分信息(比如先登记姓名和房号,电话以后再补)。
📥 插入一行完整记录
INSERT INTO <表名> [(<字段名1>, <字段名2>, ...)] VALUES (<值1>, <值2>, ...);
INSERT INTO s(sno, sn, sex, age, maj, dept) VALUES('s9', '郑冬', '女', 21, '计算机', '信息学院');

执行前:学生表 s

snosnsexage
s1张三20
s2李四21
s3王五19

执行后:学生表 s

snosnsexage
s1张三20
s2李四21
s3王五19
s9郑冬21
!
各数据之间用逗号分隔,字符型日期型数据要用单引号括起来,数字不需要。
i
如果 INTO 子句中没有指定字段名,则必须按照表定义的字段顺序给每个字段都赋值
📋 插入部分数据值

只给部分字段赋值,未出现的字段自动填 NULL

INSERT INTO sc(sno, cno) VALUES('s7', 'c1');

执行结果:sc 表中新增一行

snocnoscore
s1c185.00
s1c292.00
s7c1NULL
⚠️ 注意
如果某字段定义了 NOT NULL 约束,插入时就必须给它赋值,否则会报错。只有允许 NULL 的字段才能省略。
📦 一次插入多行记录
INSERT INTO <表名> [(<字段名>, ...)] VALUES (<值列表1>), (<值列表2>), (<值列表3>);
INSERT INTO sc(sno, cno) VALUES ('s8', 'c1'), ('s8', 'c2'), ('s8', 'c5');
多行插入比写三条 INSERT 效率更高——一条语句搞定,数据库只需提交一次。
🔄 INSERT 和 REPLACE 的区别
💡 通俗理解
INSERT 像"排队入住"——如果房间已有人(主键/UNIQUE 重复),就拒绝入住
REPLACE 像"强制入住"——如果房间已有人,就先把旧住户赶走,再让新住户住进去
对比项INSERTREPLACE
主键 / UNIQUE 冲突时 ❌ 报错,插入失败 🔄 先删除旧记录,再插入新记录
无冲突时 正常插入 正常插入(和 INSERT 一样)
使用场景 一般情况下用这个 需要"有则覆盖,无则插入"时
-- 如果 s9 已存在,先删除旧记录,再插入新记录 REPLACE INTO s(sno, sn, sex, age, maj, dept) VALUES('s9', '郑冬冬', '女', 22, '软件工程', '信息学院');
2

修改数据表中数据(UPDATE)

💡 通俗理解
INSERT 是"搬新人进来",UPDATE 是"给已有住户换房间信息"——改名字、改电话号码、改地址等。
你可以只改一个人的信息(加 WHERE 条件),也可以批量修改所有人(不加 WHERE)。
UPDATE <表名> SET <字段名> = <表达式> [, <字段名> = <表达式> ...] [WHERE <条件>];
🎯 修改一行记录(带 WHERE)

示例:把刘杨老师转到工学院

UPDATE t SET dept = '工学院' WHERE tn = '刘杨';

执行前:教师表 t

tnotndept
t1王强信息学院
t2刘杨信息学院
t3张明工学院

执行后:教师表 t

tnotndept
t1王强信息学院
t2刘杨工学院
t3张明工学院
📢 修改多行记录(不加 WHERE = 全部修改)

示例:把所有学生的年龄增加 1 岁

UPDATE s SET age = age + 1;

执行前

snosnage
s1张三20
s2李四21
s3王五19

执行后(全部 +1)

snosnage
s1张三21
s2李四22
s3王五20
⚠️ 危险操作
不写 WHERE 会修改表中所有行!执行前一定要确认是否真的需要批量修改。在生产环境中,建议先用 SELECT ... WHERE 预览影响范围,再执行 UPDATE。
SET 子句可以用表达式,如 age = age + 1score = score * 0.9,非常灵活。
i
可以一次修改多个字段SET dept='工学院', age=30,字段之间用逗号分隔。
3

删除数据表中数据(DELETE)

💡 通俗理解
DELETE 是把住户"请出去"——可以指定"把 302 房间的住户请走"(加 WHERE),也可以"清空整栋楼"(不加 WHERE)。
注意:DELETE 只是搬走住户(删数据),楼还在(表结构不变)。要拆楼得用 DROP TABLE。
DELETE FROM <表名> [WHERE <条件>];
🎯 删除满足条件的记录

示例:删除成绩为 90.5 分的记录

DELETE FROM sc WHERE score = 90.5;

执行前:sc 表

snocnoscore
s1c185.00
s1c290.50
s2c178.00
s3c390.50

执行后:两条 90.5 被删除

snocnoscore
s1c185.00
s1c290.50
s2c178.00
s3c390.50
!
WHERE 条件可能匹配多行!上面的例子中有 2 条记录的 score 都是 90.5,全部会被删除。
💣 删除全部数据(不加 WHERE)

示例:删除所有教师的授课记录

DELETE FROM tc;
⚠️ 极度危险
不写 WHERE 会删除表中所有数据!执行后表变成空表(结构还在,但数据全没了)。
在生产环境中,执行 DELETE 前务必先备份或先用 SELECT 确认影响范围。
i
DELETE FROM tcTRUNCATE TABLE tc 都能清空数据,区别是 DELETE 可以回滚,TRUNCATE 不行但速度更快。
🔗 外键对删除的影响

如果被删除的记录被其他表的外键引用,删除可能会失败。

-- s1 在选课表 sc 中有选课记录 DELETE FROM s WHERE sno = 's1'; -- ❌ ERROR 1451 -- Cannot delete or update a parent row: -- a foreign key constraint fails -- 翻译:不能删!sc 表的外键还在引用这条记录!

正确做法:先删从表中引用的记录,再删主表中的记录。

-- 第一步:先删除 sc 中关于 s1 的选课记录 DELETE FROM sc WHERE sno = 's1'; -- 第二步:再删除学生表中的 s1 DELETE FROM s WHERE sno = 's1'; -- ✅ 成功!先解除引用,再删除本体
如果外键定义了 ON DELETE CASCADE,则删除主表记录时会自动删除从表中引用它的记录,无需手动操作。

命令全景对比——数据操纵三剑客

💡 回顾整体
数据操纵(DML)只做三件事:。对应三条命令:INSERT、UPDATE、DELETE。它们只操作数据,不碰表结构
INSERT
添加新数据
✏️
UPDATE
修改已有数据
🗑️
DELETE
删除数据

三条命令速查对比

命令功能语法骨架WHERE 的作用
INSERT 添加新行 INSERT INTO 表 (字段) VALUES (值) 不适用(INSERT 没有 WHERE)
UPDATE 修改已有行 UPDATE 表 SET 字段=值 WHERE 条件 不加 = 改全部行;加了 = 改指定行
DELETE 删除行 DELETE FROM 表 WHERE 条件 不加 = 删全部行;加了 = 删指定行

"我想做 X,该用哪条命令?"

我想做什么用哪条命令示例
往表里添加一条新记录 INSERT INTO ... VALUES INSERT INTO s VALUES(...)
一次添加多条记录 INSERT INTO ... VALUES (),(),() VALUES ('s8','c1'), ('s8','c2')
如果存在就覆盖,不存在就新增 REPLACE INTO REPLACE INTO s VALUES(...)
修改某个学生的专业 UPDATE ... SET ... WHERE UPDATE s SET maj='软件' WHERE sno='s1'
所有学生年龄+1 UPDATE ... SET(不加 WHERE) UPDATE s SET age=age+1
删掉某条选课记录 DELETE FROM ... WHERE DELETE FROM sc WHERE sno='s1' AND cno='c2'
清空一张表的所有数据 DELETE FROM(不加 WHERE)
TRUNCATE TABLE
DELETE FROM tc;

DDL vs DML——别搞混了!

分类全称操作对象包含命令一句话
DDL 数据定义语言 表结构(表本身) CREATE / ALTER / DROP 盖楼、改楼、拆楼
DML 数据操纵语言 表中数据(表里的行) INSERT / UPDATE / DELETE 搬入住户、改住户信息、搬走住户
记忆口诀:DDL 管"楼"(表结构),DML 管"人"(表数据)。增用 INSERT,改用 UPDATE,删用 DELETE。UPDATE 和 DELETE 不加 WHERE 就是全部操作——务必小心!