数据库基础:DML数据操作语言
2026/9/8 17:14:01 网站建设 项目流程

数据库基础: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 语法(等值连接)
UPDATE1别名1,2别名2SET列名=,...WHERE连接条件AND筛选条件;

示例

-- 将二班所有学生的年龄改为 23UPDATEstudents s,classes cSETs.age=23WHEREs.class_id=c.idANDc.class_name='二班';
SQL99 语法(JOIN 连接)
UPDATE1别名1INNER|LEFT|RIGHTJOIN2别名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 语法

DELETE1的别名,2的别名FROM1别名,2别名WHERE连接条件AND筛选条件;

SQL99 语法

DELETE1的别名,2的别名FROM1别名INNER|LEFT|RIGHTJOIN2别名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 对比

对比维度DELETETRUNCATE
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:清空整表,不可回滚,效率更高

三个关键要点

  1. 插入:方式一(VALUES)功能更强大,支持多行和子查询;方式二(SET)更适合单条插入
  2. 修改:WHERE 条件千万不能忘,否则整张表都会被更新
  3. 删除:DELETE 可加条件可回滚,TRUNCATE 效率高但不可回滚,慎用 TRUNCATE

系列直达

  • 上篇:数据库基础:DQL 数据查询语言
  • 本篇:数据库基础:DML 数据操作语言(本文)
  • 下篇:数据库基础:DDL数据定义语言

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询