数据库系统概论(十三)详细讲解SQL中数据更新(插入,修改与更新)

article/2025/6/23 21:40:01

数据库系统概论(十三)详细讲解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

  1. 先创建目标表
    CREATE TABLE Smajor_age (Smajor VARCHAR(20), -- 专业名Avg_age SMALLINT     -- 平均年龄
    );
    
  2. 用子查询插入数据
    INSERT INTO Smajor_age(Smajor, Avg_age)
    SELECT Smajor, AVG(TIMESTAMPDIFF(YEAR, Sbirthdate, CURDATE())) -- 计算年龄差
    FROM Student
    GROUP BY Smajor; -- 按专业分组统计
    
  • 关键:子查询的列数和类型必须与 INSERT INTO 的列匹配。

5. 插入数据时的完整性检查

数据库在插入数据时会自动检查以下规则,若违反则插入失败:

  1. 实体完整性
    • 主键列(如学号)必须 唯一且非空
  2. 参照完整性
    • 外键列(如选课表的学号)必须对应另一表中存在的值(如学生表中已有的学号)。
  3. 用户定义的完整性
    • NOT NULL:非空列必须提供值(如姓名不能为空)。
    • UNIQUE:唯一列值不能重复(如身份证号)。
    • 值域约束:值必须在指定范围内(如成绩在 0-100 之间)。

二、修改数据

1. 修改数据是什么?

修改数据就是对数据库表中已存在的记录进行更新,比如改名字、调整价格、修正错误数据等

2. 基本语法

UPDATE 表名
SET1=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. 修改数据的注意事项

  1. 安全第一:先查后改
    修改前先用 SELECT 验证 WHERE 条件是否正确,避免误改。
    例如,确认计算机专业学生:

    SELECT Sno FROM Student WHERE Smajor = '计算机科学与技术';
    
  2. 完整性约束检查
    数据库会自动验证修改后的数据是否符合规则:

    • 主键不能重复(如修改学号时,新学号不能已存在)。
    • 外键必须存在(如修改选课记录的学号,该学号必须在学生表中存在)。
    • 非空列不能改为NULL(如姓名列不允许为空)。
  3. 三种常见错误场景

    错误场景示例及后果
    忘记写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. 注意事项

  1. 安全第一:先查后删
    删除前先用 SELECT 验证 WHERE 条件是否正确,避免误删。
    例如,确认计算机专业学生学号:

    SELECT Sno FROM Student WHERE Smajor = '计算机科学与技术';
    
  2. 参照完整性约束

    • 如果删除的表有外键关联其他表,可能会引发问题。
      例如:删除 Student 表中的学生记录时,若 SC 表(选课表)中存在该学生的选课记录,直接删除会报错(因为外键约束要求选课记录的学号必须存在于学生表中)。
    • 解决方案
      • 先删除子表(如 SC)中关联的记录,再删除主表(如 Student)记录。
      • 或在创建表时设置 级联删除(如 ON DELETE CASCADE),自动删除关联数据。
  3. 三种常见错误场景

    错误场景示例及后果
    忘记写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

非常感谢您的阅读,喜欢的话记得三连哦

在这里插入图片描述


http://www.hkcw.cn/article/pAddGdtSQQ.shtml

相关文章

电磁场与电磁波公式汇总

考前四天速成的,有些地方还理解不到位,欢迎交流指正

现代汽车电气/电子(E/E)架构集中化评估的系统方法

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…

指挥中心系统建设与应用方案PPT(46页)

引言 指挥中心系统作为城市应急管理的核心,在现代社会治理中发挥着至关重要的作用。本文旨在探讨指挥中心系统的建设与应用,为打造现代化、智慧化的城市应急管理体系提供参考。 指挥中心系统建设背景 自然灾害、事故灾难等突发事件频发,给…

Jony Ive联手Powell Jobs:OpenAI神秘硬件能否重塑科技?探讨合作与愿景

金融时报发布了一篇文章,采访了前苹果首席设计官乔纳森・伊夫和乔布斯遗孀劳伦・鲍威尔・乔布斯。他们讨论了合作关系、对科技社会影响的担忧,以及OpenAI正在开发的神秘硬件设备。乔纳森・伊夫曾负责设计iMac、iPod、iPhone等产品,而劳伦・鲍威尔・乔布斯是史蒂夫・乔布斯的…

Idea快捷键

ctrl f12: 显示当前类所有方法: -> 这个方法来自于哪个类或者接口中 | 重写了父类或接口的方法 compute继承了map,,又重写了这个方法: f黄色开头的: 是当前类的属性,有可能是成员变量,也有…

2天后决战印尼!伊万:我一直保持乐观 对印尼我们会积极争胜 备战顺利状态佳

中国男足国家队于2日晚抵达印度尼西亚首都雅加达,准备参加5日在这里举行的2026美加墨世界杯亚洲区预选赛18强赛第9轮对阵印尼队的关键战。当地时间晚上10点30分,中国队在主教练伊万科维奇的带领下走出雅加达苏加诺-哈达国际机场,随后登上大巴前往酒店。伊万科维奇在接受采访…

女子离婚后前夫过节仍来送礼 让她重新给个机会

女子离婚后前夫过节仍来送礼,让她重新给个机会。0102我朋友也是这样,离婚后前夫突然变得殷勤,又是送花又是转账,说想复婚。当初结婚的时候连生日礼物都懒得买,现在装什么深情。这种人就是失去才知道珍惜,但已经晚了。0304在商场看到前夫给我买了个包,还转了5200,说想复…

1. 前言与安装pytorch、d2l

书本电子版:https://zh.d2l.ai/index.html 前言 神经网络是深度学习前身 全书结构: 第一部分包括基础知识和预备知识。 1节提供深度学习的入门课程。然后在 2节中,我们将快速介绍实践深度学习所需的前提条件,例如如何存储和处理…

Mary Meeker带着340页AI报告回来了 AI发展速度前所未有

当地时间5月30日,玛丽米克尔发布了长达340页的“AI趋势报告”。报告指出,AI的发展速度前所未有,用户增长、使用量和资本支出均呈现出爆炸式增长,其影响力可能远超技术本身。玛丽米克尔是美国风险投资家,曾就职于摩根士丹利和凯鹏华盈,于2018年创立了自己的风投公司邦德资…

六一档“遗憾”复盘:票房小爆,但谷子不行 谷子经济待加强

六一档“遗憾”复盘:票房小爆,但谷子不行 谷子经济待加强!2025年端午档传来好消息,截至6月2日19点,档期三天总票房达到4.48亿元,观影人次1145万,两项指标均大幅超越去年同档,为暑期档打响了前哨站。今年春节档刷新高票房纪录后,清明档和五一档因缺少爆款影片而连续下滑…

爱琴海5.8级地震 震源深度80千米

爱琴海5.8级地震 震源深度80千米!中国地震台网正式测定:6月3日7时17分在爱琴海(北纬36.55度,东经28.20度)发生5.8级地震,震源深度80千米。责任编辑:0882

企图说服父母提升信心:国米球迷为了让小因继续执教,真的是拼了 横幅挽留显真情

国米球迷在小因扎吉老家拉横幅,希望他留在国米执教。此前,小因扎吉率领的国米在欧冠决赛中以0-5惨败,目前有关他可能离开国米前往利雅得新月执教的消息也不断传出。在小因扎吉的老家皮亚琴察省圣尼科洛,有国米球迷挂出横幅表达对他的支持。横幅上写着:“我们一起跌倒,一起…

今年人形机器人赛道已涌进超180亿元 资本狂热期来临

今年人形机器人赛道已涌进超180亿元 资本狂热期来临!中国和美国正在竞逐AI与人形机器人的未来。在上海浦东张江的一座大型仓库里,数十台人形机器人每天进行长达17小时的数据采集,执行折叠T恤、制作三明治和开门等任务,以提升智元人形机器人的操作准确性。与此同时,特斯拉公…

车载网关框架 --- 网关外部IP转内部IP的所有流程

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…

【多线程初阶】内存可见性问题 volatile

文章目录 再谈线程安全问题内存可见性问题可见性问题案例编译器优化 volatileJava内存模型(JMM) 再谈线程安全问题 如果多线程环境下代码运行的结果是符合我们预期的,即在单线程环境应该有的结果,则说这个程序是线程安全的,反之,多线程环境中,并发执行后,产生bug就是线程不安全…

YOLO机械臂丨使用unity搭建仿真环境,YOLO算法识别,Moveit2控制

文章目录 前言搭建开发环境在window中安装Unity创建Docker容器,并安装相关软件运行测试改进添加删除节点前的函数调用 报错❌框选节点的时候报错❌如果无法控制机械臂,查看rviz2的终端,应该会有❌规划路径超出范围 参考 前言 本项目介绍通过…

论文略读:Auto-Regressive Moving Diffusion Models for Time Series Forecasting

AAAI 2025 在这篇论文中,时间序列的演进()被概念化为一个扩散过程 时间序列的每一步都可以看成是扩散模型的一个状态未来序列(下标表示在序列中的位置,上标表示在扩散模型中的状态)作为前向扩散(演进&…

外卖小哥误入工地1个多小时没能出来 最终只能报警求助

近日,一名外卖小哥在送外卖时,为节约时间,跟着导航抄小路,没想到自己看错了路线,被困在了一个在建工地内1个多小时,最终只能报警求助。责任编辑:zx0002

贾冰瘦了 少吃多动见成效

5月31日,演员贾冰的妻子发布了一段视频,祝福大家端午节快乐,并配文“从此我家多了个瘦子”。两人合影中,贾冰明显瘦了很多。评论区里,很多人询问他如何瘦下来,甚至有人表示他瘦得认不出来了。贾冰妻子回复说,主要是通过少吃和运动来达到减肥效果,有时候一天只吃一顿饭。…

犯罪分子“轻易”作案 竟是这种警示牌在指路

机房和弱电井房都是整栋建筑或整个企业网络通信的重要组成部分,如果机房是网络通信设备的“核心大脑”和“运行中心”,那么弱电井房就是连接网络通信设备的“垂直通道”和“中转站”,就好比“心脏”和“血管”相辅相成。但往往有些企业却忽略了“血管”的重要性,仅仅挂上“…