深入理解 DML:数据操纵语言完全指南

作为一名开发者,我们每天都在与数据库打交道。你可能已经很熟练地使用 SQL 查询数据,但当我们想要对数据进行增删改时,实际上是在使用 SQL 中非常核心的一个部分——DML(Data Manipulation Language,数据操纵语言)。

在这篇文章中,我们将深入探讨 DML 的全称、它背后的工作原理,以及如何在实际项目中高效、安全地使用它。我们将不仅仅是背诵语法,而是像经验丰富的数据库管理员(DBA)一样思考,理解每一个操作背后的细节和潜在陷阱。

什么是 DML?(Data Manipulation Language)

DML 代表 Data Manipulation Language(数据操纵语言)。它是 SQL(结构化查询语言)的一个子集,专门用于处理数据库中存储的数据

我们可以把数据库想象成一个巨大的、高度 organized 的 Excel 表格,而 DML 就是我们手中的笔和橡皮擦。虽然 SQL 提供了定义表格结构的工具(那是 DDL 的工作),但当我们想要真正去修改表格里的内容时,就需要 DML 登场了。

DML 的核心作用包括:

  • 向表中插入新记录。
  • 更新现有的记录。
  • 从表中删除数据。
  • 查询并检索数据。

> 专业提示:虽然 SELECT 语句在某些严格的定义中属于“数据查询语言”(DQL),但在日常开发和大多数数据库管理系统中,我们习惯将其归入 DML 的范畴,因为它是对数据的直接操作。

为什么 DML 对我们如此重要?

你可能会问:“我只要能查出数据不就行了吗?” 其实,数据的价值在于流动和更新。DML 提供了一套标准化的方式,让我们可以精确地告知数据库我们想做什么,而不需要关心底层的硬盘是如何读写这些数据的。

  • 事务控制的基础:DML 语句(如 INLINECODE28ec09a9、INLINECODEe566223b、DELETE)所做的更改通常被视为一个事务。这意味着我们可以把一系列操作打包,要么全部成功,要么全部失败,这是保证数据一致性的关键。
  • 效率与性能:DML 经过数十年的优化,能够极其高效地处理海量数据。理解它有助于我们写出性能更好的查询。
  • 安全性:通过限制用户只能执行特定的 DML 操作,我们可以更好地保护敏感数据。

DML 的两种主要类型

在深入语法之前,我们需要了解 DML 的两种“流派”。这决定了我们如何与数据库对话。

#### 1. 高级或非过程化 DML

这是最常见的一种,也就是我们每天都在写的 SQL。

  • 特点:也被称为“一次一集”操作。
  • 思维方式:你只需要告诉数据库你想要什么(Declarative),而不需要告诉它怎么做
  • 例子SELECT * FROM users WHERE age > 18; —— 我们只想要结果,至于数据库是全表扫描还是用索引查找,由优化器决定。

#### 2. 低级或过程化 DML

这种类型在纯 SQL 开发中较少见,但在编写存储过程或使用嵌入式 SQL 时会用到。

  • 特点:也被称为“一次一条”操作。
  • 思维方式:你必须详细说明数据如何被获取,以及何时获取。
  • 例子:使用游标逐行遍历数据,进行复杂的逻辑判断后再处理。像 Oracle 的 PL/SQL 或 DB2 的 SQL PL 就是典型的代表。

对比总结:

特性

高级 (非过程化) DML

低级 (过程化) DML :—

:—

:— 别称

面向集合

面向记录 使用方式

独立使用

必须嵌入到编程语言中 本质

说明性

命令性 用户关注点

需要什么数据

如何获取数据 典型代表

标准 SQL 查询

PL/SQL, T-SQL (游标部分)

深入解析:DML 的核心命令

让我们来看看 DML 的四大金刚。对于每一个命令,我不仅会展示语法,还会分享一些实战中的经验和避坑指南。

#### 1. SELECT(查询):数据的读取

这是 DML 中最复杂的部分。它用于从一个或多个表中检索数据。

基本语法:

SELECT column1, column2, ...
FROM table_name
WHERE condition;

实战示例:

假设我们有一个 students 表,我们想要查找所有未缴清学费的学生。

-- 从 students 表中选择所有列,条件是欠费大于 20000
SELECT * 
FROM students 
WHERE due_fees > 20000;

进阶技巧与最佳实践:

  • 避免 INLINECODE5fce2763:在生产环境中,明确指定需要的列名(如 INLINECODE0fbcbc50)。这不仅减少网络传输量,还能提高查询速度。
  • 索引的重要性WHERE 子句中的列如果建立了索引,查询速度会有数量级的提升。

#### 2. INSERT(插入):数据的创建

用于向表中添加新行。

基本语法:

INSERT INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...);

实战示例:

我们要注册一名新学生。

-- 向 students 表插入一条新记录
-- 注意:字符串和日期需要加单引号
INSERT INTO students (stu_id, stu_name, city, due_fees)
VALUES (1, ‘Nirmit‘, ‘Gorakhpur‘, 0);

另一种写法(不指定列名):

-- 这种方式依赖于表中列的顺序,风险较大,不推荐在生产环境使用
INSERT INTO students 
VALUES (2, ‘Alice‘, ‘Delhi‘, 15000);

常见错误:

  • 数据类型不匹配:比如在整数列插入字符串 ‘abc‘。
  • 违反约束:主键重复或未为 NOT NULL 列提供值。

#### 3. UPDATE(更新):数据的修改

这是最危险的命令之一,如果不小心,你可能会一次性改错几百万条数据。

基本语法:

UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition;

实战示例:

我们需要将名为 ‘Mini‘ 的学生的欠费金额更新为 20000。

-- 更新 stu_name 为 ‘Mini‘ 的记录
-- 如果你省略 WHERE 子句,表中所有记录的 due_fees 都会变成 20000!
UPDATE students
SET due_fees = 20000
WHERE stu_name = ‘Mini‘;

性能优化建议:

  • 更新操作通常会锁定行或表,直到事务提交。尽量减少在高峰期对大表进行批量更新。

#### 4. DELETE(删除):数据的销毁

同样危险,一旦删除,恢复数据非常麻烦(甚至不可能)。

基本语法:

DELETE FROM table_name
WHERE condition;

实战示例:

我们需要删除 ID 为 ‘001‘ 的学生记录。

-- 删除指定 ID 的学生
-- 同样,必须小心 WHERE 子句,否则整个表数据将被清空!
DELETE FROM students 
WHERE stu_id = ‘001‘;

DELETE vs TRUNCATE

你可能会听到 TRUNCATE 命令。区别在于:

  • DELETE 是 DML,可以回滚,会触发触发器,逐行删除,速度慢。
  • TRUNCATE 是 DDL,不可回滚,重置表结构,速度极快,适合清空大表。

实战场景:综合运用 DML

让我们看一个稍微复杂的场景,模拟一个真实的业务流程。

场景:新学期开始,我们需要将所有计算机科学(CS)系学生的学费上调 10%,并标记为“未缴清”。

-- 步骤 1: 先查询看看有多少学生受影响(好习惯)
SELECT stu_name, due_fees 
FROM students 
WHERE department = ‘CS‘;

-- 步骤 2: 执行批量更新
UPDATE students
SET 
    due_fees = due_fees * 1.1, -- 学费增加 10%
    status = ‘Unpaid‘
WHERE department = ‘CS‘;

-- 步骤 3: 验证结果
SELECT COUNT(*) FROM students WHERE department = ‘CS‘ AND status = ‘Unpaid‘;

在这个例子中,我们先查后改,极大地降低了误操作的风险。

DML 的优势与局限性

在使用 DML 时,我们需要清楚它的能力边界。

#### ✅ 优势

  • 精确的操作:可以精确控制数据的变化粒度。
  • 通用性:几乎所有的关系型数据库都支持标准 DML,这意味着你的 SQL 技能可以在 MySQL, PostgreSQL, Oracle, SQL Server 之间无缝迁移。
  • 事务支持:这是 DML 最强大的功能之一。通过 INLINECODE14105f0a, INLINECODEcdd8b81d, ROLLBACK,我们可以确保数据的完整性。例如,转账操作:A 账户扣钱(DML)和 B 账户加钱(DML)必须同时成功,否则同时失败。

#### ❌ 局限性

  • 无法修改结构:DML 只能操作数据。如果你想要给表加一列、修改列的数据类型或者删除整个表,你需要使用 DDL(Data Definition Language,数据定义语言),如 INLINECODE14d43659 或 INLINECODEa956122e。不要混淆它们。
  • 视图限制:虽然可以通过视图查询数据,但在某些复杂的视图上执行 DML(如 UPDATE)可能会受到限制,因为数据库无法确定如何将修改映射回基础表。
  • 性能瓶颈:虽然 DML 很强大,但极其复杂的 DML 逻辑(特别是涉及多表关联更新)可能会导致数据库性能下降,这时通常需要将数据拉取到应用层处理,或者使用存储过程。

总结与下一步

在本文中,我们全面探索了 DML(数据操纵语言)。它是我们与数据库数据进行交互的桥梁。

关键要点回顾:

  • DML 代表数据操纵语言,主要包括 INLINECODE76b1cd35, INLINECODE5d761b25, INLINECODE6902fdb7, INLINECODE1ea327c7。
  • DML 是关于数据的,而 DDL 是关于结构的。不要试图用 DML 去修改表结构。
  • WHERE 子句是你的安全带:在写 INLINECODE8eb881fb 和 INLINECODEf4fd812a 时,永远先检查 INLINECODE67759016 条件,甚至可以先写一个 INLINECODEf346c951 语句来验证条件是否符合预期,再将其改为更新或删除语句。
  • 理解事务:掌握事务控制语言(TCL)配合 DML 使用,是成为高级开发者的必经之路。

给你的建议:

在你下次编写数据库脚本时,试着多思考一下:

  • 我是否指定了明确的列名,而不是图省事使用 *
  • 我的 UPDATE 语句是否有足够严格的过滤条件?
  • 这几个操作是否应该放在一个事务中以保证一致性?

希望这篇文章能帮助你从“会写 SQL”进阶到“精通数据库操作”。如果你对特定数据库的高级功能(如窗口函数、存储过程)感兴趣,我们可以继续深入探讨。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。如需转载,请注明文章出处豆丁博客和来源网址。https://shluqu.cn/21507.html
点赞
0.00 平均评分 (0% 分数) - 0