欢迎光临
我们一直在努力

重新认识 DML:抛开教科书,换个名字看懂增删改查

目录

第一部分:环境准备

创建教学数据库

第二部分: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;

赞(0)
未经允许不得转载:171主机测评 » 重新认识 DML:抛开教科书,换个名字看懂增删改查
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址