MySQL DML 语句定义及常见用法示例
本文介绍 MySQL DML 语句的核心定义与用法。涵盖 INSERT 插入数据、UPDATE 更新记录、DELETE 删除记录及 SELECT 查询数据的语法与示例。重点讲解了 WHERE 条件的重要性、批量操作技巧、模糊查询、排序分页及聚合函数。此外还阐述了 DML 与事务的关系,包括开启提交回滚机制,以及 Java Spring 中的事务控制实践。最后总结了 SQL 语句的执行顺序,帮助开发者掌握高效的数据操作与面试考点。

本文介绍 MySQL DML 语句的核心定义与用法。涵盖 INSERT 插入数据、UPDATE 更新记录、DELETE 删除记录及 SELECT 查询数据的语法与示例。重点讲解了 WHERE 条件的重要性、批量操作技巧、模糊查询、排序分页及聚合函数。此外还阐述了 DML 与事务的关系,包括开启提交回滚机制,以及 Java Spring 中的事务控制实践。最后总结了 SQL 语句的执行顺序,帮助开发者掌握高效的数据操作与面试考点。

在掌握了数据库和表的'创建、修改、删除'等结构定义操作(DDL)后,我们进入更核心的学习——DML 语句。它是操作'容器'中数据的关键,学会 DML,你才能真正实现数据的增、删、改、查。
DML 的全称是 Data Manipulation Language(数据操作语言)。它与 DDL 的核心区别在于:DDL 操作的是'数据库对象的结构',而 DML 操作的是'表中的数据',不改变表的结构本身。
简单来说,DDL 是'建房子',DML 就是'住人、装修'。在 MySQL 中,DML 语句的核心作用是对表中的数据进行增、删、改、查。
这里有一个新手容易混淆的知识点:严格来说,'查询数据'的 SELECT 语句属于 DQL(Data Query Language),但在很多书籍、教程以及面试中,SELECT 语句通常会被包含在 DML 的范畴中,本文统一按这个习惯讲解。
常见的 DML 操作及对应 SQL 语句如下:
| 操作类型 | SQL 语句 | 说明 |
|---|---|---|
| 插入数据 | INSERT | 向表中新增一条或多条数据记录 |
| 更新数据 | UPDATE | 修改表中已存在的数据记录 |
| 删除数据 | DELETE | 删除表中已有的数据记录 |
| 查询数据 | SELECT | 检索表中的数据(严格来说属于 DQL) |
注意:DML 语句执行后不会自动提交事务(可回滚),而 DDL 语句会自动提交事务(不可回滚)。
INSERT 语句是向表中添加新数据的核心语句。
最规范、最推荐的插入语法,明确指定要插入的列名和对应的值:
-- 基本语法:INSERT INTO 表名 (列 1, 列 2, ...) VALUES (值 1, 值 2, ...);
-- 注意:列名和值的顺序必须一一对应,数据类型也要匹配
以上一章创建的'学生表(student)'为例:
-- 先创建 student 表 CREATE TABLE IF NOT EXISTS student (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
age INT CHECK(age >= 0),
major VARCHAR(100) NOT NULL
);
-- 插入一条学生数据
INSERT INTO student (id, name, age, major) VALUES (1, '张三', 20, '计算机科学');
-- 验证插入结果
SELECT * FROM student;
注意:如果表的主键设置了 AUTO_INCREMENT,插入时可以不指定 id 列,MySQL 会自动生成递增的主键值。
如果需要插入多条数据,可在 VALUES 后拼接多个值列表,执行效率更高:
INSERT INTO student (name, age, major) VALUES
('李四', 21, '软件工程'),
('王五', 19, '人工智能'),
('赵六', 22, '网络工程');
✅ 优势:减少与数据库的交互次数,提升插入效率。
如果要给表中的所有字段都插入值,可以省略列名,但这种方式不推荐,因为一旦表结构发生变更,插入语句就会报错:
-- 不推荐:省略列名,必须按表中字段的顺序插入所有值
INSERT INTO student VALUES (5, '孙七', 20, '信息安全');
⚠️ 警告:日常开发中,尽量不要省略列名,避免因表结构变更导致插入失败。
UPDATE 语句用于修改表中已存在的数据,忘记写 WHERE 条件,会导致整张表的数据被修改,造成不可逆的损失。
-- 基本语法:UPDATE 表名 SET 列 1 = 值 1, ... WHERE 条件;
-- 核心:WHERE 条件用于指定要修改的记录,缺一不可!
修改 student 表中'张三'的年龄和专业:
UPDATE student SET age = 22, major = '大数据技术' WHERE name = '张三';
SELECT name, age, major FROM student WHERE name = '张三';
实际开发中,常常需要根据多个条件筛选要修改的记录,可使用 AND、OR 等逻辑运算符:
-- 修改年龄大于 20 且专业为计算机科学的学生
UPDATE student SET major = '人工智能' WHERE age > 20 AND major = '计算机科学';
⚠️ 绝对禁止:在没有 WHERE 条件的情况下执行 UPDATE 语句!会修改表中所有记录。
✅ 建议:执行 UPDATE 语句前,先执行对应的 SELECT 语句,验证筛选的记录是否正确。
DELETE 语句用于删除表中已存在的记录,忘记写 WHERE 条件会删除表中所有数据。
-- 基本语法:DELETE FROM 表名 WHERE 条件;
删除 student 表中 id 为 3 的学生记录:
DELETE FROM student WHERE id = 3;
如果确实需要删除表中所有数据,可省略 WHERE 条件,但一定要确认无误后再执行:
DELETE FROM student;
TRUNCATE 也能清空表数据,但与 DELETE 有显著区别:
| 对比维度 | DELETE(DML 语句) | TRUNCATE(DDL 语句) |
|---|---|---|
| 所属类别 | DML | DDL |
| 执行速度 | 较慢(逐行删除,记录日志) | 非常快(直接清空表数据) |
| 是否可回滚 | ✅ 可回滚 | ❌ 不可回滚 |
| 是否重置自增 | ❌ 不重置 | ✅ 重置 |
✅ 总结:若需要清空数据且可能需要回滚,用 DELETE;若确定不需要回滚、追求效率,用 TRUNCATE。
SELECT 语句是 MySQL 中使用频率最高的语句。
SELECT 列 1, 列 2, ... -- 要查询的列(*表示查询所有列)
FROM 表名 -- 要查询的表
WHERE 条件 -- 筛选条件(可选)
ORDER BY 排序列 -- 排序(可选)
LIMIT 限制条数; -- 限制返回条数(可选)
-- 查询指定列
SELECT name, age FROM student;
-- 查询所有列(生产环境不推荐)
SELECT * FROM student;
-- 查询年龄大于 20 的学生
SELECT * FROM student WHERE age > 20;
-- 多条件查询
SELECT * FROM student WHERE age >= 20 AND major = '人工智能';
-- 姓名以'张'开头
SELECT * FROM student WHERE name LIKE '张%';
-- 姓名包含'李'字
SELECT * FROM student WHERE name LIKE '%李%';
-- 按年龄升序
SELECT * FROM student ORDER BY age ASC;
-- 按年龄降序
SELECT * FROM student ORDER BY age DESC;
-- 返回前 5 条
SELECT * FROM student LIMIT 5;
-- 分页:从第 6 条开始,返回 5 条
SELECT * FROM student LIMIT 5, 5;
-- 统计总人数
SELECT COUNT(*) AS 总人数 FROM student;
-- 求平均年龄
SELECT AVG(age) AS 平均年龄 FROM student;
-- 按专业分组,统计人数,且只显示人数大于 2 的专业
SELECT major, COUNT(*) AS 人数 FROM student GROUP BY major HAVING 人数 > 2;
在 Java 后端开发中,事务控制是非常关键的知识点。
START TRANSACTION;
UPDATE account SET balance = balance - 100 WHERE id = 1;
UPDATE account SET balance = balance + 100 WHERE id = 2;
COMMIT;
START TRANSACTION;
UPDATE account SET balance = balance - 100 WHERE id = 1;
ROLLBACK;
实际 Java 后端开发中,通常通过 Spring 框架的 @Transactional 注解控制事务:
import org.springframework.transaction.annotation.Transactional;
public class TransferService {
@Transactional
public void transfer(int fromId, int toId, int amount) {
// 扣款
accountMapper.decreaseBalance(fromId, amount);
// 到账
accountMapper.increaseBalance(toId, amount);
}
}
SQL 是声明式语言,书写顺序和执行顺序不一样。面试高频考点:
| 操作类型 | 核心 SQL 语句 | 关键注意点 |
|---|---|---|
| 插入 | INSERT INTO ... VALUES ... | 列和值的顺序、类型要匹配 |
| 更新 | UPDATE ... SET ... WHERE ... | 必写 WHERE 条件 |
| 删除 | DELETE FROM ... WHERE ... | 谨慎省略 WHERE |
| 查询 | SELECT ... FROM ... | 避免用*查询所有列 |
| 事务 | START TRANSACTION / COMMIT / ROLLBACK | 保证数据一致性 |
DML 语句是日常开发的核心,建议大家多敲代码练习,尤其是 SELECT 语句的复杂用法以及事务的控制。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
在线格式化和美化您的 SQL 查询(它支持各种 SQL 方言)。 在线工具,SQL 美化和格式化在线工具,online
解析 INSERT 等受限 SQL,导出为 CSV、JSON、XML、YAML、HTML 表格(见页内语法说明)。 在线工具,SQL 转 CSV/JSON/XML在线工具,online