数据库基础:DML数据操作语言
前言:本文是"数据库基础"系列的第七篇。上一篇我们进入了 SQL 语言中最核心的部分——DQL 数据查询语言,学习了从简单查询到多表连接的各种查询技巧。本篇我们将学习DML(数据操作语言,Data Manipulation Language),也就是数据的增删改操作。在日常开发中,查询是最频繁的操作,但增删改同样是不可或缺的能力。只有掌握了 DML,我们才能真正实现对数据的完整控制。
目录
- 一、插入语句
- 二、修改语句
- 三、删除语句
- 四、总结
一、插入语句
1.1 方式一:经典插入
语法:
INSERTINTO表名(列名1,列名2,...)VALUES(值1,值2,...);特点:
- 列名和值必须一一对应
- 列名可以省略,此时默认所有列都需要插入值
- 支持插入多行
- 支持子查询
示例:
-- 向 students 表插入一条学生记录INSERTINTOstudents(id,name,age,class_id)VALUES(1,'张三',20,1);-- 插入时省略列名(必须按表结构顺序提供所有值)INSERTINTOstudentsVALUES(2,'李四',21,2);-- 只插入部分字段(未指定的字段自动赋 NULL)INSERTINTOstudents(id,name)VALUES(3,'王五');1.2 方式二:SET 方式
语法:
INSERTINTO表名SET列名1=值1,列名2=值2,...;示例:
INSERTINTOstudentsSETid=4,name='赵六',age=22,class_id=1;1.3 两种方式对比
| 对比维度 | 方式一(VALUES) | 方式二(SET) |
|---|---|---|
| 插入多行 | 支持 | 不支持 |
| 子查询插入 | 支持 | 不支持 |
| 代码简洁性 | 一般 | 较简洁 |
| 适用场景 | 批量插入、子查询插入 | 单条记录插入 |
方式一插入多行示例:
-- 同时插入多条记录INSERTINTOstudents(id,name,age,class_id)VALUES(5,'孙七',19,2),(6,'周八',20,1),(7,'吴九',21,3);方式一子查询插入示例:
-- 将 temp_students 表中 age > 20 的学生插入到 students 表INSERTINTOstudents(id,name,age,class_id)SELECTid,name,age,class_idFROMtemp_studentsWHEREage>20;二、修改语句
2.1 单表修改
语法:
UPDATE表名SET列名1=新值1,列名2=新值2,...WHERE筛选条件;注意:WHERE 条件决定了哪些行会被修改。如果省略 WHERE,整张表都会被更新。生产环境中务必先 SELECT 验证条件是否正确。
示例:
-- 修改 students 表中姓张的学生的年龄改为 25UPDATEstudentsSETage=25WHEREnameLIKE'张%';-- 修改 students 表中 id 为 3 的名称为王五,班级改为 2UPDATEstudentsSETname='王五',class_id=2WHEREid=3;2.2 多表修改
SQL92 语法(等值连接)
UPDATE表1别名1,表2别名2SET列名=值,...WHERE连接条件AND筛选条件;示例:
-- 将二班所有学生的年龄改为 23UPDATEstudents s,classes cSETs.age=23WHEREs.class_id=c.idANDc.class_name='二班';SQL99 语法(JOIN 连接)
UPDATE表1别名1INNER|LEFT|RIGHTJOIN表2别名2ON连接条件SET列名=值,...WHERE筛选条件;示例:
-- 将三班所有学生的年龄改为 24(INNER JOIN 版本)UPDATEstudents sINNERJOINclasses cONs.class_id=c.idSETs.age=24WHEREc.class_name='三班';-- 将没有分配班级的学生的班级改为 1(RIGHT JOIN 版本)UPDATEstudents sRIGHTJOINclasses cONs.class_id=c.idSETs.class_id=1WHEREs.idISNULL;三、删除语句
3.1 方式一:DELETE
单表删除
语法:
DELETEFROM表名WHERE筛选条件;示例:
-- 删除年龄小于 18 岁的学生信息DELETEFROMstudentsWHEREage<18;多表删除
SQL92 语法:
DELETE表1的别名,表2的别名FROM表1别名,表2别名WHERE连接条件AND筛选条件;SQL99 语法:
DELETE表1的别名,表2的别名FROM表1别名INNER|LEFT|RIGHTJOIN表2别名ON连接条件WHERE筛选条件;示例:
-- 删除一班所有学生的信息(只删 students 表)DELETEsFROMstudents sINNERJOINclasses cONs.class_id=c.idWHEREc.class_name='一班';-- 删除三班及其所有学生的信息(同时删两张表)DELETEs,cFROMstudents sINNERJOINclasses cONs.class_id=c.idWHEREc.class_name='三班';3.2 方式二:TRUNCATE
语法:
TRUNCATETABLE表名;注意:TRUNCATE 不能加 WHERE 条件,只能整表清空,且不可回滚,请谨慎使用。
示例:
-- 清空 temp_students 表(整表删除)TRUNCATETABLEtemp_students;3.3 DELETE 与 TRUNCATE 对比
| 对比维度 | DELETE | TRUNCATE |
|---|---|---|
| WHERE 条件 | 支持 | 不支持 |
| 执行效率 | 慢(逐行删除) | 快(直接释放数据页) |
| 自增长列 | 从断点继续 | 从 1 重新开始 |
| 返回值 | 有(返回受影响行数) | 无 |
| 事务回滚 | 支持回滚 | 不可回滚 |
自增长列差异演示:
-- 查看 students 表SELECT*FROMstudents;-- DELETE 删除后,再插入,自增长列从断点开始DELETEFROMstudents;INSERTINTOstudents(name,age,class_id)VALUES('小明',20,1);-- id 从上次断点继续-- TRUNCATE 删除后,再插入,自增长列从 1 开始TRUNCATETABLEstudents;INSERTINTOstudents(name,age,class_id)VALUES('小明',20,1);-- id 从 1 重新开始四、总结
核心脉络
插入数据(INSERT)
- 方式一:
INSERT INTO 表名 VALUES (值1, 值2, ...),按字段顺序依次赋值,支持一次插入多行 - 方式二:
INSERT INTO 表名 SET 字段1=值1, 字段2=值2, ...,指定字段赋值,每次只能插入一条
修改数据(UPDATE)
- 单表修改:
UPDATE 表名 SET 字段=值 WHERE 条件 - 多表修改:联立多张表进行更新
删除数据(DELETE / TRUNCATE)
DELETE:可加WHERE条件,支持事务回滚,逐行删除TRUNCATE:清空整表,不可回滚,效率更高
三个关键要点
- 插入:方式一(VALUES)功能更强大,支持多行和子查询;方式二(SET)更适合单条插入
- 修改:WHERE 条件千万不能忘,否则整张表都会被更新
- 删除:DELETE 可加条件可回滚,TRUNCATE 效率高但不可回滚,慎用 TRUNCATE
系列直达
- 上篇:数据库基础:DQL 数据查询语言
- 本篇:数据库基础:DML 数据操作语言(本文)
- 下篇:数据库基础:DDL数据定义语言