在上一篇文章中,我们掌握了 DDL(数据定义语言) ,学会了如何创建数据库和表结构。今天我们要学习的 DML(数据操作语言) ,则是对表中数据进行增、删、改 的核心工具。本文将基于 sicheng 数据库的 student 学生表,结合实战案例拆解 DML 语法,新手也能轻松上手!(之前已经详细写过了MySQL的基础操作 现在时对MySQL体系的完善 想看详细操作的话请看之前写的MySQL的操作)
目录
[一、DML 概述:和 DDL 分清边界](#一、DML 概述:和 DDL 分清边界)
[二、INSERT:添加数据的 3 种方式](#二、INSERT:添加数据的 3 种方式)
[1. 指定字段插入:灵活赋值](#1. 指定字段插入:灵活赋值)
[2. 全字段插入:顺序不能错](#2. 全字段插入:顺序不能错)
[3. 批量插入:高效插入多条数据](#3. 批量插入:高效插入多条数据)
[4. 插入数据的限制:不符合规则直接报错](#4. 插入数据的限制:不符合规则直接报错)
[三、UPDATE:修改数据,WHERE 条件是关键](#三、UPDATE:修改数据,WHERE 条件是关键)
[1. 基本语法](#1. 基本语法)
[2. 实战案例:精准修改单条记录](#2. 实战案例:精准修改单条记录)
[3. 高危操作:修改全表数据](#3. 高危操作:修改全表数据)
[四、DELETE:删除数据,同样别漏了 WHERE](#四、DELETE:删除数据,同样别漏了 WHERE)
[1. 基本语法](#1. 基本语法)
[2. 实战案例:删除指定条件的记录](#2. 实战案例:删除指定条件的记录)
[3. 高危操作:清空整张表数据](#3. 高危操作:清空整张表数据)
[五、DML 核心知识点总结](#五、DML 核心知识点总结)
[六、写在最后:DQL 才是查询的核心](#六、写在最后:DQL 才是查询的核心)
一、DML 概述:和 DDL 分清边界
首先我们要明确 DML 和 DDL 的区别,避免混淆:
- DDL :操作数据库、表的结构 ,比如
CREATE DATABASE、CREATE TABLE。 - DML :操作表中的数据记录 ,核心指令只有 3 个:
INSERT:添加数据UPDATE:修改数据DELETE:删除数据
本文所有案例都基于 sicheng 数据库下的 student 表,表结构预先设计如下:
sql
-- 切换到 sicheng 数据库
USE sicheng;
-- 创建 student 学生表
CREATE TABLE student (
id INT COMMENT '学生编号',
name VARCHAR(10) COMMENT '学生姓名',
age TINYINT UNSIGNED COMMENT '学生年龄',
gender CHAR(1) COMMENT '性别',
class VARCHAR(20) COMMENT '班级'
) COMMENT '学生表';
二、INSERT:添加数据的 3 种方式
INSERT 是向表中插入数据的指令,根据需求不同,有 指定字段插入、全字段插入、批量插入 三种写法,核心要求是 字段和值的顺序、类型必须一一对应。
1. 指定字段插入:灵活赋值
当我们只需要给部分字段赋值时,就可以用这种方式,未指定的字段会默认赋值为 NULL。
语法:
sql
INSERT INTO 表名(字段1, 字段2, ...) VALUES(值1, 值2, ...);
学生案例:
需求:向 student 表插入 1 条学生数据,只填写编号、姓名、班级。
sql
INSERT INTO student(id, name, class) VALUES(1, '张三', '高一(1)班');
注意事项
- 字符串和日期类型的值必须用单引号 包裹(比如
'张三'、'高一(1)班')。 - 数据大小不能超出字段定义范围(比如
age是TINYINT UNSIGNED,就不能插入负数)。
2. 全字段插入:顺序不能错
如果要给所有字段赋值,可以省略字段列表,但值的顺序必须和表结构完全一致。
语法:
sql
INSERT INTO 表名 VALUES(值1, 值2, ..., 值n);
学生案例:
需求:插入 1 条完整的学生数据,包含所有字段。
sql
INSERT INTO student VALUES(2, '李四', 16, '男', '高一(2)班');
易错点
如果值的顺序和表结构不匹配,会直接报错。比如把 age 和 gender 顺序写反,MySQL 会提示 "数据类型不匹配"。
3. 批量插入:高效插入多条数据
当需要插入多条记录时,不用写多条 INSERT 语句,只需在 VALUES 后用逗号分隔多组值,能大幅提升插入效率。
语法:
sql
INSERT INTO 表名(字段1, 字段2) VALUES(值1, 值2), (值3, 值4), ...;
学生案例
需求:批量插入 3 条学生数据。
sql
INSERT INTO student(id, name, age, class)
VALUES(3, '王五', 17, '高一(1)班'),
(4, '赵六', 16, '高一(2)班'),
(5, '孙七', 18, '高一(1)班');
效率优势
批量插入减少了网络往返和 SQL 解析的开销,比单条插入快得多。执行成功后,MySQL 会返回 3 rows affected,表示 3 条记录插入成功。
4. 插入数据的限制:不符合规则直接报错
插入数据时,必须符合字段的类型和约束,否则会报错。
学生案例:插入负数年龄验证
需求:尝试给 age 字段插入 -1(age 是 TINYINT UNSIGNED 无符号整型)。
sql
INSERT INTO student(id, name, age) VALUES(6, '周八', -1);
执行结果
直接报错 Out of range value for column 'age',原因是无符号整型只能存储 0-255 的整数。
结论
插入数据前,一定要确认数据符合字段的类型、长度和约束要求。
三、UPDATE:修改数据,WHERE 条件是关键
UPDATE 用于修改表中已有的数据,核心是 WHERE 条件 ------ 没有 WHERE 条件会修改整张表的所有数据,属于高危操作!
1. 基本语法
sql
UPDATE 表名 SET 字段1=值1, 字段2=值2, ... [WHERE 条件];
- 多字段修改时,用逗号分隔。
WHERE条件:指定要修改的记录,省略则修改全表。
2. 实战案例:精准修改单条记录
案例 1:修改单个字段
需求:将编号为 1 的学生姓名改为 "张三丰"。
sql
UPDATE student SET name='张三丰' WHERE id=1;
执行后返回 1 row affected,表示 1 条记录被修改。用 SELECT 语句(后续会讲)可以验证修改结果。
案例 2:同时修改多个字段
需求:将编号为 2 的学生姓名改为 "李四光",班级改为 "高一 (3) 班"。
sql
UPDATE student SET name='李四光', class='高一(3)班' WHERE id=2;
关键点:多个字段之间用逗号分隔,WHERE 条件确保只修改目标记录。
3. 高危操作:修改全表数据
如果省略 WHERE 条件,会修改整张表的所有数据,一定要谨慎!
案例:将所有学生的班级改为 "高一实验班"
sql
UPDATE student SET class='高一实验班';
执行后返回 5 rows affected,表示 5 条学生记录的班级都被修改。生产环境中,这种操作一定要先备份数据!
四、DELETE:删除数据,同样别漏了 WHERE
DELETE 用于删除表中的数据记录,和 UPDATE 一样,WHERE 条件决定了删除的范围,省略条件会清空整张表!
1. 基本语法
sql
DELETE FROM 表名 [WHERE 条件];
注意:DELETE 是删除整条记录 ,不能只删除某个字段的值(如果要清空字段值,用 UPDATE 设为 NULL)。
2. 实战案例:删除指定条件的记录
案例 1:删除单个学生记录
需求:删除编号为 5 的学生记录。
sql
DELETE FROM student WHERE id=5;
执行后返回 1 row affected,编号为 5 的学生数据被永久删除。
案例 2:删除符合条件的多条记录
需求:删除所有 "高一 (1) 班" 的学生记录。
sql
DELETE FROM student WHERE class='高一(1)班';
执行后返回 2 rows affected,表示 2 条符合条件的记录被删除。
3. 高危操作:清空整张表数据
省略 WHERE 条件,会删除表中所有数据,表结构会保留。
sql
DELETE FROM student;
执行后,student 表变成空表,但表结构还在。生产环境中,执行前务必确认数据已备份!
五、DML 核心知识点总结
为了方便大家复习,我把 DML 的核心知识点整理成了表格:
| 知识点 | 核心内容 | 考试 / 面试重点 | 难度系数 |
|---|---|---|---|
| DML 概述 | 数据操作语言,负责增删改表数据;与 DDL 的区别:DDL 操作结构,DML 操作数据 | 区分 DML 和 DDL 的功能边界 | ⭐⭐ |
| INSERT 语法 | 3 种写法:指定字段、全字段、批量插入;字段和值必须一一对应 | 字符串需加引号;批量插入的效率优势 | ⭐⭐⭐ |
| INSERT 限制 | 数据必须符合字段类型和约束(如无符号整型不能存负数) | 违反约束会直接报错 | ⭐⭐⭐⭐ |
| UPDATE 语法 | UPDATE 表名 SET 字段=值 WHERE 条件 |
无 WHERE 会修改全表,属于高危操作 | ⭐⭐⭐⭐ |
| DELETE 语法 | DELETE FROM 表名 WHERE 条件 |
无 WHERE 会清空全表;只删记录不删结构 | ⭐⭐⭐⭐ |
六、写在最后:DQL 才是查询的核心
通过本文的学习,我们已经掌握了 DML 的增删改操作,能够对 student 表的数据进行灵活管理。但在实际开发中,我们更常用的是 查询数据------ 比如 "查询高一 (1) 班的所有学生""查询年龄大于 16 岁的女生"。
这些需求,就需要用到我们下一篇要讲的 DQL(数据查询语言),它是 MySQL 中最核心、最复杂的语法,也是面试和工作中的重点。感兴趣的小伙伴可以关注我,下一篇文章带你吃透 DQL 查询!
希望这篇文章对你有帮助,如果你有任何问题或建议,欢迎在评论区留言。谢谢阅读(求攒攒 收藏 关注)!
