数据库系统概论(十三)详细讲解SQL中数据更新(插入,修改与更新)
数据库系统概论(十三)详细讲解SQL中数据更新
- 前言
- 一、数据插入
- 1. 插入数据是什么?
- 2.插入单条数据(插入元组)
- 场景 1:指定部分列插入
- 场景 2:不指定列名(插入所有列)
- 场景 3:插入部分列(其他列自动填默认值或空值)
- 3. 插入多条数据
- 4. 插入子查询结果(从其他表获取数据插入)
- 5. 插入数据时的完整性检查
- 二、修改数据
- 1. 修改数据是什么?
- 2. 基本语法
- 3. 修改数据的三种场景
- (1)修改某一条记录(单个元组)
- (2)批量修改多条记录
- (3)结合子查询修改(高级用法)
- 4. 修改数据的注意事项
- 5. 进阶技巧:三种等价的子查询写法
- (1) IN子查询(最常用)
- (2) 关联子查询(逐行匹配)
- (3) EXISTS子查询(存在性判断)
- 三、删除数据
- 1. 删除数据的概念
- 2. 基本语法
- 3. 删除数据的三种场景
- (1) 删除某一条记录(单个元组)
- (2) 批量删除多条记录
- (3) 结合子查询删除(跨表关联删除)
- 4. 注意事项
- 5. 进阶技巧:两种子查询写法对比
- (1)IN子查询(推荐,简洁高效)
- (2)关联子查询(逐行检查)
前言
- 在前几期博客中,我们探讨了 SQL 连接查询,单表查询,嵌套查询,集合查询,基于派生表的查询技术等知识点。
- 从本节开始,我们将深入讲解 SQL 中数据插入,修改与删除的知识点。
我的个人主页,欢迎来阅读我的其他文章
https://blog.csdn.net/2402_83322742?spm=1011.2415.3001.5343
我的数据库系统概论专栏
https://blog.csdn.net/2402_83322742/category_12911520.html?spm=1001.2014.3001.5482
一、数据插入
1. 插入数据是什么?
插入数据 就是向数据库表中添加新的记录(一行数据),可以是 单条数据 或 批量数据,也可以从其他表查询结果中插入数据。
2.插入单条数据(插入元组)
基本语法
INSERT INTO 表名 [(列1, 列2, ...)] VALUES (值1, 值2, ...);
- 表名:要插入数据的表。
- 列名(可选):指定要插入数据的列(顺序可以和表定义不同)。
- VALUES:对应列的值(类型和个数必须匹配列)。
场景示例
场景 1:指定部分列插入
-- 表结构:Student(学号Sno, 姓名Sname, 性别Ssex, 出生日期Sbirthdate, 主修专业Smajor)
INSERT INTO Student (Sno, Sname, Ssex, Smajor, Sbirthdate)
VALUES ('20180009', '陈冬', '男', '信息管理与信息系统', '2000-5-22');
- 说明:列名顺序和表定义不同(如
Smajor
提前),但VALUES
顺序要和列名一一对应。
场景 2:不指定列名(插入所有列)
INSERT INTO Student VALUES ('20180008', '张成民', '男', '2000-4-15', '计算机科学与技术');
- 要求:必须按表定义的列顺序,提供 所有列的值(包括默认值列)。
场景 3:插入部分列(其他列自动填默认值或空值)
-- 表结构:SC(学号Sno, 课程号Cno, 成绩Grade, 选学期Semester, 教学班Teachingclass)
INSERT INTO SC(Sno, Cno, Semester, Teachingclass)
VALUES ('20180005', '81004', '20202', '81004-01');
- 说明:未指定的
Grade
列会自动填 NULL(前提是该列允许为空)。
3. 插入多条数据
语法
INSERT INTO 表名 [(列1, 列2, ...)]
VALUES (值1, 值2, ...),
(值3, 值4, ...),
...; -- 用逗号分隔多个元组
示例
INSERT INTO SC VALUES
('200215125', '2', 86, ...),
('200215125', '8', 77, ...),
('200215126', '2', 60, ...);
- 优势:一次性插入多条数据,效率更高。
4. 插入子查询结果(从其他表获取数据插入)
语法
INSERT INTO 表名 [(列1, 列2, ...)]
子查询; -- 子查询的结果作为要插入的数据
场景示例
需求:统计每个专业学生的平均年龄,存入新表 Smajor_age
。
- 先创建目标表:
CREATE TABLE Smajor_age (Smajor VARCHAR(20), -- 专业名Avg_age SMALLINT -- 平均年龄 );
- 用子查询插入数据:
INSERT INTO Smajor_age(Smajor, Avg_age) SELECT Smajor, AVG(TIMESTAMPDIFF(YEAR, Sbirthdate, CURDATE())) -- 计算年龄差 FROM Student GROUP BY Smajor; -- 按专业分组统计
- 关键:子查询的列数和类型必须与
INSERT INTO
的列匹配。
5. 插入数据时的完整性检查
数据库在插入数据时会自动检查以下规则,若违反则插入失败:
- 实体完整性
- 主键列(如学号)必须 唯一且非空。
- 参照完整性
- 外键列(如选课表的学号)必须对应另一表中存在的值(如学生表中已有的学号)。
- 用户定义的完整性
- NOT NULL:非空列必须提供值(如姓名不能为空)。
- UNIQUE:唯一列值不能重复(如身份证号)。
- 值域约束:值必须在指定范围内(如成绩在 0-100 之间)。
二、修改数据
1. 修改数据是什么?
修改数据就是对数据库表中已存在的记录进行更新,比如改名字、调整价格、修正错误数据等。
2. 基本语法
UPDATE 表名
SET 列1=值1, 列2=值2, ... -- 要修改的列和新值
WHERE 条件; -- 筛选需要修改的记录(可选)
- SET子句:指定要修改哪些列,以及新的值。
- WHERE子句(可选):只修改符合条件的记录;不写则修改全量数据。
3. 修改数据的三种场景
(1)修改某一条记录(单个元组)
需求:把学号为 20180001
的学生出生日期改为 2001-3-18
。
UPDATE Student
SET Sbirthdate = '2001-3-18'
WHERE Sno = '20180001';
- WHERE子句精准定位到一条记录,避免误改其他数据。
(2)批量修改多条记录
需求:给2020年第1学期选修 81002
课程的所有学生成绩减5分。
UPDATE SC
SET Grade = Grade - 5
WHERE Semester = '20201' AND Cno = '81002';
- WHERE子句筛选出符合条件的多条记录,统一修改。
(3)结合子查询修改(高级用法)
需求:把计算机科学与技术专业的所有学生成绩置零。
UPDATE SC
SET Grade = 0
WHERE Sno IN ( -- 关键:子查询查出目标学号SELECT Sno FROM Student WHERE Smajor = '计算机科学与技术'
);
- 子查询先从
Student
表找出计算机专业的学生学号,再用IN
匹配到SC
表中对应的记录。
4. 修改数据的注意事项
-
安全第一:先查后改
修改前先用SELECT
验证WHERE
条件是否正确,避免误改。
例如,确认计算机专业学生:SELECT Sno FROM Student WHERE Smajor = '计算机科学与技术';
-
完整性约束检查
数据库会自动验证修改后的数据是否符合规则:- 主键不能重复(如修改学号时,新学号不能已存在)。
- 外键必须存在(如修改选课记录的学号,该学号必须在学生表中存在)。
- 非空列不能改为NULL(如姓名列不允许为空)。
-
三种常见错误场景
错误场景 示例及后果 忘记写WHERE子句 UPDATE SC SET Grade = 0;
→ 全量数据的成绩都被置零!WHERE条件写错 UPDATE SC SET Grade = 0 WHERE Cno = '81002';
→ 误将其他课程成绩置零。子查询逻辑错误 子查询查出的学号范围不对,导致修改了不该改的记录。
5. 进阶技巧:三种等价的子查询写法
针对“计算机专业学生成绩置零”需求,有三种写法:
(1) IN子查询(最常用)
UPDATE SC
SET Grade = 0
WHERE Sno IN (SELECT Sno FROM Student WHERE Smajor = '计算机科学与技术');
(2) 关联子查询(逐行匹配)
UPDATE SC
SET Grade = 0
WHERE '计算机科学与技术' = (SELECT Smajor FROM Student WHERE Student.Sno = SC.Sno);
- 原理:逐行检查
SC
表的每条记录,通过Sno
关联到Student
表,判断专业是否匹配。
(3) EXISTS子查询(存在性判断)
UPDATE SC
SET Grade = 0
WHERE EXISTS (SELECT 1 FROM Student WHERE Student.Sno = SC.Sno AND Smajor = '计算机科学与技术'
);
- 原理:只要存在与
SC
表当前记录Sno
匹配且专业是计算机的学生,就修改当前记录。
三、删除数据
1. 删除数据的概念
删除数据就是从数据库表中移除已存在的记录(一行或多行),可以是单个记录、批量记录,或通过子查询关联其他表的数据进行删除。
2. 基本语法
DELETE FROM 表名 WHERE 条件;
- FROM 子句:指定要删除数据的表。
- WHERE 子句(可选):筛选需要删除的记录;不写则删除表中所有记录(但表结构保留,不会删表)。
3. 删除数据的三种场景
(1) 删除某一条记录(单个元组)
需求:删除学号为 20180007
的学生记录。
DELETE FROM Student WHERE Sno = '20180007';
- 关键:用
WHERE
精准定位单条记录,避免误删。
(2) 批量删除多条记录
需求:删除所有学生的选课记录(清空表)。
DELETE FROM SC; -- 不写WHERE,删除表中所有数据
- 注意:执行前务必确认,避免误删全表数据!
(3) 结合子查询删除(跨表关联删除)
需求:删除计算机科学与技术专业学生的所有选课记录。
DELETE FROM SC
WHERE Sno IN ( -- 子查询先找出计算机专业学生的学号SELECT Sno FROM Student WHERE Smajor = '计算机科学与技术'
);
- 逻辑:先从
Student
表获取目标学生的学号,再在SC
表中删除这些学号对应的选课记录。
4. 注意事项
-
安全第一:先查后删
删除前先用SELECT
验证WHERE
条件是否正确,避免误删。
例如,确认计算机专业学生学号:SELECT Sno FROM Student WHERE Smajor = '计算机科学与技术';
-
参照完整性约束
- 如果删除的表有外键关联其他表,可能会引发问题。
例如:删除Student
表中的学生记录时,若SC
表(选课表)中存在该学生的选课记录,直接删除会报错(因为外键约束要求选课记录的学号必须存在于学生表中)。 - 解决方案:
- 先删除子表(如
SC
)中关联的记录,再删除主表(如Student
)记录。 - 或在创建表时设置 级联删除(如
ON DELETE CASCADE
),自动删除关联数据。
- 先删除子表(如
- 如果删除的表有外键关联其他表,可能会引发问题。
-
三种常见错误场景
错误场景 示例及后果 忘记写WHERE子句 DELETE FROM SC;
→ 清空整个选课表,所有学生的成绩记录丢失!WHERE条件写错 DELETE FROM SC WHERE Cno = '81002';
→ 误删其他课程的选课记录。跨表删除未考虑外键 直接删除主表学生记录,导致子表选课记录出现“孤立数据”(外键值不存在)。
5. 进阶技巧:两种子查询写法对比
针对“删除计算机专业学生选课记录”需求,有两种等价写法:
(1)IN子查询(推荐,简洁高效)
DELETE FROM SC
WHERE Sno IN (SELECT Sno FROM Student WHERE Smajor = '计算机科学与技术');
- 适用场景:子查询结果是一个学号列表,直接匹配删除。
(2)关联子查询(逐行检查)
DELETE FROM SC
WHERE '计算机科学与技术' = (SELECT Smajor FROM Student WHERE Student.Sno = SC.Sno -- 通过Sno关联两张表
);
- 原理:逐行检查
SC
表的每条记录,通过学号关联到Student
表,判断专业是否匹配,匹配则删除。
以上就是这篇博客的全部内容,下一篇我们将继续探索更多精彩内容。
我的个人主页,欢迎来阅读我的其他文章
https://blog.csdn.net/2402_83322742?spm=1011.2415.3001.5343
我的数据库系统概论专栏
https://blog.csdn.net/2402_83322742/category_12911520.html?spm=1001.2014.3001.5482
非常感谢您的阅读,喜欢的话记得三连哦 |
相关文章:

数据库系统概论(十三)详细讲解SQL中数据更新(插入,修改与更新)
数据库系统概论(十三)详细讲解SQL中数据更新 前言一、数据插入1. 插入数据是什么?2.插入单条数据(插入元组)场景 1:指定部分列插入场景 2:不指定列名(插入所有列)场景 3&…...
JVMTI 在安卓逆向工程中的应用
JVMTI 在安卓逆向工程中的应用 JVMTI 在安卓逆向工程中扮演着重要角色,尤其是在分析和修改 Java 层应用行为时。以下是其核心应用场景、实现方式及典型工具: 一、核心应用场景 1. 动态代码注入与 hook 通过 JVMTI 可以在运行时修改或拦截 Java 方法&…...

极客时间-《搞定音频技术》-学习笔记
极客时间-《搞定音频技术》-学习笔记 语音基础知识 https://www.zhangzhenhu.com/audio/feature.html 序章-0 作者说这个语音技术啊,未来肯定前景大好啊,大家都来学习,然后给出了课程的脑图 音频基础 什么是声音 声音的三要素是指响度、…...

网络攻防技术十三:网络防火墙
文章目录 一、网络防火墙概述1、网络型防火墙(网络防火墙)2、Web应用防火墙3、数据库防火墙4、主机防火墙(个人防火墙)5、网络防火墙的功能 二、防火墙工作原理1、无状态包过滤防火墙2、有状态包过滤防火墙(状态检测/动…...

Express 集成Sequelize+Sqlite3 默认开启WAL 进程间通信 Conf 打包成可执行 exe 文件
代码:express-exe: 将Express开发的js打包成exe服务丢给客户端使用 实现目标 Express 集成 Sequelize 操作 Sqlite3 数据库; 启动 Sqlite3 时默认开启 WAL 模式,避免读写互锁,支持并发读; 利用 Conf 实现主进程与 Ex…...
CppCon 2015 学习:A C++14 Approach to Dates and Times
Big Picture — 日期库简介 扩展 标准库 这个库是对 C 标准库中 <chrono> 的自然延伸,专注于处理“日历”相关的功能(比如年月日、闰年、节假日等),而不仅仅是时间点和时长。极简设计 它是**单头文件(header-on…...
基于CNN的OFDM-IM信号检测系统设计与实现
基于CNN的OFDM-IM信号检测系统设计与实现 摘要 本文详细研究了基于卷积神经网络(CNN)的正交频分复用索引调制(OFDM-IM)信号检测方法。通过在不同信噪比(SNR)和信道条件下进行系统仿真,对比分析了CNN检测器与传统最大似然(ML)检测器的误码率(BER)性能和计算复杂度。实验结果表…...
macos常见且应该避免被覆盖的系统环境变量(避免用 USERNAME 作为你的自定义变量名)
文章目录 macos避免用 USERNAME 作为你的自定义变量名macos常见且应该避免被覆盖的系统环境变量 macos避免用 USERNAME 作为你的自定义变量名 问题: 你执行了:export USERNAME“admin” 然后执行:echo ${USERNAME} 输出却是:xxx …...

2024年认证杯SPSSPRO杯数学建模D题(第二阶段)AI绘画带来的挑战解题全过程文档及程序
2024年认证杯SPSSPRO杯数学建模 D题 AI绘画带来的挑战 原题再现: 2023 年开年,ChatGPT 作为一款聊天型AI工具,成为了超越疫情的热门词条;而在AI的另一个分支——绘图领域,一款名为Midjourney(MJÿ…...
深入理解CSS常规流布局
引言 在网页设计中,理解元素如何排列和相互作用至关重要。CSS提供了三种主要的布局方式:常规流、浮动和定位。本文将重点探讨最基础也是最常用的常规流布局(Normal Flow),帮助开发者掌握页面布局的核心机制。 什么是…...

DOCKER使用记录
1、拉取镜像 直接使用docker pull <image>,大概率会出现下面的报错信息: (base) jetsonyahboom:~$ docker pull ubuntu:18.04 Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while …...
MYSQL中常见的函数和使用
字符串函数 CONCAT(str1,str2,...,strN) :用于将多个字符串连接成一个字符串。例如,SELECT CONCAT(SQL, , 函数) ,结果为 “SQL 函数”。 LOWER(str) :将字符串中的所有字母转换为小写。例如,SELECT LOWER(MySQL Fun…...

【深度学习相关安装及配环境】Anaconda搭建虚拟环境并安装CUDA、cuDVV和对应版本的Pytorch,并在jupyter notebook上部署
目录 1. 查看自己电脑的cuda版本2.安装cuda关于环境变量的配置测试一下,安装完成 3.安装cuDVV环境变量的配置测试一下,安装完成 4.创建虚拟环境先安装镜像源下载3.11版本py 5.在虚拟环境下,下载pytorch6.验证是否安装成功7.在jupyter noteboo…...

web3-区块链基础:从区块添加机制到哈希加密与默克尔树结构
区块链基础:从区块添加机制到哈希加密与默克尔树结构 什么是区块链 抽象的回答: 区块链提供了一种让多个参与方在没有一个唯一可信方的情况下达成合作 若有可信第三方 > 不需要区块链 [金融系统中常常没有可信的参与方] 像股票市场,或者一个国家的…...

TCP小结
1. 核心特性 面向连接:通过三次握手建立连接,四次挥手终止连接,确保通信双方状态同步。 TCP连接建立的3次握手 抓包: client发出连接请求; server回应client请求,并且同步发送syn连接; clien…...
django ssh登录 并执行命令
在Django开发环境中,通常不推荐直接通过SSH登录到服务器并执行命令,因为这违背了Django的架构设计原则,即前端与后端分离。Django主要负责处理Web请求、逻辑处理和数据库交互,而不直接执行系统级命令。然而,在某些情况…...
unix/linux,sudo,其高级使用
掌握了sudo的基石,现在是时候向更高阶的技巧和应用进发了!sudo的强大远不止于简单的sudo <command>。它的高级用法能让你在复杂的系统管理和安全场景中游刃有余,如同经验丰富的物理学家巧妙运用各种定律解决棘手问题。 sudo 的高级使用技巧与场景 精细化命令控制与参…...

Python 打包指南:setup.py 与 pyproject.toml 的全面对比与实战
在 Python 开发中,创建可安装的包是分享代码的重要方式。本文将深入解析两种主流打包方法——setup.py 和 pyproject.toml,并通过一个实际项目示例,展示如何使用现代的 pyproject.toml 方法构建、测试和发布 Python 包。 一、setup.py 与 pyp…...
计算机视觉与深度学习 | 基于OpenCV的实时睡意检测系统
基于OpenCV的实时睡意检测系统 下面是一个完整的基于OpenCV的睡意检测系统实现,该系统使用眼睛纵横比(EAR)算法检测用户是否疲劳或瞌睡。 import cv2 import numpy as np import dlib from scipy.spatial import distance as dist import pygame import time# 初始化pygame用…...
python打卡day44@浙大疏锦行
知识点回顾: 预训练的概念常见的分类预训练模型图像预训练模型的发展史预训练的策略预训练代码实战:resnet18 作业: 尝试在cifar10对比如下其他的预训练模型,观察差异,尽可能和他人选择的不同尝试通过ctrl进入resnet的…...

性能优化 - 案例篇:缓存_Guava#LoadingCache设计
文章目录 Pre引言1. 缓存基本概念2. Guava 的 LoadingCache2.1 引入依赖与初始化2.2 手动 put 与自动加载(CacheLoader)2.2.1 示例代码 2.3 缓存移除与监听(invalidate removalListener) 3. 缓存回收策略3.1 基于容量的回收&…...
NiceGUI 是一个基于 Python 的现代 Web 应用框架
NiceGUI 是一个基于 Python 的现代 Web 应用框架,它允许开发者直接使用 Python 构建交互式 Web 界面,而无需编写前端代码。以下是 NiceGUI 的主要功能和特点: 核心功能 1.简单易用的 UI 组件 提供按钮、文本框、下拉菜单、滑块、图表等常见…...
生动形象理解CNN
好的!我们把卷积神经网络(CNN)想象成一个专门识别图像的“侦探小队”,用破案过程来生动解释它的工作原理: 🕵️♂️ 案件:识别一张“猫片” 侦探小队(CNN)的破案流程&am…...

python入门(1)
第一章 第一个python程序 1.1 print函数 print方法的作用 : 把想要输出的内容打印在屏幕上 print("Hello World") 1.2 输出中文 在Python 2.x版本中,默认的编码方式是ASCII编码方式,如果程序中用到了中文,直接输出结果很可能会…...

【PDF提取表格】如何提取发票内容文字并导出到Excel表格,并将发票用发票号改名,基于pdf电子发票的应用实现
应用场景 该应用主要用于企业财务部门或个人处理大量电子发票,实现以下功能: 自动从 PDF 电子发票中提取关键信息(如发票号码、日期、金额、销售方等)将提取的信息整理并导出到 Excel 表格,方便进行财务统计和报销使…...

Hugging Face 最新开源 SmolVLA 小模型入门教程(一)
系列文章目录 目录 系列文章目录 前言 一、引言 二、认识 SmolVLA! 三、如何使用SmolVLA? 3.1 安装 3.2 微调预训练模型 3.3 从头开始训练 四、方法 五、主要架构 5.1 视觉语言模型(VLM) 5.2 动作专家:流匹…...

封闭内网安装配置VSCode Anconda3 并配置 PyQt5开发
封闭内网安装配置VSCode Anconda3 并配置 PyQt5开发 零一 vscode1.1 下载 vscode1.2 下载插件1.3 安装 二 anaconda 32.1 下载2.2 新建虚拟环境1 新建快捷方式,启动base2 新建虚拟环境 3 配置Qt designer3.1 designer.exe和uic.exe3.2 设置插件,3.4 ui文件转为py文件 4使用4.1 …...

大话软工笔记—组合要素2之逻辑
1. 逻辑的概念 逻辑,指的是思维的规律和规则,是对思维过程的抽象。 结合逻辑的一般定义以及信息系统的设计方法,对逻辑的概念进行抽提、定义为三个核心内涵,即:规律、顺序、规则。 (1)规律&a…...
浅谈边缘计算
(꒪ꇴ꒪ ),Hello我是祐言QAQ我的博客主页:C/C语言,数据结构,Linux基础,ARM开发板,网络编程等领域UP🌍快上🚘,一起学习,让我们成为一个强大的攻城狮࿰…...
宝塔专属清理区域,宝塔清理MySQL日志(高效释放空间)
1. 删除超过 365 天的积分变更记录 宝塔面板 → 数据库 → 选择数据库 → 点击 管理 进入 phpMyAdmin 后: 选择在用的数据库名 看到顶部的 SQL 点击 输入命令 然后点击执行 DELETE FROM pre_common_credit_log WHERE dateline < UNIX_TIMESTAMP(DATE_SUB(NO…...