一、什么是 DML?
DML 全称:
Data Manipulation Language(数据操作语言)
顾名思义:
操作的是表中的数据,而不是表结构。
例如:
student 表:
| id | name | age |
|---|---|---|
| 1 | Tom | 20 |
| 2 | Jack | 22 |
DML 操作的是:
Tom
Jack
20
22
而不是:
student
id
name
age
DML 包含三个核心命令
DML
│
├── INSERT(新增)
├── UPDATE(修改)
└── DELETE(删除)
以后工作中几乎每天都会使用它们。
二、准备一张测试表
后面的例子都基于这张表。
CREATE TABLE student (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50),
age INT,
gender CHAR(1)
);
这里你会看到一些新知识:
PRIMARY KEY
AUTO_INCREMENT
这些属于我们第三阶段(表设计)的内容,现在先知道作用即可:
PRIMARY KEY:主键AUTO_INCREMENT:自动递增
例如:
第一次插入:
id = 1
第二次:
id = 2
自动增长。
三、INSERT ------ 新增数据
这是最常用的。
语法:
INSERT INTO 表名(字段1, 字段2, ...)
VALUES (值1, 值2, ...);
例如:
INSERT INTO student(name, age, gender)
VALUES ('Tom', 20, 'M');
再次插入:
INSERT INTO student(name, age, gender)
VALUES ('Lucy', 18, 'F');
结果:
| id | name | age | gender |
|---|---|---|---|
| 1 | Tom | 20 | M |
| 2 | Lucy | 18 | F |
为什么不写 id?
因为:
AUTO_INCREMENT
数据库自动生成:
1
2
3
4
所以:
不用自己写。
四、一次插入多条数据
可以一次插入很多条。
INSERT INTO student(name, age, gender)
VALUES
('Jack',21,'M'),
('Rose',19,'F'),
('Mike',23,'M');
结果:
| id | name |
|---|---|
| 1 | Tom |
| 2 | Lucy |
| 3 | Jack |
| 4 | Rose |
| 5 | Mike |
企业开发:
推荐:
一次插入多条。
效率更高。
五、UPDATE ------ 修改数据
语法:
UPDATE 表名
SET 字段 = 新值
WHERE 条件;
例如:
Tom:
年龄:
20
改成:
21
UPDATE student
SET age = 21
WHERE id = 1;
结果:
| id | name | age |
|---|---|---|
| 1 | Tom | 21 |
修改多个字段
UPDATE student
SET
age = 22,
gender = 'F'
WHERE id = 2;
六、为什么 UPDATE 一定要写 WHERE?
这是数据库事故最多的地方。
例如:
原来:
| id | name | age |
|---|---|---|
| 1 | Tom | 20 |
| 2 | Lucy | 18 |
| 3 | Jack | 22 |
如果写:
UPDATE student
SET age = 18;
注意:
没有:
WHERE
结果:
所有人:
| id | name | age |
|---|---|---|
| 1 | Tom | 18 |
| 2 | Lucy | 18 |
| 3 | Jack | 18 |
全部修改。
生产环境:
可能:
几十万条数据:
一起修改。
很多事故:
都是这样发生。
企业规范
任何:
UPDATE
先写:
WHERE
再写:
SET
养成习惯。
七、DELETE ------ 删除数据
语法:
DELETE FROM 表名
WHERE 条件;
例如:
删除:
id=2
DELETE FROM student
WHERE id = 2;
结果:
Lucy:
删除。
八、为什么 DELETE 一定要写 WHERE?
例如:
DELETE FROM student;
没有:
WHERE。
结果:
整个表:
所有数据:
全部删除。
但是:
表:
还在。
很多新人:
都踩过这个坑。
九、DELETE 和 TRUNCATE 的区别
很多人容易混淆。
假设:
student:
100 万数据。
DELETE
DELETE FROM student;
结果:
数据:
全部删除。
表:
保留。
特点:
- 可以带
WHERE - 可以只删部分数据
例如:
DELETE FROM student
WHERE age < 18;
TRUNCATE
TRUNCATE TABLE student;
特点:
- 一次清空整张表
- 不能带
WHERE - 一般速度更快
- 通常会重置自增值(具体行为与存储引擎和版本有关)
例如:
下面这种写法:
TRUNCATE TABLE student
WHERE id = 1;
是错误的。
对比
| DELETE | TRUNCATE |
|---|---|
| 属于 DML | 属于 DDL |
| 可以 WHERE | 不可以 WHERE |
| 可删除部分数据 | 只能全部清空 |
| 表保留 | 表保留 |
| 通常速度较慢(逐行删除) | 通常速度更快(快速清空) |
十、INSERT、UPDATE、DELETE 总结
| 命令 | 作用 | 是否需要 WHERE |
|---|---|---|
| INSERT | 新增数据 | 不需要 |
| UPDATE | 修改数据 | 建议必须写 |
| DELETE | 删除数据 | 建议必须写 |
十一、实际开发(NestJS)
例如:
用户注册:
await userRepository.save(user);
底层:
INSERT INTO users (...);
修改用户:
await userRepository.update(id, dto);
底层:
UPDATE users
SET ...
WHERE id = ?;
删除:
await userRepository.delete(id);
底层:
DELETE FROM users
WHERE id = ?;
所以:
ORM 只是帮你生成 SQL,真正执行的仍然是 SQL。
本章知识导图
DML
│
├── INSERT
│ ├── 单条插入
│ └── 批量插入
│
├── UPDATE
│ ├── 修改单条
│ ├── 修改多个字段
│ └── WHERE(重点)
│
├── DELETE
│ ├── 删除单条
│ ├── 删除多条
│ └── WHERE(重点)
│
└── DELETE VS TRUNCATE
本章思考题(建议先自己回答)
- 为什么
INSERT通常不需要插入AUTO_INCREMENT字段?
AUTO_INCREMENT字段由 MySQL 自动维护,每次插入数据都会生成新的唯一值,因此开发者通常不需要手动指定,既避免了主键冲突,也简化了开发。 - 为什么企业开发中
UPDATE和DELETE都强调必须带WHERE?
因为UPDATE和DELETE如果没有WHERE,会作用于整张表,容易造成大量数据被误修改或误删除,因此企业开发要求必须明确更新或删除范围。 DELETE FROM student;和TRUNCATE TABLE student;有哪些相同点和不同点?
两者都会清空表中的数据,但DELETE属于 DML,可以使用WHERE删除部分数据;TRUNCATE属于 DDL,只能清空整张表,执行速度通常更快,并且通常会重置自增值。- 为什么一次插入多条数据通常比循环执行多次
INSERT更高效?
一次插入多条数据只需要一次 SQL 解析、一次网络通信和一次执行,而循环执行多次INSERT会重复这些开销,因此批量插入效率更高。 - 为什么说 ORM 的
save()、update()、delete()本质上对应的都是 DML?
ORM 只是对 SQL 的封装,save()最终会生成INSERT或UPDATE,update()会生成UPDATE,delete()会生成DELETE。数据库真正执行的仍然是 DML,因此学习 SQL 是理解 ORM 和优化数据库性能的基础。