深入理解 DML 和 DQL:SQL 数据操作与查询全解析
深入理解 DML 和 DQL:SQL 数据操作与查询全解析
在数据库管理中,SQL(结构化查询语言)是操作和查询数据的核心工具。其中,DML(Data Manipulation Language,数据操作语言) 和 DQL(Data Query Language,数据查询语言) 是最常用的子集。DML 负责数据的插入、更新和删除,而 DQL 专注于数据查询。本文将详细讲解 DML 和 DQL 的核心操作,包括 UPDATE、DELETE、TRUNCATE、SELECT,以及相关函数和子句,结合示例帮助你快速上手。
一、DML:数据操作语言
DML 用于操作数据库中的数据,主要包括以下操作:
- 插入(INSERT):向表中添加新记录。
- 更新(UPDATE):修改表中已有记录。
- 删除(DELETE):移除表中记录。
以下重点讲解 UPDATE 和 DELETE,并深入分析 TRUNCATE 与 DELETE 的区别。
1. UPDATE:修改数据
UPDATE 用于修改表中符合条件的记录,语法如下:
UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition;
- 作用:更新指定列的值。
- 注意:
WHERE子句指定更新的范围,未指定会导致全表更新。
示例
假设有一个 student 表:
| id | name | age |
|---|---|---|
| 1 | Alice | 20 |
| 2 | Bob | 22 |
| 3 | Charlie | 20 |
需求:将年龄为 20 的学生年龄改为 21。
UPDATE student
SET age = 21
WHERE age = 20;
结果:
| id | name | age |
|---|---|---|
| 1 | Alice | 21 |
| 2 | Bob | 22 |
| 3 | Charlie | 21 |
注意:
- 没有
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;
结果:
| id | name | age |
|---|---|---|
| 2 | Bob | 22 |
注意:
- 删除后,表结构和索引保留,数据可通过事务回滚(如果在事务中)。
- 自增列计数器行为因存储引擎不同而异(详见下文)。
3. TRUNCATE:清空表
TRUNCATE 用于完全清空表中的数据,语法如下:
TRUNCATE TABLE table_name;
- 作用:删除表中所有记录,重置表到初始状态。
- 注意:无法指定条件,总是清空整个表。
示例
需求:清空 student 表。
TRUNCATE TABLE student;
结果:
- 表变为空,结构保留。
- 自增列计数器重置为 1。
二、TRUNCATE 与 DELETE 的区别
TRUNCATE 和 DELETE 都可以删除数据,但有显著差异。以下是详细对比:
| 特性 | DELETE | TRUNCATE |
|---|---|---|
| 删除范围 | 可通过 WHERE 删除部分记录 | 删除整个表,无条件 |
| 速度 | 较慢,逐行删除,记录日志 | 更快,直接重建表结构 |
| 事务支持 | 支持事务,可回滚 | 不影响事务,无法回滚 |
| 自增列计数器 | 不重置,保留上次值 | 重置为 1 |
| 触发器 | 触发 DELETE 触发器 | 不触发触发器 |
| 外键约束 | 支持(受外键限制) | 不支持(表有外键时无法使用) |
| 日志记录 | 记录每行操作,占用日志空间 | 仅记录表结构变更,日志少 |
TRUNCATE 的优势
- 速度快:
TRUNCATE直接重建表结构,效率高于逐行删除的DELETE。 - 重置自增列:适合需要重置主键计数器的场景(如测试环境清空数据)。
- 不影响事务:执行后不记录逐行日志,节省日志空间。
- 低资源占用:适合快速清空大表。
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;
-
作用:只返回
name和age列。 -
示例输出
:
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;
假设数据:
| id | name | age |
|---|---|---|
| 1 | Alice | 20 |
| 2 | Bob | 22 |
| 3 | Charlie | 20 |
输出:
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
四、实际应用场景
- 数据清理:
- 使用
DELETE移除无效记录(如WHERE created_date < '2020-01-01')。 - 使用
TRUNCATE重置测试环境数据。
- 使用
- 数据更新:
UPDATE批量修改用户信息(如SET status = 'active' WHERE last_login > '2023-01-01')。
- 报表生成:
SELECT结合CONCAT和DISTINCT生成用户统计报表。- 使用
WHERE过滤特定条件的数据。
五、注意事项与优化技巧
- DML 操作:
- 事务管理:
DELETE和UPDATE应在事务中执行,确保可回滚。 - 日志监控:
DELETE操作可能导致日志文件过大,定期清理。 - 备份:执行
TRUNCATE前备份数据,因无法回滚。
- 事务管理:
- DQL 查询:
- 索引优化:为
WHERE条件中的列建立索引,提高查询效率。 - 避免
SELECT \*:明确指定列,减少不必要的数据传输。 - 去重性能:
DISTINCT可能影响性能,优先考虑业务逻辑去重。
- 索引优化:为
- 存储引擎选择:
- InnoDB:适合事务密集场景,自增列需注意重启行为。
- MyISAM:适合读多写少场景,自增列更稳定。
六、总结
DML 和 DQL 是数据库操作的核心组成部分:
- DML(
UPDATE,DELETE,TRUNCATE)用于修改和删除数据,TRUNCATE适合快速清空表,DELETE提供更灵活的条件删除。 - DQL(
SELECT)通过WHERE、DISTINCT、CONCAT等功能实现精确查询,满足多样化需求。
通过本文的讲解和示例,你应该能熟练掌握这些操作,并在实际项目中灵活运用。如果有更多疑问或高级用法需求,欢迎在评论区交流!
相关文章:
深入理解 DML 和 DQL:SQL 数据操作与查询全解析
深入理解 DML 和 DQL:SQL 数据操作与查询全解析 在数据库管理中,SQL(结构化查询语言)是操作和查询数据的核心工具。其中,DML(Data Manipulation Language,数据操作语言) 和 DQL&…...
05--MQTT物联网协议
一、MQTT的概念 MQTT 协议快速入门 2025:基础知识和实用教程 | EMQ 1.MQTT(Message Queuing Telemetry Transport)是一种轻量级、基于发布-订阅模式的消息传输协议,适用于资源受限的设备和低带宽、高延迟或不稳定的网络环境。它…...
学习设计模式《二》——外观模式
一、基础概念 1.1、外观模式的简介 外观模式的本质是【封装交互、简化调用】; 外观模式的说明:就是通过引入一个外观类,在这个类里面定义客户端想要的简单方法,然后在这些方法里面实现;由外观类再去分别调用内部的多个…...
永磁同步电机控制算法-VF控制
一、原理介绍 V/F 控制又称为恒压频比控制,给定VF 控制曲线 电压是频率的tt例函数 即控制电压跟随频率变化而变化以保持磁通恒定不变。 二、仿真模型 在MATLAB/simulink里面验证所提算法,搭建仿真。采用和实验中一致的控制周期1e-4,电机部分计算周期为…...
qt 配置 mysql 驱动问题:Cannot load library qsqlmysql;QMYSQL driver not loaded
项目场景: 环境版本: qt :5.14.2 mysql:8.0 windows:10 提示:qt 配置 mysql 驱动: 项目场景:qt 配置 mysql 驱动 问题描述 提示:这里描述项目中遇到的问题:…...
MyBatis-Plus 实战:优雅处理 JSON 字段映射(以 JSONArray 为例)
🎯MyBatis-Plus 实战:优雅处理 JSON 字段映射(以 JSONArray 为例) 👨💻 作者:William Dawson |📅 更新日期:2025-04-21 🚀 标签:MyB…...
线性代数 | 知识点整理 Ref 2
注:本文为 “线性代数 | 知识点整理” 相关文章合辑。 因 csdn 篇幅合并超限分篇连载,本篇为 Ref 2。 略作重排,未整理去重。 图片清晰度限于引文原状。 如有内容异常,请看原文。 【数学】线性代数知识点总结 阿巴 Jun 于 2024-…...
PyTorch深度学习框架60天进阶学习计划 - 第47天:模型压缩蒸馏技术(一)
PyTorch深度学习框架60天进阶学习计划 - 第47天:模型压缩蒸馏技术(一) 第一部分:知识蒸馏的温度调节机制详解 欢迎来到我们学习计划的第47天!今天我们将深入探讨模型压缩技术中的两个重要方法:知识蒸馏和…...
华为OD机试真题——最小的调整次数/特异性双端队列(2025A卷:100分)Java/python/JavaScript/C++/C语言/GO六种最佳实现
2025 A卷 100分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析; 并提供Java、python、JavaScript、C、C语言、GO六种语言的最佳实现方式! 2025华为OD真题目录全流程解析/备考攻略/经验分享 华为OD机试真题《最小的调…...
java+postgresql+swagger-多表关联insert操作(九)
入参为json,然后根据需要对多张表进行操作: 入参格式: {"username": "车主01","usertel": "11111111111","useridtype": "2","useridcard": null,"proname&qu…...
[密码学基础]国密算法深度解析:中国密码标准的自主化之路
国密算法深度解析:中国密码标准的自主化之路 国密算法(SM系列算法)是中国自主研发的密码技术标准体系,旨在打破国际密码技术垄断,保障国家信息安全。本文将从技术原理、应用场景和生态发展三个维度,全面解…...
Flink-01学习 介绍Flink及上手小项目之词频统计
flink简介 官网 概述: 学习Flink具体包括四个关键概念:流数据的持续处理,事件时间,有状态流处理和状态快照。 Apache Flink 是一个开源的流处理框架,旨在处理批处理和实时数据处理,具有高吞吐量和低延迟的…...
自注意力机制、多头自注意力机制、填充掩码 Python实现
原理讲解 【Transformer系列(2)】注意力机制、自注意力机制、多头注意力机制、通道注意力机制、空间注意力机制超详细讲解 自注意力机制 import torch import torch.nn as nn# 自注意力机制 class SelfAttention(nn.Module):def __init__(self, input…...
目标检测篇---R-CNN梳理
目标检测系列文章 第一章 R-CNN 目录 目标检测系列文章📄 论文标题🧠 论文逻辑梳理1. 引言部分梳理 (动机与思想) 📝 三句话总结🔍 方法逻辑梳理🚀 关键创新点🔗 方法流程图补充边界框回归 (BBR)1. BBR 的…...
C#处理网络传输中不完整的数据流
1、背景 在读取byte数组的场景(例如:读取文件、网络传输数据)中,特别是网络传输的场景中,非常有可能接收了不完整的byte数组,在将byte数组转换时,因字符的缺失/增多,转为乱码。如下…...
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
学生对小车控制提出了更好的要求,能否加入深度学习模型。 考虑到小车用matlab来做,yolo v5及以上版本都需要在pytorch下训练,还是用早期版本来演示。 1 yolov4 调用 参考 trainYOLOv4ObjectDetector (mathworks.com) name "tiny-yo…...
【前端】跟着maxkb学习logicflow流程图画法
文章目录 背景1. 选定学习对象-maxkb应用逻辑编排2. 确定实现框架3. 关键逻辑:查看app-node.js4. 学习开始节点绘制流程数据形式 5. 给节点增加表单输入框遇到过的问题 背景 看看前端如何绘制流程图,界面好看点。 "logicflow/core": "1.…...
数据结构-C语言版本(八)字符串
数据结构中的字符串:概念、操作与实战 第一部分 字符串的分类及常见形式 字符串是由零个或多个字符组成的有限序列,是编程中最基础也最重要的数据结构之一。 1. C语言中的字符串表示 字符数组形式 char str1[10] {H, e, l, l, o, \0};字符串字面量…...
Arduino示例代码讲解:Project 07 - Keyboard 键盘
Arduino示例代码讲解:Project 07 - Keyboard 键盘 Project 07 - Keyboard 键盘程序功能概述功能:硬件要求:输出:代码结构全局变量`setup()` 函数`loop()` 函数读取电位器值:打印电位器值:播放音调:运行过程注意事项Project 07 - Keyboard 键盘 /*Arduino Starter Kit e…...
oracle expdp/impdp 用法详解
oracle expdp/impdp 用法详解 创建逻辑目录,该命令不会在操作系统创建真正的目录,最好以system等管理员创建。 create directory db_bak as d:\test\dump; 查看管理理员目录(同时查看操作系统是否存在,因为Oracle并不关心该目录是…...
【漏洞复现】CVE-2024-38856(ApacheOfbiz RCE)
【漏洞复现】CVE-2024-38856(ApacheOfbiz RCE) 1. 漏洞描述 Apache OFBiz 是一个开源的企业资源规划(ERP)系统。它提供了一套企业应用程序,用于集成和自动化企业的许多业务流程。 这个漏洞是由于对 CVE-2023-51467 的…...
超详细VMware虚拟机扩容磁盘容量-无坑版
1.环境: 虚拟机:VMware Workstation 17 Pro-17.5.2 Linux系统:Ubuntu 22.04 LTS 2.硬盘容量 虚拟机当前硬盘容量180G -> 扩展至 300G 3.操作步骤 (1)在虚拟机关机的状态下,虚拟机硬盘扩容之前必…...
每日一题算法——移除链表元素、反转链表
移除链表元素 力扣题目链接 我的解法: 注意细节:要删掉移除的元素。 class Solution { public:ListNode* removeElements(ListNode* head, int val) {while(head!nullptr){if(head->valval){headhead->next;}}ListNode* nowhead head;while(n…...
全面理解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(Debian/Ubuntu)或 /var/log/secure(RHEL/CentOS)1.2.2 /var/log/audit/au…...
机器学习-08-关联规则更新
总结 本系列是机器学习课程的系列课程,主要介绍机器学习中关联规则和协同过滤。 参考 机器学习(三):Apriori算法(算法精讲) Apriori 算法 理论 重点 【手撕算法】【Apriori】关联规则Apriori原理、代码…...
Flutter与FastAPI的OSS系统实现
作者:孙嘉成 目录 一、对象存储 二、FastAPI与对象存储 2.1 缤纷云S4服务API对接与鉴权实现 2.2 RESTful接口设计与异步路由优化 三、Flutter界面与数据交互开发 3.1 应用的创建 3.2页面的搭建 3.3 文件的上传 关键词:对象存储、FastAPI、Flutte…...
Kubernetes控制平面组件:API Server详解(二)
云原生学习路线导航页(持续更新中) kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计(一)Kubernetes架构原则和对象设计(二)Kubernetes架构原则和对象设计(三)Kubernetes控…...
MySQL-锁机制3-意向共享锁与意向排它锁、死锁
文章目录 一、意向锁二、死锁应该如何避免死锁问题? 总结 一、意向锁 在表获取共享锁或者排它锁时,需要先检查该表有没有被其它事务获取过X锁,通过意向锁可以避免大量的行锁扫描,提升表获取锁的效率。意向锁是一种表级锁…...
报告系统状态的连续日期 mysql + pandas(连续值判断)
本题用到知识点:row_number(), union, date_sub(), to_timedelta()…… 目录 思路 pandas Mysql 思路 链接:报告系统状态的连续日期 思路: 判断连续性常用的一个方法,增量相同的两个列的差值是固定的。 让日期与行号 * 天数…...
