在数据库的学习和使用过程中,我们经常会碰到各种缩写术语,DML就是其中出现频率非常高的一类。很多初学者第一次看到DML的时候,往往会把它和DDL、DCL、DQL这些概念混淆,不清楚它具体负责什么工作,也不清楚在实际操作里该怎么使用。其实DML的全称是Data Manipulation Language,也就是数据操纵语言,它的核心作用就是对数据库中已经存在的表数据进行操作,是日常数据库使用中最常用的操作类型之一。

DML的基础定义与核心作用
要理解DML是什么,首先得明确它在数据库体系里的定位。数据库的操作语言通常按照功能分为几大类:DDL(数据定义语言)负责创建、修改、删除数据库和表结构,比如创建表、添加字段这类操作;DCL(数据控制语言)负责管理用户的权限,比如授权、回收权限;DQL(数据查询语言)专门负责查询数据,也就是我们常说的SELECT语句;而DML就是专门负责操纵表中已有数据的语言,不涉及表结构的修改,也不涉及权限管理,只针对数据本身做增、删、改、查操作。
为什么要把DML单独划分出来?因为在实际业务里,数据的变动是非常频繁的:用户注册要在用户表插入新数据,用户修改个人信息要更新用户表的数据,用户注销账号要删除用户表的相关数据,这些操作全部属于DML的范畴。可以说,只要业务系统需要和数据库交互数据,几乎都离不开DML语句的使用。
DML包含的核心操作类型
标准的DML包含四种核心操作,分别是插入(INSERT)、更新(UPDATE)、删除(DELETE)和查询(SELECT),不过有些资料会把SELECT单独归为DQL,但是在实际的数据库使用中,SELECT也是DML操作的一部分,因为它同样是操纵数据的操作。下面我们逐个讲解这四种操作的作用:
1. 插入操作(INSERT)
插入操作的作用是向数据库的表中添加新的数据行,也就是我们常说的“新增数据”。比如电商系统里新增一个商品、用户系统里新增一个注册用户,都需要用INSERT语句实现。
2. 更新操作(UPDATE)
更新操作的作用是修改表中已经存在的数据,比如用户修改手机号、订单状态从待付款变成已付款,这些都需要用UPDATE语句来修改对应行的字段值。
3. 删除操作(DELETE)
删除操作的作用是从表中删除不需要的数据行,比如用户注销后删除用户信息、过期订单数据清理,都需要用DELETE语句实现。需要注意的是,DELETE删除的是表中的数据行,不会删除表本身,删除表结构属于DDL的操作。
4. 查询操作(SELECT)
查询操作的作用是从表中读取符合条件的数据,是最常用的DML操作,比如查询某个用户的所有订单、查询销量前10的商品,都需要用SELECT语句实现。
DML的标准语法与代码示例
下面我们以MySQL数据库为例,讲解DML四种操作的标准语法,同时搭配实际的代码示例,帮助大家理解具体的使用方式。首先我们先创建一个测试用的用户表,作为后续示例的基础:
-- 创建用户表,包含用户ID、用户名、手机号、注册时间、状态字段 CREATE TABLE `user_info` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户ID', `username` varchar(50) NOT NULL COMMENT '用户名', `phone` varchar(20) DEFAULT NULL COMMENT '手机号', `register_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '注册时间', `status` tinyint(1) DEFAULT '1' COMMENT '状态 1正常 0禁用', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户信息表';
INSERT插入语法
INSERT的标准语法有两种常见形式,一种是插入完整的行数据,另一种是插入指定字段的数据:
-- 语法1:插入所有字段的数据,值的顺序要和表字段的顺序一致
INSERT INTO 表名 VALUES (值1, 值2, 值3, ...);
-- 语法2:插入指定字段的数据,未指定的字段如果有默认值会填充默认值,没有默认值且允许为空则填充NULL
INSERT INTO 表名 (字段1, 字段2, ...) VALUES (值1, 值2, ...);
-- 示例:向user_info表插入一条完整的用户数据
INSERT INTO user_info VALUES (1, '张三', '13800138000', '2024-01-01 10:00:00', 1);
-- 示例:插入指定字段的数据,register_time有默认值,status有默认值,所以可以不写
INSERT INTO user_info (username, phone) VALUES ('李四', '13900139000');
-- 批量插入多行数据
INSERT INTO user_info (username, phone) VALUES
('王五', '13700137000'),
('赵六', '13600136000'),
('钱七', '13500135000');使用INSERT的时候需要注意,如果表的主键是自增的,插入的时候可以不写主键字段,数据库会自动生成自增的主键值。另外如果插入的数据违反了表的约束(比如用户名字段设置了唯一约束,插入重复的用户名),语句会执行失败,返回错误信息。
UPDATE更新语法
UPDATE语句的核心是指定要更新的表、要修改的字段和新值,以及更新的条件,一定要注意加更新条件,否则会把表中所有行的对应字段都修改掉:
-- 标准语法,WHERE后面是更新条件,只更新符合条件的数据行 UPDATE 表名 SET 字段1=新值1, 字段2=新值2, ... WHERE 条件; -- 示例:修改用户李四的手机号为新号码 UPDATE user_info SET phone='13900139999' WHERE username='李四'; -- 示例:批量修改状态,把所有未禁用的用户状态改成正常(这里其实是冗余操作,演示条件更新) UPDATE user_info SET status=1 WHERE status!=1; -- 错误示例:没有加WHERE条件,会把所有用户的手机号都改成13800138000,非常危险 -- UPDATE user_info SET phone='13800138000';
如果更新条件匹配不到任何数据行,UPDATE语句也会执行成功,只是影响的行数为0,不会报错。所以在生产环境执行UPDATE语句之前,最好先写SELECT语句用同样的条件查询一下,确认要更新的数据范围是否正确。
DELETE删除语法
DELETE语句的作用是删除符合条件的数据行,同样需要注意加删除条件,否则会删除表中的所有数据:
-- 标准语法,WHERE后面是删除条件,只删除符合条件的数据行 DELETE FROM 表名 WHERE 条件; -- 示例:删除用户名为钱七的用户数据 DELETE FROM user_info WHERE username='钱七'; -- 删除所有状态为禁用的用户数据 DELETE FROM user_info WHERE status=0; -- 错误示例:没有加WHERE条件,会删除表中所有数据,非常危险 -- DELETE FROM user_info;
需要注意的是,DELETE删除数据是逐行删除的,删除大量数据的时候效率会比较低,如果确实需要清空表中的所有数据,可以使用TRUNCATE语句,不过TRUNCATE属于DDL操作,会重置自增主键,而且不能加条件,使用和DELETE的场景不同。
SELECT查询语法
SELECT是最复杂的DML操作,基础的语法结构如下,支持条件过滤、排序、分组、连表等复杂操作:
-- 基础语法,查询指定表中符合条件的指定字段数据 SELECT 字段1, 字段2, ... FROM 表名 WHERE 条件 ORDER BY 排序字段 排序方式 LIMIT 条数; -- 示例:查询所有状态正常的用户,按照注册时间倒序排列,只取前10条 SELECT id, username, phone, register_time FROM user_info WHERE status=1 ORDER BY register_time DESC LIMIT 10; -- 示例:查询用户名为张三的用户所有信息 SELECT * FROM user_info WHERE username='张三'; -- 示例:查询手机号包含138的用户数量 SELECT COUNT(*) AS user_count FROM user_info WHERE phone LIKE '%138%';
DML的实际应用场景
DML的应用场景几乎覆盖了所有需要和数据库交互的业务系统,下面举几个常见的实际场景:
- 用户管理系统:用户注册用INSERT插入用户数据,用户修改个人信息用UPDATE更新数据,用户注销用DELETE删除数据,查询用户信息用SELECT语句。
- 电商系统:新增商品用INSERT,商品信息修改用UPDATE,下架商品可以UPDATE修改状态或者DELETE删除数据,查询商品列表用SELECT。
- 订单系统:用户下单用INSERT插入订单数据,订单支付后UPDATE修改订单状态,查询用户的订单列表用SELECT,过期未支付订单清理用DELETE。
- 日志系统:系统操作日志、用户行为日志的写入都用INSERT,一般日志不需要修改和删除,只需要用SELECT查询统计。
DML使用的注意事项
在实际使用DML的时候,有几个需要注意的点,避免出现数据问题:
- 执行UPDATE和DELETE语句的时候,一定要先确认WHERE条件是否正确,最好先执行对应的SELECT语句验证条件匹配的数据范围,避免误改误删数据。
- 插入数据的时候要符合表的约束规则,比如非空字段必须赋值,唯一字段不能重复,外键字段要对应关联表存在的数据。
- 批量操作大量数据的时候,要考虑事务的使用,比如批量插入1000条用户数据,如果中间某条失败,可以用事务回滚,避免只插入部分数据的情况。
- 不同数据库的DML语法有细微差别,比如MySQL的批量插入用VALUES后面跟多个括号,Oracle的批量插入语法有所不同,使用时要注意对应数据库的语法规范。
总结
DML作为数据库数据操纵的核心语言,是每个数据库使用者都必须掌握的基础内容。它的四种核心操作INSERT、UPDATE、DELETE、SELECT覆盖了日常业务中几乎所有的数据操作需求,不管是简单的个人项目还是复杂的企业级系统,都离不开DML的使用。掌握DML的语法和使用场景,注意操作过程中的数据安全问题,就能灵活应对各种数据库数据操作的需求。