目录
第一部分:环境准备
创建教学数据库
第二部分:INSERT 语句(添加数据)
2.1 单行插入(完整列)
语法
案例
2.2 单行插入(指定列)
语法
案例
2.3 批量插入
语法
案例
2.4 插入查询结果(INSERT…SELECT)
语法
案例
2.5 INSERT 高级技巧
案例:插入时处理重复键
第三部分:UPDATE 语句(修改数据)
3.1 基本UPDATE
语法
案例:单列更新
3.2 带表达式的更新
案例:成绩调整
3.3 带子查询的更新
案例:根据另一张表更新
3.4 UPDATE 多表联合更新
案例:多表关联更新
第四部分: DELETE 语句(删除数据)
4.1 基本DELETE
语法
案例:条件删除
案例:删除选课记录
4.2 DELETE 带子查询
案例:删除复杂条件
4.3 DELETE 多表删除
案例:关联删除
4.4 限制删除行数(Mysql特有)
第五部分:DELETE vs TRUNCATE vs DROP
详细对比表
案例:演示三者区别
第六部分: 事务控制(ACID)
6.1 事务的基本使用
案例:转账业务(模拟学生换班)
6.2 事务的四大特性
案例:事务回滚演示
6.3 保存点(SAVEPOINT)
第一部分:环境准备
创建教学数据库
— 创建数据库
create database school_db character set utf8mb4 collate utf8mb4_unicode_ci;
use school_db;
— 创建学生表
create table students(
id int primary key auto_increment comment '学号',
name varchar(50) not null comment '姓名',
gender enum('男','女') not null comment '性别',
age int check (age >=0 and age <=120) comment '年龄',
class varchar(20) comment '班级',
score decimal(5,2) comment '总分',
create_time datetime default current_timestamp comment '创建时间'
);
— 创建课程表
create table courses (
id int primary key auto_increment,
course_name varchar(100) not null,
credit int default 2,
teacher varchar(50)
);
— 创建选课记录表
create table enrollments (
id int primary key auto_increment,
student_id int comment '学生ID',
course_id int comment '课程ID',
grade decimal(4,1) comment '成绩',
enroll_date date comment '选课日期',
foreign key (student_id) references students(id),
foreign key (course_id) references courses(id)
);
第二部分:INSERT 语句(添加数据)
2.1 单行插入(完整列)
语法
insert into 表名 values (值1,值2,值3…..);
案例
— 插入一条完整的学生记录(所有字段按顺序)
insert into students values (1,'张三','男',20,'计算机1班',580.50,now());
— 查看结果
select * from students;
2.2 单行插入(指定列)
语法
insert into 表名(列1,列2…) values (值1,值2…)
案例
— 只插入必要字段 自增ID和create_time 自动生成
insert into students (name, gender, age, class, score)
values ('李四', '女', 19, '计算机2班', 592.00);
insert into students (name, gender, age, class, score)
values ('王五', '男', 21, '计算机1班', 543.50);
2.3 批量插入
语法
insert into 表名 (列1, 列2…) values
(值1a, 值2a….),
(值1b, 值2b….),
(值1c, 值2c….);
案例
–一次插入多条课程记录
INSERT INTO courses(course_name,credit,teacher)VALUES
('数据库原理',4,'张教授'),
('数据结构',3,'李教授'),
('操作系统',3,'王教授'),
('计算机网络',2,'赵教授');
–验证
SELECT * FROMcourses;
2.4 插入查询结果(INSERT…SELECT)
语法
insert into 目标表 (列1, 列2…)
select 列1,列2,… from 源表 where 条件
案例
–创建备份表
CREATE TABLE students_backup LIKE students;
–将计算机1班的学生复制到备份表
INSERT INTO students_backup (name,gender,age,class,score) SELECT name,gender,age,class,score
FROM students
WHERE class='计算机1班';
–查看备份表
SELECT * FROM students_backup;
2.5 INSERT 高级技巧
案例:插入时处理重复键
— 先插入一些选课记录
insert into enrollments (student_id, course_id, grade, enroll_date) values
(1, 1, 85.5, '2026-03-01'),
(2, 2, 92.0, '2026-03-02');
— INSERT IGNORE:若主键/唯一键冲突则忽略
insert ignore into enrollments (id, student_id, course_id, grade, enroll_date)
values (1, 1, 1, 90.0, '2026-03-03'); — id = 1 已存在,被忽略
— ON DUPLICATE KEY UPDATE:冲突时执行更新
insert into enrollments (id,student_id,course_id,grade,enroll_date)
values (1,1,1,90.0,'2026-03-03')
on duplicate key update grade = values(grade), enroll_date = values(enroll_date);
— 此时 id = 1的成绩被更新为 90.0
第三部分:UPDATE 语句(修改数据)
3.1 基本UPDATE
语法
update 表名 set 列1 = 新值1, 列2 = 新值2 where 条件;
案例:单列更新
— 将张三的班级改为'计算机3班'
update students set class = '计算机3班' where name = '张三';
— 检查结果
select * from students where name = '张三';
3.2 带表达式的更新
案例:成绩调整
— 所有学生成绩加5分
update students set score = score + 5;
— 计算机1班学生成绩增加 3%
update students
set score = score * (1 + 0.03)
where class = '计算机1班';
3.3 带子查询的更新
案例:根据另一张表更新
— 为 courses 表 增加学生人数列
alter table courses add column student_count int default 0;
— 统计每门课程选课人数并更新
update courses as c
set student_count = (
select count(*)
from enrollments as e
where e.course_id = c.id
);
— 验证
select * from courses;
3.4 UPDATE 多表联合更新
案例:多表关联更新
— 将所有选了'数据库原理'课程的学生,在 students 表中标记(添加字段)
alter table students add column has_db_course tinyint default 0;
— 多表更新
update students as s
join enrollments as e on s.id = e.student_id
join courses as c on e.course_id = c.id
set s.has_db_course = 1
where c.course_name = '数据库原理';
⚠️ UPDATE 安全警告
— ❌ 危险操作:没有where会更新所有行
update students set score = 0; — 所有学生成绩归零
— ✅ 正确做法:更新前先 select 验证
select * from students where class = '计算机1班';
update students set score = score + 5 where class = '计算机1班';
第四部分: DELETE 语句(删除数据)
4.1 基本DELETE
语法
delete from 表名 where 条件;
案例:条件删除
— 删除计算机2班的学生
delete from students where class = '计算机2班';
— 验证
select * from students;
案例:删除选课记录
— 删除成绩低于60分的选课记录
delete from enrollments where grade < 60;
4.2 DELETE 带子查询
案例:删除复杂条件
— 删除没有选任何课程的学生
delete from students
where id not in (select distinct student_id from enrollments);
4.3 DELETE 多表删除
案例:关联删除
— 删除选了'数据库原理'课程的所有选课记录
delete e
from enrollments as e
join courses as c on e.course_id = c.id
where c.course_name = '数据库原理';
— 验证
select * from enrollments;
4.4 限制删除行数(Mysql特有)
— 只删除前 3 条 符合条件的记录
delete from students where class = '计算机1班' limit 3;
⚠️ DELETE 安全警告
— ❌ 极度危险!删除整表所有数据
delete from students; — 所有学生数据被删除!
— ✅ 正确做法:先 select 验证影响范围
select * from students where age > 25; — 先看哪些会被删
delete from students where ahe > 25; — 确认无误再执行
第五部分:DELETE vs TRUNCATE vs DROP
详细对比表

案例:演示三者区别
— 1. DELETE:删除所有记录,自增列从上次继续
DELETE FROM students_backup;
INSERT INTO students_backup (name) VALUES ('测试1'); — id 从上次最大值+1
— 2. TRUNCATE:删除所有记录,自增列重置
TRUNCATE TABLE students_backup;
INSERT INTO students_backup (name) VALUES ('测试2'); — id 从 1 开始
— 3. DROP:彻底删除表结构
DROP TABLE students_backup; — 表不存在了
第六部分: 事务控制(ACID)
6.1 事务的基本使用
案例:转账业务(模拟学生换班)
— 场景:将张三从计算机1班转到计算机3班 需要更新两条记录
start transaction;
— 步骤1:从原班级移除
update students set class = null where name = '张三';
— 步骤2:加入新班级
update students set class = '计算机3班' where name = '张三';
— 检查无误后提交
commit;
— 如果有问题则 ROLLBACK;
6.2 事务的四大特性

案例:事务回滚演示
start transaction;
— 误操作:删除了所有学生
delete from students;
— 发现错误:立即回滚
rollback; — 所有数据恢复
— 再次检查
select * from students; — 数据依然存在
6.3 保存点(SAVEPOINT)
start transaction;
— 执行一些操作
insert into students (name) values ('测试a');
savepoint sp1; — 设置保存点
— 执行可能出错的操作
update students set age = 25 where name = '测试a';
— 发现错误,回到保存点
rollback to savepoint sp1;
— 提交之前的操作('测试a' 被保留)
commit;



