深入理解 DML 和 DQL:SQL 数据操作与查询全解析

news2025/4/23 3:31:13

深入理解 DML 和 DQL:SQL 数据操作与查询全解析

在数据库管理中,SQL(结构化查询语言)是操作和查询数据的核心工具。其中,DML(Data Manipulation Language,数据操作语言)DQL(Data Query Language,数据查询语言) 是最常用的子集。DML 负责数据的插入、更新和删除,而 DQL 专注于数据查询。本文将详细讲解 DML 和 DQL 的核心操作,包括 UPDATEDELETETRUNCATESELECT,以及相关函数和子句,结合示例帮助你快速上手。


一、DML:数据操作语言

DML 用于操作数据库中的数据,主要包括以下操作:

  • 插入(INSERT):向表中添加新记录。
  • 更新(UPDATE):修改表中已有记录。
  • 删除(DELETE):移除表中记录。

以下重点讲解 UPDATEDELETE,并深入分析 TRUNCATEDELETE 的区别。

1. UPDATE:修改数据

UPDATE 用于修改表中符合条件的记录,语法如下:

UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition;
  • 作用:更新指定列的值。
  • 注意WHERE 子句指定更新的范围,未指定会导致全表更新。
示例

假设有一个 student 表:

idnameage
1Alice20
2Bob22
3Charlie20

需求:将年龄为 20 的学生年龄改为 21。

UPDATE student
SET age = 21
WHERE age = 20;

结果

idnameage
1Alice21
2Bob22
3Charlie21

注意

  • 没有 WHERE 子句时,UPDATE student SET age = 21; 会将所有记录的 age 改为 21。
  • 建议先用 SELECT 查询确认受影响的记录。

2. DELETE:删除数据

DELETE 用于删除表中符合条件的记录,语法如下:

DELETE FROM table_name
WHERE condition;
  • 作用:移除满足条件的记录。
  • 注意:不带 WHERE 会删除表中所有记录。
示例

需求:删除年龄小于 22 的学生。

DELETE FROM student
WHERE age < 22;

结果

idnameage
2Bob22

注意

  • 删除后,表结构和索引保留,数据可通过事务回滚(如果在事务中)。
  • 自增列计数器行为因存储引擎不同而异(详见下文)。

3. TRUNCATE:清空表

TRUNCATE 用于完全清空表中的数据,语法如下:

TRUNCATE TABLE table_name;
  • 作用:删除表中所有记录,重置表到初始状态。
  • 注意:无法指定条件,总是清空整个表。
示例

需求:清空 student 表。

TRUNCATE TABLE student;

结果

  • 表变为空,结构保留。
  • 自增列计数器重置为 1。

二、TRUNCATE 与 DELETE 的区别

TRUNCATEDELETE 都可以删除数据,但有显著差异。以下是详细对比:

特性DELETETRUNCATE
删除范围可通过 WHERE 删除部分记录删除整个表,无条件
速度较慢,逐行删除,记录日志更快,直接重建表结构
事务支持支持事务,可回滚不影响事务,无法回滚
自增列计数器不重置,保留上次值重置为 1
触发器触发 DELETE 触发器不触发触发器
外键约束支持(受外键限制)不支持(表有外键时无法使用)
日志记录记录每行操作,占用日志空间仅记录表结构变更,日志少

TRUNCATE 的优势

  1. 速度快TRUNCATE 直接重建表结构,效率高于逐行删除的 DELETE
  2. 重置自增列:适合需要重置主键计数器的场景(如测试环境清空数据)。
  3. 不影响事务:执行后不记录逐行日志,节省日志空间。
  4. 低资源占用:适合快速清空大表。

DELETE 删除后的行为(重启数据库)

DELETE 删除数据后,自增列计数器的行为因存储引擎不同而异:

  • InnoDB

    • 自增计数器存储在内存中。

    • 重启数据库后,计数器从 1 重新开始。

    • 示例:

      CREATE TABLE test (id INT AUTO_INCREMENT PRIMARY KEY);
      INSERT INTO test VALUES (1), (2), (3);
      DELETE FROM test;
      INSERT INTO test VALUES (NULL); -- id = 1(重启后)
      
  • MyISAM

    • 自增计数器存储在文件中,持久化。

    • 重启数据库后,从上一个最大值继续。

    • 示例:

      DELETE FROM test;
      INSERT INTO test VALUES (NULL); -- id = 4(继续上一个值)
      
示例:DELETE vs TRUNCATE
-- 创建表
CREATE TABLE student (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50),
    age INT
);
INSERT INTO student (name, age) VALUES ('Alice', 20), ('Bob', 22);

-- DELETE
DELETE FROM student;
INSERT INTO student (name, age) VALUES ('Charlie', 21);
-- InnoDB 重启后:id = 1;MyISAM:id = 3

-- TRUNCATE
TRUNCATE TABLE student;
INSERT INTO student (name, age) VALUES ('Charlie', 21);
-- 无论引擎:id = 1

三、DQL:数据查询语言

DQL 用于从数据库中检索数据,主要通过 SELECT 语句实现。以下讲解 SELECT 的核心用法,包括简单查询、特定字段查询、别名、去重和条件查询。

1. 简单单表查询

查询整个表
SELECT * FROM student;
  • 作用:返回 student 表的所有列和记录。

  • 示例输出

    (假设表如上):

    id | name    | age
    1  | Alice   | 20
    2  | Bob     | 22
    

注意* 适合快速查看,但生产环境中建议明确指定列以提高性能。

查询特定字段
SELECT name, age FROM student;
  • 作用:只返回 nameage 列。

  • 示例输出

    name    | age
    Alice   | 20
    Bob     | 22
    
给结果起别名

使用 AS 关键字为列或表达式指定别名:

SELECT name AS student_name, age AS student_age FROM student;
  • 输出

    student_name | student_age
    Alice        | 20
    Bob          | 22
    

别名提高可读性,常用在复杂查询或报表生成中。

2. 函数:CONCAT

CONCAT 函数用于拼接字符串,语法如下:

SELECT CONCAT(column1, ' ', column2) AS result FROM table_name;
示例

需求:将学生的姓名和年龄拼接为一个字符串。

SELECT CONCAT(name, ' is ', age, ' years old') AS info FROM student;

输出

info
Alice is 20 years old
Bob is 22 years old

注意

  • 不同数据库对 CONCAT 的支持略有差异(如 MySQL 支持多参数,SQL Server 使用 +)。
  • 可结合其他函数(如 CAST)处理非字符串类型。

3. 去重:DISTINCT

DISTINCT 用于去除查询结果中的重复行,语法如下:

SELECT DISTINCT column1, column2 FROM table_name;
示例

需求:查询所有不同的年龄。

SELECT DISTINCT age FROM student;

假设数据

idnameage
1Alice20
2Bob22
3Charlie20

输出

age
20
22

注意

  • DISTINCT 作用于整行(多列时考虑组合)。
  • 对性能有一定影响,尽量在必要时使用。

4. WHERE 条件子句

WHERE 用于过滤满足条件的记录,语法如下:

SELECT column1, column2
FROM table_name
WHERE condition;
示例

需求:查询年龄大于 20 的学生。

SELECT name, age
FROM student
WHERE age > 20;

输出

name | age
Bob  | 22

常见条件

  • 比较:=, >, <, >=, <=, !=
  • 逻辑:AND, OR, NOT
  • 范围:BETWEEN ... AND ...
  • 集合:IN (value1, value2)
  • 模糊匹配:LIKE '%pattern%'
综合示例

需求:查询年龄为 20 或 22 的学生,拼接姓名和年龄,去重后显示。

SELECT DISTINCT CONCAT(name, ' is ', age) AS info
FROM student
WHERE age IN (20, 22);

输出

info
Alice is 20
Bob is 22
Charlie is 20

四、实际应用场景

  1. 数据清理
    • 使用 DELETE 移除无效记录(如 WHERE created_date < '2020-01-01')。
    • 使用 TRUNCATE 重置测试环境数据。
  2. 数据更新
    • UPDATE 批量修改用户信息(如 SET status = 'active' WHERE last_login > '2023-01-01')。
  3. 报表生成
    • SELECT 结合 CONCATDISTINCT 生成用户统计报表。
    • 使用 WHERE 过滤特定条件的数据。

五、注意事项与优化技巧

  1. DML 操作
    • 事务管理DELETEUPDATE 应在事务中执行,确保可回滚。
    • 日志监控DELETE 操作可能导致日志文件过大,定期清理。
    • 备份:执行 TRUNCATE 前备份数据,因无法回滚。
  2. DQL 查询
    • 索引优化:为 WHERE 条件中的列建立索引,提高查询效率。
    • 避免 SELECT \*:明确指定列,减少不必要的数据传输。
    • 去重性能DISTINCT 可能影响性能,优先考虑业务逻辑去重。
  3. 存储引擎选择
    • InnoDB:适合事务密集场景,自增列需注意重启行为。
    • MyISAM:适合读多写少场景,自增列更稳定。

六、总结

DML 和 DQL 是数据库操作的核心组成部分:

  • DMLUPDATE, DELETE, TRUNCATE)用于修改和删除数据,TRUNCATE 适合快速清空表,DELETE 提供更灵活的条件删除。
  • DQLSELECT)通过 WHEREDISTINCTCONCAT 等功能实现精确查询,满足多样化需求。

通过本文的讲解和示例,你应该能熟练掌握这些操作,并在实际项目中灵活运用。如果有更多疑问或高级用法需求,欢迎在评论区交流!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2340474.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

05--MQTT物联网协议

一、MQTT的概念 MQTT 协议快速入门 2025&#xff1a;基础知识和实用教程 | EMQ 1.MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;是一种轻量级、基于发布-订阅模式的消息传输协议&#xff0c;适用于资源受限的设备和低带宽、高延迟或不稳定的网络环境。它…

学习设计模式《二》——外观模式

一、基础概念 1.1、外观模式的简介 外观模式的本质是【封装交互、简化调用】&#xff1b; 外观模式的说明&#xff1a;就是通过引入一个外观类&#xff0c;在这个类里面定义客户端想要的简单方法&#xff0c;然后在这些方法里面实现&#xff1b;由外观类再去分别调用内部的多个…

永磁同步电机控制算法-VF控制

一、原理介绍 V/F 控制又称为恒压频比控制,给定VF 控制曲线 电压是频率的tt例函数 即控制电压跟随频率变化而变化以保持磁通恒定不变。 二、仿真模型 在MATLAB/simulink里面验证所提算法&#xff0c;搭建仿真。采用和实验中一致的控制周期1e-4&#xff0c;电机部分计算周期为…

qt 配置 mysql 驱动问题:Cannot load library qsqlmysql;QMYSQL driver not loaded

项目场景&#xff1a; 环境版本&#xff1a; qt &#xff1a;5.14.2 mysql&#xff1a;8.0 windows&#xff1a;10 提示&#xff1a;qt 配置 mysql 驱动&#xff1a; 项目场景&#xff1a;qt 配置 mysql 驱动 问题描述 提示&#xff1a;这里描述项目中遇到的问题&#xff1a;…

线性代数 | 知识点整理 Ref 2

注&#xff1a;本文为 “线性代数 | 知识点整理” 相关文章合辑。 因 csdn 篇幅合并超限分篇连载&#xff0c;本篇为 Ref 2。 略作重排&#xff0c;未整理去重。 图片清晰度限于引文原状。 如有内容异常&#xff0c;请看原文。 【数学】线性代数知识点总结 阿巴 Jun 于 2024-…

华为OD机试真题——最小的调整次数/特异性双端队列(2025A卷:100分)Java/python/JavaScript/C++/C语言/GO六种最佳实现

2025 A卷 100分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析&#xff1b; 并提供Java、python、JavaScript、C、C语言、GO六种语言的最佳实现方式&#xff01; 2025华为OD真题目录全流程解析/备考攻略/经验分享 华为OD机试真题《最小的调…

Flink-01学习 介绍Flink及上手小项目之词频统计

flink简介 官网 概述&#xff1a; 学习Flink具体包括四个关键概念&#xff1a;流数据的持续处理&#xff0c;事件时间&#xff0c;有状态流处理和状态快照。 Apache Flink 是一个开源的流处理框架&#xff0c;旨在处理批处理和实时数据处理&#xff0c;具有高吞吐量和低延迟的…

目标检测篇---R-CNN梳理

目标检测系列文章 第一章 R-CNN 目录 目标检测系列文章&#x1f4c4; 论文标题&#x1f9e0; 论文逻辑梳理1. 引言部分梳理 (动机与思想) &#x1f4dd; 三句话总结&#x1f50d; 方法逻辑梳理&#x1f680; 关键创新点&#x1f517; 方法流程图补充边界框回归 (BBR)1. BBR 的…

C#处理网络传输中不完整的数据流

1、背景 在读取byte数组的场景&#xff08;例如&#xff1a;读取文件、网络传输数据&#xff09;中&#xff0c;特别是网络传输的场景中&#xff0c;非常有可能接收了不完整的byte数组&#xff0c;在将byte数组转换时&#xff0c;因字符的缺失/增多&#xff0c;转为乱码。如下…

HTML 初识

段落标签 <p><!-- 段落标签 -->Lorem ipsum dolor sit amet consectetur adipisicing elit. Fugiat, voluptate iure. Obcaecati explicabo sint ipsum impedit! Dolorum omnis voluptas sint unde sed, ipsa molestiae quo sapiente quos et ad reprehenderit.&l…

MATLAB 训练CNN模型 yolo v4

学生对小车控制提出了更好的要求&#xff0c;能否加入深度学习模型。 考虑到小车用matlab来做&#xff0c;yolo v5及以上版本都需要在pytorch下训练&#xff0c;还是用早期版本来演示。 1 yolov4 调用 参考 trainYOLOv4ObjectDetector (mathworks.com) name "tiny-yo…

【前端】跟着maxkb学习logicflow流程图画法

文章目录 背景1. 选定学习对象-maxkb应用逻辑编排2. 确定实现框架3. 关键逻辑&#xff1a;查看app-node.js4. 学习开始节点绘制流程数据形式 5. 给节点增加表单输入框遇到过的问题 背景 看看前端如何绘制流程图&#xff0c;界面好看点。 "logicflow/core": "1.…

【漏洞复现】CVE-2024-38856(ApacheOfbiz RCE)

【漏洞复现】CVE-2024-38856&#xff08;ApacheOfbiz RCE&#xff09; 1. 漏洞描述 Apache OFBiz 是一个开源的企业资源规划&#xff08;ERP&#xff09;系统。它提供了一套企业应用程序&#xff0c;用于集成和自动化企业的许多业务流程。 这个漏洞是由于对 CVE-2023-51467 的…

超详细VMware虚拟机扩容磁盘容量-无坑版

1.环境&#xff1a; 虚拟机&#xff1a;VMware Workstation 17 Pro-17.5.2 Linux系统&#xff1a;Ubuntu 22.04 LTS 2.硬盘容量 虚拟机当前硬盘容量180G -> 扩展至 300G 3.操作步骤 &#xff08;1&#xff09;在虚拟机关机的状态下&#xff0c;虚拟机硬盘扩容之前必…

全面理解Linux 系统日志:核心文件与查看方法

全文目录 1 Linux 系统日志分类及功能1.1 通用日志1.1.1 ‌/var/log/messages1.1.2 ‌/var/log/syslog 1.2 安全相关日志1.2.1 ‌/var/log/auth.log‌&#xff08;Debian/Ubuntu&#xff09;或 ‌/var/log/secure‌&#xff08;RHEL/CentOS&#xff09;1.2.2 /var/log/audit/au…

机器学习-08-关联规则更新

总结 本系列是机器学习课程的系列课程&#xff0c;主要介绍机器学习中关联规则和协同过滤。 参考 机器学习&#xff08;三&#xff09;&#xff1a;Apriori算法&#xff08;算法精讲&#xff09; Apriori 算法 理论 重点 【手撕算法】【Apriori】关联规则Apriori原理、代码…

Flutter与FastAPI的OSS系统实现

作者&#xff1a;孙嘉成 目录 一、对象存储 二、FastAPI与对象存储 2.1 缤纷云S4服务API对接与鉴权实现 2.2 RESTful接口设计与异步路由优化 三、Flutter界面与数据交互开发 3.1 应用的创建 3.2页面的搭建 3.3 文件的上传 关键词&#xff1a;对象存储、FastAPI、Flutte…

Kubernetes控制平面组件:API Server详解(二)

云原生学习路线导航页&#xff08;持续更新中&#xff09; kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计&#xff08;一&#xff09;Kubernetes架构原则和对象设计&#xff08;二&#xff09;Kubernetes架构原则和对象设计&#xff08;三&#xff09;Kubernetes控…

MySQL-锁机制3-意向共享锁与意向排它锁、死锁

文章目录 一、意向锁二、死锁应该如何避免死锁问题&#xff1f; 总结 一、意向锁 在表获取共享锁或者排它锁时&#xff0c;需要先检查该表有没有被其它事务获取过X锁&#xff0c;通过意向锁可以避免大量的行锁扫描&#xff0c;提升表获取锁的效率。意向锁是一种表级锁&#xf…

报告系统状态的连续日期 mysql + pandas(连续值判断)

本题用到知识点&#xff1a;row_number(), union, date_sub(), to_timedelta()…… 目录 思路 pandas Mysql 思路 链接&#xff1a;报告系统状态的连续日期 思路&#xff1a; 判断连续性常用的一个方法&#xff0c;增量相同的两个列的差值是固定的。 让日期与行号 * 天数…