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

深入理解 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.mzph.cn/news/902373.shtml

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

相关文章

MongoDB数据库的安装到入门使用详细讲解

本篇文章主要讲解MongoDB的安装使用教程及基础的数据库管理和操作能力的讲解,通过本篇文章您可以快速的掌握对MongDB数据库的基本认识及,基础开发能力。 一、MongoDB介绍 MongoDB是一款免费开源的非关系型数据库,该数据库适应于复杂关系的存储和管理,非常适合数据结构复杂…

git提交实现文件或目录忽略

前言 开发中使用git下载项目代码开发,存在不需要提交文件或目录&#xff0c;这里记录下ideajava项目开发添加以下配置可忽略不需要提交文件,以方便我们提交代码时&#xff0c;查看及提交文件只涉及项目代码修改文件。 git提交实现文件或目录忽略 .gitignore 文件的内容列出了在…

go语言的八股文

1.go语言触发异常的场景有哪些 运行时错误 1.空指针解引用&#xff1a;尝试访问一个未初始化的指针指向的内存&#xff0c;会导致程序崩溃并触发异常。 2.数组越界访问&#xff1a;试图访问数组中不存在的索引&#xff0c;比如数组长度为5&#xff0c;却尝试访问索引为10的元素…

Ubuntu安装MySQL步骤及注意事项

一、安装前准备 1. 系统更新&#xff1a;在安装 MySQL 之前&#xff0c;确保你的 Ubuntu 系统软件包是最新的&#xff0c;这能避免因软件包版本问题导致的安装错误&#xff0c;并获取最新的安全补丁。打开终端&#xff0c;执行以下两条命令&#xff1a; sudo apt update sudo …

【愚公系列】《Python网络爬虫从入门到精通》054-Scrapy 文件下载

&#x1f31f;【技术大咖愚公搬代码&#xff1a;全栈专家的成长之路&#xff0c;你关注的宝藏博主在这里&#xff01;】&#x1f31f; &#x1f4e3;开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主&#xff01; &#x1f…

2025最新︱中国信通院静态应用程序安全测试(SAST)工具能力评估,悬镜安全灵脉AI通过评估!

背景 研发运营安全&#xff08;DevSecOps&#xff09;从研发运营&#xff08;DevOps&#xff09;的概念延伸和演变而来&#xff0c;其核心理念是将安全贯穿从开发到运营的软件开发生命周期的每一个环节&#xff0c;在每个阶段自动实施安全措施&#xff0c;从而实现快速开发交付…

辛格迪客户案例 | 浙江高跖医药委托生产质量管理协同(OWL MAH)项目

一、案例概述 浙江高跖医药科技股份有限公司是一家集“研、产、销”为一体的专业化药品持证企业。高跖医药自成立之初就建立并运行着一套相对完善的质量管理体系&#xff0c;涵盖了药品的研发、生产监管及销售。高跖医药于2022年选择实施了辛格迪的“委托生产质量管理协同解决…

【NLP 65、实践 ⑯ 基于Agent优化文章】

羁绊由我而起&#xff0c;痛苦也由我承担 —— 25.4.18 一、⭐【核心函数】定义大模型调用函数 call_large_model prompt&#xff1a;用户传入的提示词&#xff08;如 “请分析这篇作文的主题”&#xff09;&#xff0c;指导模型执行任务 client&#xff1a;Zhipu…

【锂电池SOH估计】BP神经网络锂电池健康状态估计,锂电池SOH估计(Matlab完整源码和数据)

目录 效果一览程序获取程序内容研究内容基于BP神经网络的锂电池健康状态估计研究摘要关键词1. 引言1.1 研究背景1.2 研究意义1.3 研究目标2. 文献综述2.1 锂电池SOH估计理论基础2.2 传统SOH估计方法2.3 基于BP神经网络的SOH估计研究进展2.4 研究空白与创新点3. BP神经网络原理3…

2025第十六届蓝桥杯python B组满分题解(详细)

目录 前言 A: 攻击次数 解题思路&#xff1a; 代码&#xff1a; B: 最长字符串 解题思路&#xff1a; 代码&#xff1a; C: LQ图形 解题思路&#xff1a; 代码&#xff1a; D: 最多次数 解题思路&#xff1a; 代码&#xff1a; E: A * B Problem 解题思路&…

第十二节:原理深挖-React Fiber架构核心思想

链表结构、时间切片&#xff08;Time Slicing&#xff09; 优先级调度实现&#xff08;如用户输入>网络请求&#xff09; React Fiber架构深度解析&#xff1a;从链表到优先级调度的革命性升级 一、Fiber架构核心设计思想 React Fiber是React 16的底层协调算法重构&#x…

你学会了些什么211201?--http基础知识

概念 HTTP–Hyper Text Transfer Protocol&#xff0c;超文本传输协议&#xff1b;是一种建立在TCP上的无状态连接&#xff08;短连接&#xff09;。 整个基本的工作流程是&#xff1a;客户端发送一个HTTP请求&#xff08;Request &#xff09;&#xff0c;这个请求说明了客户端…

MCU开发学习记录8 - 基本定时器学习与实践(HAL库) - 定时器DMA循环模式修改ARR值、定时器中断方式修改ARR值 - STM32CubeMX

名词解释&#xff1a; TRGO&#xff1a;Trigger Out General Purpose Output ARR&#xff1a;Auto-reload PSC&#xff1a;Prescaler CNT&#xff1a;Counter EGR&#xff1a;event generation register 本文将介绍基本定时器的概念、相关函数以及STM32CubeMX生成定时器的配置…

考研系列-计算机网络冲刺考点汇总(上)

写在前面 本文将总结王道408考研课程的计算机网络冲刺考点的第一章到第三章内容&#xff08;计算机网络体系结构、物理层、数据链路层&#xff09;。【图片较多&#xff0c;加载需要时间&#xff0c;可以提前打开加载~~】 第一章、计算机网络体系结构 注意&#xff1a;PCI(头部…

设计模式每日硬核训练 Day 14:组合模式(Composite Pattern)完整讲解与实战应用

&#x1f504; 回顾 Day 13&#xff1a;桥接模式小结 在 Day 13 中&#xff0c;我们学习了桥接模式&#xff08;Bridge Pattern&#xff09;&#xff1a; 用于将“抽象”与“实现”分离&#xff0c;适用于双维度变化场景&#xff08;如图形类型 渲染方式&#xff09;。它强调…

讯联桌面TV版apk下载-讯联桌面安卓电视版免费下载安装教程

在智能电视的使用过程中&#xff0c;一款好用的桌面应用能极大提升我们的使用体验。讯联桌面 TV 版就是这样一款备受关注的应用&#xff0c;它可以让安卓电视拥有更个性化、便捷的操作界面。今天&#xff0c;就为大家详细介绍讯联桌面 TV 版 apk 的免费下载安装教程。 一、下载…

Nginx知识点

Nginx发展历史 Nginx 是由俄罗斯程序员 Igor Sysoev 开发的高性能开源 Web 服务器、反向代理服务器和负载均衡器 &#xff0c;其历史如下&#xff1a; 起源与早期开发&#xff08;2002 - 2004 年&#xff09; 2002 年&#xff0c;当时 Igor Sysoev 在为俄罗斯门户网站 Rambl…

uview1.0 tabs组件放到u-popup中在微信小程序中滑块样式错乱

解决思路 重新计算布局信息&#xff1a;在弹窗显示后重新调用 init 方法来计算组件的布局信息。使用 nextTick&#xff1a;保证在视图更新之后再进行布局信息的计算。 <u-tabs ref"tabsRef" ></u-tabs> makeClick(){this.makeShowtruethis.$nextTick…

腾讯一面-软件开发实习-PC客户端开发方向

1.自我介绍就不多赘述了 2. 请介绍一下你的项目经历 - 介绍了专辑鉴赏项目&#xff0c;前端使用html语言编写&#xff0c;后端基于http协议使用C语言进行网页开发。此外&#xff0c;还提及项目中涉及处理多线程问题以及做过内存池管理项目。 3. 项目中HTTP协议是使用库实现的…

[数据可视化] Datagear使用心得:从数据整备到可视化联动实践

Datagear 是一款功能强大的数据可视化与报表工具&#xff0c;在日常数据分析与展示过程中&#xff0c;能有效帮助用户构建交互式报表与面板。本文结合实际使用场景&#xff0c;总结了在 Datagear 平台上关于元数据整备、Board 面板设计、图表嵌入等方面的使用经验&#xff0c;供…