MySQL 系统学习 第二阶段 SQL 第二章:DML(Data Manipulation Language)

一、什么是 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

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

  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 和优化数据库性能的基础。