【MySQL】从入门到精通:DML 数据操作语言实战教程(零基础必看)
·
在上一篇文章中,我们系统学习了 SQL 的基础概念和 DDL(数据定义语言)的核心用法,掌握了数据库、数据表、字段的创建与管理。
本文将聚焦 DML(数据操作语言) —— 这是实际开发中与业务数据交互最频繁的 SQL 类型,核心讲解表数据的「增、删、改」三大操作,结合分类表实战案例帮你快速掌握,同时分享生产环境必备的避坑技巧,全程通俗易懂,适合零基础同学学习。
二、DML 基础认知
2.1 DML 概述
DML(Data Manipulation Language)即数据操作语言,核心作用是对数据表中的数据行进行增、删、改操作,不影响表结构(表结构由 DDL 管理)。
日常开发中,增删改操作也常被统称为 “更新语句”,是实现业务功能(如添加商品、修改用户信息、删除订单)的核心 SQL。
2.2 重要提醒
- DML 仅操作表中数据,不修改表结构(表结构修改用 DDL 的 ALTER);
- 删改操作(UPDATE/DELETE)风险极高,务必谨慎,优先备份数据;
- 所有实操案例均基于「分类表」,先执行 3.1 节环境准备语句,再跟随案例练习。
三、DML 核心操作实战
3.1 环境准备
首先创建演示用的数据表(分类表),所有案例均基于此表实操,直接复制运行即可:
-- 1. 切换到目标数据库(若不存在,先执行:CREATE DATABASE IF NOT EXISTS day01;)
USE day01;
-- 2. 创建分类表(cid:分类ID,cname:分类名,info:描述信息)
CREATE TABLE category(
cid INT, -- 分类id(整数类型)
cname VARCHAR(20), -- 分类名(字符串类型,最长20个字符)
info VARCHAR(100) -- 描述信息(字符串类型,最长100个字符)
);
-- 3. 查看表结构(确认表创建成功,避免后续操作报错)
DESC category;
3.2 新增数据(INSERT)
(1)语法格式(必看)
- 说明:
[ ]中内容为可选,根据需求选择;值的个数、数据类型必须与列名一一对应,否则报错。
-- 方式1:指定列名(推荐,字段顺序可自定义,无需按表结构顺序填写)
INSERT INTO 表名(列名1, 列名2, ...) VALUES(值1, 值2, ...);
-- 方式2:不指定列名(不推荐,需严格按表中字段顺序,填写所有字段的值)
INSERT INTO 表名 VALUES(值1, 值2, ...);
-- 方式3:批量插入(高效,减少数据库交互次数,开发首选)
INSERT INTO 表名 VALUES(值1, 值2, ...), (值1, 值2, ...), ...;
(2)实操案例(对应格式,可直接运行)
-- 案例1:指定列名插入(仅插入cid和cname,info字段不填,默认为NULL)
INSERT INTO category(cid, cname) VALUES(1, '电脑');
-- 案例2:不指定列名插入(需按表字段顺序(cid、cname、info)填写所有值)
INSERT INTO category VALUES(2, '手机', '华为手机666');
-- 案例3:批量插入多条数据(推荐,一次插入3条,效率高于3次单条插入)
INSERT INTO category
VALUES
(3, '汽车', '小米汽车'),
(4, '平板', '华为平板');
-- 查看插入结果(* 代表查询所有列,验证数据是否插入成功)
SELECT * FROM category;
(3)注意事项(避坑重点)
- 匹配规则:插入的值个数、数据类型必须与列名一一对应,否则直接报错;
-- 错误示例1:列数与值数不匹配(cid、cname对应2列,却填了3个值) -- INSERT INTO category(cid, cname) VALUES(1, '电脑', 3); -- 错误示例2:不指定列名但值数不足(表有3个字段,只填2个值) -- INSERT INTO category VALUES(3, '拉杆箱'); - 格式要求:字符串、日期类型的值,必须用单引号包裹(数字类型无需包裹);
- 效率优先:批量插入比多次单条插入效率更高,减少数据库连接压力,开发中优先使用。
3.3 修改数据(UPDATE)
(1)语法格式(必看)
- 说明:
SET后指定要修改的字段和新值,WHERE后指定修改范围;无 WHERE 条件会修改表中所有数据,极其危险!
UPDATE 表名 SET 字段名1=值1, 字段名2=值2, ... WHERE 条件;
⚠️ 核心警告:WHERE 条件是关键,省略 WHERE 会批量修改全表数据,生产环境严禁操作!
(2)实操案例(对应格式,可直接运行)
-- 先查看当前数据(确认修改前的状态,避免修改错误数据)
SELECT * FROM category;
-- 案例1:危险操作(无WHERE条件,会修改表中所有数据的cname和info,谨慎执行)
-- UPDATE category SET cname='空调', info='格力';
-- 案例2:精准修改(仅修改cid=1的记录,推荐,精准定位目标数据)
UPDATE category SET cname='汽车', info=NULL WHERE cid = 1;
-- 案例3:修改多个字段(同时修改cid=3的分类名和描述信息,字段间用逗号分隔)
UPDATE category SET cname='空调', info='格力空调' WHERE cid = 3;
-- 查看修改结果(验证修改是否符合预期)
SELECT * FROM category;
(3)注意事项(避坑重点)
- 必加 WHERE:除非确认要修改全表数据,否则必须加 WHERE 条件限定修改范围;
- 多字段修改:可同时修改多个字段,字段间用逗号分隔,无需多次执行 UPDATE;
- 先查后改:执行 UPDATE 前,先用 SELECT 查询条件对应的记录,确认无误后再执行修改(避免误改)。
3.4 删除数据(DELETE / TRUNCATE)
删除数据有两种方式,核心区别极大,需根据场景选择,严禁混用!
(1)DELETE 语法(推荐,安全可控)
语法格式(必看)
- 说明:支持 WHERE 条件,可精准删除指定记录;删除后不重置主键自增 ID,数据可通过事务回滚恢复。
DELETE FROM 表名 WHERE 条件;
(2)TRUNCATE 语法(慎用,风险极高)
语法格式(必看)
- 说明:不支持 WHERE 条件,只能删除表中所有数据;相当于 “删除表 + 重建表”,会重置主键自增 ID,数据删除后不可回滚。
TRUNCATE TABLE 表名;
(3)实操案例(对应格式,可直接运行)
-- 先备份数据(避免误删,生产环境必做步骤,详见3.5节)
CREATE TABLE category_tmp SELECT * FROM category;
-- 案例1:删除指定记录(仅删除cid=4的记录,精准删除,推荐)
DELETE FROM category WHERE cid = 4;
-- 案例2:删除所有记录(无WHERE条件,不重置主键ID,数据可回滚)
-- DELETE FROM category;
-- 案例3:清空表并重置主键ID(慎用,数据不可回滚,仅适合彻底清空表)
-- TRUNCATE TABLE category;
-- 查看删除结果(验证数据是否删除成功)
SELECT * FROM category;
(4)DELETE vs TRUNCATE 对比(必记)
表格
| 特性 | DELETE | TRUNCATE |
|---|---|---|
| 条件删除 | 支持(WHERE 筛选) | 不支持(只能删全表) |
| 主键 ID | 不重置(删除后继续自增) | 重置(重新从 1 开始) |
| 事务回滚 | 支持(删除后可恢复) | 不支持(删除后不可恢复) |
| 执行效率 | 较低(逐行删除数据) | 较高(直接重建表) |
| 适用场景 | 删除部分数据 | 清空全表且无需恢复 |
3.5 生产环境必备:数据备份技巧
在执行删改操作(UPDATE/DELETE/TRUNCATE)前,备份数据是重中之重,以下两种常用备份方式,覆盖不同场景,直接套用即可:
(1)场景 1:备份表不存在(创建新表备份)
语法格式(必看)
- 说明:创建一张新的备份表,将原表数据(或指定条件的数据)复制到备份表中,适合首次备份。
-- 格式:CREATE TABLE 备份表名 SELECT * FROM 原表名 [WHERE 条件];
实操案例
-- 备份全表(推荐,将category表所有数据备份到category_tmp表)
CREATE TABLE category_tmp SELECT * FROM category;
-- 备份指定数据(仅备份cid<=3的记录,按需选择)
-- CREATE TABLE category_tmp SELECT * FROM category WHERE cid <= 3;
(2)场景 2:备份表已存在(插入数据到备份表)
语法格式(必看)
- 说明:若备份表已存在,无需重新创建,直接将原表数据插入到备份表中(可避免覆盖原有备份)。
-- 格式:INSERT INTO 备份表名 SELECT * FROM 原表名 [WHERE 条件];
实操案例
-- 向已存在的备份表中,插入原表cid<=3的记录
INSERT INTO category_tmp SELECT * FROM category WHERE cid <= 3;
(3)验证备份结果
-- 查看备份表数据,确认备份成功(必做步骤)
SELECT * FROM category_tmp;
(4)清空备份表(如需)
-- 若需重新备份,可先清空备份表中的旧数据
DELETE FROM category_tmp;
四、实操避坑指南(生产环境必看)
- 删改操作必加 WHERE:生产环境中 90% 的数据误操作,都是因为省略 WHERE 条件,导致全表数据被修改 / 删除;
- 先查后改 / 删:执行 UPDATE/DELETE 前,先用 SELECT 验证条件是否正确,确认目标数据无误后再执行;
- 批量操作分批次:处理大量数据(万级以上)时,避免一次性操作,分批次执行(如每次删 1000 条),减少数据库压力;
- 慎用 TRUNCATE:除非确认数据无需恢复,否则优先用 DELETE(带 WHERE),避免误删后无法回滚;
- 操作前备份:养成 “备份→验证→操作” 的习惯,数据无价,任何时候都不要省略备份步骤。
五、总结
核心要点回顾
- DML 核心作用:对表数据进行「增(INSERT)、删(DELETE/TRUNCATE)、改(UPDATE)」,不影响表结构;
- 新增数据:推荐「指定列名插入」或「批量插入」,注意值与列的个数、类型匹配,字符串用单引号包裹;
- 修改 / 删除数据:UPDATE/DELETE 必须加 WHERE 条件,杜绝无条件操作;
- 删数据选型:DELETE 可条件删除、不重置主键、支持回滚;TRUNCATE 仅清空全表、重置主键、不可回滚;
- 生产环境原则:删改前必备份、先查后操作、慎用高危语句(TRUNCATE、无 WHERE 的 UPDATE/DELETE)。
系列预告
下一篇我们将学习 SQL 中最核心、使用频率最高的 DQL 数据查询语言,详解单表查询的所有核心场景(条件查询、排序、聚合、分页等),关注我,持续解锁 SQL 从入门到实战的核心技能!
拓展提示
- 建议结合 MySQL 客户端(Navicat、SQLyog)实操,直观查看数据插入、修改、删除的效果;
- 所有 SQL 语句建议手写练习,不要直接复制,加深记忆,避免后续写 SQL 时遗漏格式;
- 遇到报错时,优先查看报错信息中的关键字(如 “column count”“data type”),快速定位问题(多为值与列不匹配、格式错误)。
更多推荐




所有评论(0)