一、什么是 DML?

DML 全称:

Data Manipulation Language(数据操作语言)

顾名思义:

操作的是表中的数据,而不是表结构。

例如:

student 表:

idnameage
1Tom20
2Jack22

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');

结果:

idnameagegender
1Tom20M
2Lucy18F

为什么不写 id?

因为:


AUTO_INCREMENT

数据库自动生成:


1

2

3

4

所以:

不用自己写。


四、一次插入多条数据

可以一次插入很多条。


INSERT INTO student(name, age, gender)
VALUES
('Jack',21,'M'),
('Rose',19,'F'),
('Mike',23,'M');

结果:

idname
1Tom
2Lucy
3Jack
4Rose
5Mike

企业开发:

推荐:

一次插入多条。

效率更高。


五、UPDATE —— 修改数据

语法:


UPDATE 表名
SET 字段 = 新值
WHERE 条件;

例如:

Tom:

年龄:

20

改成:

21


UPDATE student
SET age = 21
WHERE id = 1;

结果:

idnameage
1Tom21

修改多个字段


UPDATE student
SET
    age = 22,
    gender = 'F'
WHERE id = 2;

六、为什么 UPDATE 一定要写 WHERE?

这是数据库事故最多的地方。

例如:

原来:

idnameage
1Tom20
2Lucy18
3Jack22

如果写:


UPDATE student
SET age = 18;

注意:

没有:


WHERE

结果:

所有人:

idnameage
1Tom18
2Lucy18
3Jack18

全部修改。

生产环境:

可能:

几十万条数据:

一起修改。

很多事故:

都是这样发生。


企业规范

任何:


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;

是错误的。


对比

DELETETRUNCATE
属于 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

本章思考题(建议先自己回答)

  1. 为什么 INSERT 通常不需要插入 AUTO_INCREMENT 字段?
    AUTO_INCREMENT 字段由 MySQL 自动维护,每次插入数据都会生成新的唯一值,因此开发者通常不需要手动指定,既避免了主键冲突,也简化了开发。
  2. 为什么企业开发中 UPDATEDELETE 都强调必须带 WHERE
    因为 UPDATEDELETE 如果没有 WHERE,会作用于整张表,容易造成大量数据被误修改或误删除,因此企业开发要求必须明确更新或删除范围。
  3. DELETE FROM student;TRUNCATE TABLE student; 有哪些相同点和不同点?
    两者都会清空表中的数据,但 DELETE 属于 DML,可以使用 WHERE 删除部分数据;TRUNCATE 属于 DDL,只能清空整张表,执行速度通常更快,并且通常会重置自增值。
  4. 为什么一次插入多条数据通常比循环执行多次 INSERT 更高效?
    一次插入多条数据只需要一次 SQL 解析、一次网络通信和一次执行,而循环执行多次 INSERT 会重复这些开销,因此批量插入效率更高。
  5. 为什么说 ORM 的 save()update()delete() 本质上对应的都是 DML?
    ORM 只是对 SQL 的封装,save() 最终会生成 INSERTUPDATEupdate() 会生成 UPDATEdelete() 会生成 DELETE。数据库真正执行的仍然是 DML,因此学习 SQL 是理解 ORM 和优化数据库性能的基础。
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐