【数据库系统概论】第3章 SQL(三)数据更新

目录

插入数据Insert

1. 插入记录【插入元组】

2.插入子查询结果

修改数据Update

1. 修改某一个元组的值

2. 修改多个元组的值

3. 带子查询的修改语句

删除数据 delete

1. 删除某一个元组的值

2. 删除多个元组的值 

3. 带子查询的删除语句


插入数据Insert

 Insert语句用来向表中插入数据

1. 插入记录【插入元组

通过 INSERT INTO 语句来指定表和需要插入的值,确保每个值对应表的字段

-- 向指定的表插入单条数据
INSERT INTO 表名 (列1, 列2, 列3, ...)
VALUES (值1, 值2, 值3, ...);-- 向指定的表插入多条数据
INSERT INTO 表名 (列1, 列2, 列3, ...)
VALUES (值1, 值2, 值3, ...),(值4, 值5, 值6, ...),(值7, 值8, 值9, ...);-- 向表 "students" 插入一条数据
INSERT INTO students (id, name, age)
VALUES (1, '张三', 20);

INTO子句

没有指明任何属性列名,新插入的元组必须在每个属性列上均有指定值

没有在 INSERT INTO 语句中指定列名时,必须确保插入的值完全对应表的所有列,且顺序要严格匹配【插入的值数量和顺序必须与表的列定义完全一致】

-- 如果表有 3 列 (id, name, age),则插入时必须按顺序提供 3 个值
INSERT INTO students
VALUES (1, '张三', 20);

没有出现的属性列,新元组在这些列上将取空值

没有为某个属性列提供值,并且该列没有默认值(或没有设置 NOT NULL 约束),那么数据库会将该列的值设置为 NULL

-- 假设表 "students" 有 3 列:id, name, age, 但只插入了 id 和 name
-- 如果 "age" 列允许空值,则插入数据时,"age" 列会默认为 NULL
INSERT INTO students (id, name)
VALUES (1, '张三');

定义表时指定了相应属性列的缺省值,新元组在这些列上将取缺省值

指定了列的默认值,当插入数据时,如果某列没有显式提供值,则该列会自动取该默认值

-- 假设表 "students" 中 "age" 列有默认值 18
CREATE TABLE students (id INT,name VARCHAR(50),age INT DEFAULT 18
);-- 当插入数据时,如果没有指定 "age" 的值,则会自动使用默认值 18
INSERT INTO students (id, name)
VALUES (2, '李四');

在表定义时说明了NOT NULL的属性列不能取空值 

某一列定义了 NOT NULL 约束时,插入数据时如果没有为该列提供值,数据库会报错,因为该列不能为 NULL

-- 假设 "students" 表中的 "id" 列是 `NOT NULL`
CREATE TABLE students (id INT NOT NULL,name VARCHAR(50),age INT
);-- 如果插入时没有给 "id" 列提供值,将导致错误
INSERT INTO students (name, age)
VALUES ('王五', 22);  -- 这会报错,因为 "id" 列不允许为空

INTO------可以省略 

VALUES子句

提供的值必须与INTO子句匹配

-- 这里明确了插入的是 id 和 name,age 会自动取默认值或 NULL
INSERT INTO students (id, name)
VALUES (1, '张三');

VALUES 子句中提供的值必须与 INTO 子句指定的列的数量和顺序完全匹配

值的个数

VALUES 子句中提供的值的数量必须与 INTO 子句中列的数量一致。如果列名未指定,则值的数量必须与表中定义的列数一致。如果不一致,数据库会报错。

-- 假设 "students" 表有 3 列 (id, name, age)
INSERT INTO students
VALUES (1, '张三');  -- 错误,缺少 "age" 列的值-- 正确的方式:
INSERT INTO students
VALUES (1, '张三', 20);  -- 提供了 3 个值,和表的列数一致

值的类型

 VALUES 子句中的每个值的类型必须与表中相应列的类型兼容。

如果某列是 INT 类型,那么插入的值必须是整数;如果某列是 VARCHAR 类型,插入的值应是字符串。

-- 以下是正确的插入语句:
INSERT INTO students (id, name, age)
VALUES (1, '张三', 20);-- 错误的插入语句:
INSERT INTO students (id, name, age)
VALUES ('张三', '李四', 20);  -- 错误,'张三' 应该是整数类型(id 列)

2.插入子查询结果

当需要从一个表中选取某些数据并将它们插入到另一个表时

使用 SELECT 查询的结果作为数据插入到目标表中

INSERT INTO 目标表 (列1, 列2, ...)
SELECT 列1, 列2, ...
FROM 源表
WHERE 条件;

INSERT INTO <表名> [(<属性列1> [,<属性列2>… )]

子查询;

SELECT 语句中的列顺序必须与目标表的列顺序一致

如果目标表中所有列都需要插入数据,你可以省略列名

子查询中的数据类型要与目标表的列类型匹配:确保子查询结果的列数据类型与目标表中的列数据类型兼容。

例 :建立一个新表savg,存放每个学生的学号和平均成绩。 利用查询结果插入新表中 

-- 步骤 1: 创建新表 savg
CREATE TABLE savg (sno CHAR(8),        -- 学号,使用 CHAR(8) 类型,假设学号是固定长度的字符串average REAL        -- 平均成绩,使用 REAL 类型存储数值
);-- 步骤 2: 插入数据到 savg 表
INSERT INTO savg (sno, average)
SELECT sno, AVG(grade) 
FROM sc 
GROUP BY sno;

关系数据库管理系统在执行插入语句时会检查所插元组是否破坏表上已定义的完整性规则

实体完整性主键值是否重复,不能是 NULL

参照完整性外键列的值必须与目标表中的主键值一致

用户定义的完整性 NOT NULL约束【确保某个列的值不能为 NULL】 ,UNIQUE约束【确保某个列中的值在表中是唯一的,允许 NULL 值存在,多个 NULL 值不会违反唯一性约束】, 值域约束 【限制列中的数据必须属于一个预定义的值范围或类型】

修改数据Update

修改操作又称为更新操作

UPDATE 语句用于修改表中已经存在的记录,根据给定的条件更新字段的值

UPDATE <表名>
SET <列1> = <新值1>, <列2> = <新值2>, ...
WHERE <条件>;
  • UPDATE 语句的功能是修改表中满足 WHERE 子句条件的元组(记录)。

  • SET 子句用于指定需要更新的列及其新的值。

  • 如果省略了 WHERE 子句,则默认修改表中所有记录

1. 修改某一个元组的值

将学生20180001的出生日期改为2001318

UPDATE Student
SET Sbirthdate = '2001-03-18'
WHERE Sno = '20180001';

SET 子句中,可以使用常量、列的值、表达式(如数学运算)或子查询来更新数据

可以同时更新表中的多个列 【用,隔开】

日期和字符串应该使用标准的单引号 ' 

2. 修改多个元组的值

将所有学生的年龄增加1岁

UPDATE Student
SET Sage = Sage + 1;

没有 WHERE 子句:这条语句会修改表中所有记录的 Sage 列 

3. 带子查询的修改语句

将计算机科学与技术专业学生成绩置零

UPDATE SC
SET Grade = 0
WHERE Sno IN(SELECT SnoFROM StudentWHERE Smajor = '计算机科学与技术');

 执行修改操作时,系统会自动检查是否有任何操作会破坏表上已定义的完整性约束

删除数据 delete

DELETE FROM <表名>
WHERE <条件>;

DELETE FROM <表名>:指定从哪个表中删除数据 

WHERE <条件>:指定删除数据的条件。如果省略 WHERE 子句,表中所有的记录都会被删除。

1. 删除某一个元组的值

WHERE 子句可以精确地指明要删除的行

 要删除学号为 2018001 的学生记录:

DELETE FROM Student
WHERE Sno = '2018001';

2. 删除多个元组的值 

WHERE 子句中使用 ANDOR 来组合多个条件,或者使用 IN 来指定多个值

删除所有年龄(Sage)大于 21 的学生记录:

DELETE FROM Student
WHERE Sage > 21;

删除所有的学生选课记录: 

DELETE FROM SC;

没有 WHERE 子句,因此它会删除 SC 表中的所有记录(元组)。执行此语句后,SC 表将变为空表

删除表中的所有数据是不可恢复的,除非在删除前有备份

3. 带子查询的删除语句

据另一个查询的结果来决定哪些行应该被删除

删除计算机科学与技术专业所有学生的选课记录:

DELETE FROM SC
WHERE Sno IN(SELECT SnoFROM StudentWHERE Smajor = '计算机科学与技术');

总结:

  • 插入数据(INSERT):用于将新数据添加到表中,可以是单条或多条记录,也可以通过子查询插入。

  • 修改数据(UPDATE):用于更新已有数据,可以修改单个或多个字段,并支持子查询更新。

  • 删除数据(DELETE):用于删除表中的记录,支持删除单个或多个记录,也支持带子查询删除。

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

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

相关文章

计算机课程管理:Spring Boot与工程认证的协同

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

Java | Leetcode Java题解之第557题反转字符串中的单词III

题目&#xff1a; 题解&#xff1a; class Solution {public String reverseWords(String s) {StringBuffer ret new StringBuffer();int length s.length();int i 0;while (i < length) {int start i;while (i < length && s.charAt(i) ! ) {i;}for (int …

C++ | Leetcode C++题解之第556题下一个更大元素III

题目&#xff1a; 题解&#xff1a; class Solution { public:int nextGreaterElement(int n) {int x n, cnt 1;for (; x > 10 && x / 10 % 10 > x % 10; x / 10) {cnt;}x / 10;if (x 0) {return -1;}int targetDigit x % 10;int x2 n, cnt2 0;for (; x2 …

第14张 GROUP BY 分组

一、分组功能介绍 使用group by关键字通过某个字段进行分组&#xff0c;对分完组的数据分别 “SELECT 聚合函数”查询结果。 1.1 语法 SELECT column, group_function(column) FROM table [WHERE condition] [GROUP BY group_by_expression] [ORDER BY column]; 明确&#…

go函数传值是值传递?还是引用传递?slice案例加图解

先说下结论 Go语言中所有的传参都是值传递&#xff08;传值&#xff09;&#xff0c;都是一个副本&#xff0c;一个拷贝。 值语义类型&#xff1a;参数传递的时候&#xff0c;就是值拷贝&#xff0c;这样就在函数中就无法修改原内容数据。 基本类型&#xff1a;byte、int、bool…

UDP checksum(UDP校验和)

UDP校验和&#xff08;UDP checksum&#xff09;是一种用于检测传输中的UDP数据包在传输过程中是否发生错误的机制。UDP&#xff08;用户数据报协议&#xff09;是一种简单的无连接的传输层协议&#xff0c;它用于在网络中发送数据包&#xff0c;但不提供数据包的传输可靠性或顺…

使用pycharm调试程序——完全显示张量的数值

我在使用PyCharm调试程序时&#xff0c;发现有些张量因为shape过大&#xff08;数据量太多&#xff09;&#xff0c;导致该张量中的数值无法完全显示。下面就简单介绍怎样完全显示张量中的数值。 假设某个张量 inp_voxel 的 shape 为 torch.Size([5, 128, 128])&#xff0c;如…

MYSQL隔离性原理——MVCC

表的隐藏字段 表的列包含用户自定义的列和由系统自动创建的隐藏字段。我们介绍3个隐藏字段&#xff0c;不理解也没有关系&#xff0c;理解后面的undo log就懂了&#xff1a; DB_TRX_ID &#xff1a;6 byte&#xff0c;最近修改( 修改/插入 )事务ID&#xff0c;记录创建这条记…

strtok函数详解

strtok函数 strtok 函数是一个字符串分割函数&#xff0c;用于将字符串分割成一系列的标记。这个函数通过一组分隔符字符来确定标记的边界&#xff0c;每次调用都会返回字符串中的下一个标记&#xff0c;并且将原始字符串中的分隔符替换为空字符‘\0’&#xff0c;从而实际上是…

NewStar CTF 2024 misc WP

decompress 压缩包套娃&#xff0c;一直解到最后一层&#xff0c;将文件提取出来 提示给出了一个正则&#xff0c;按照正则爆破密码&#xff0c;一共五位&#xff0c;第四位是数字 ^([a-z]){3}\d[a-z]$ 一共就五位数&#xff0c;直接ARCHPR爆破&#xff0c;得到密码 xtr4m&…

Git介绍以及SSH配置

目录 1. Git介绍 1.1 Git的基本原理 1.2 Git的主要功能 1.3 Git的优点 1.4 Git的缺点 2. Git安装 3. SSH配置 1. Git介绍 Git是一款功能强大的分布式版本控制系统&#xff0c;最初由Linux操作系统的开发者Linus Torvalds在2005年开发&#xff0c;用于管理Linux内核的源代…

PH热榜 | 2024-11-09

DevNow 是一个精简的开源技术博客项目模版&#xff0c;支持 Vercel 一键部署&#xff0c;支持评论、搜索等功能&#xff0c;欢迎大家体验。 在线预览 1. Shootmail 标语&#xff1a;像Notion一样&#xff0c;可以创建漂亮邮件模板和邮件内容的工具。 介绍&#xff1a;想象一下…

嵌入式学习第21天Linux基础

目录 第1章 Linux 系统介绍 1.1 Unix 操作系统&#xff08;了解&#xff09; 1.2 Linux 操作系统&#xff08;了解&#xff09; 1.3 Linux 操作系统的主要特性&#xff08;重点&#xff09; 1.4 Linux 与 Unix 的区别与联系 1.5 GUN 与 GPL&#xff08;了解&#xff09; …

【小程序安全】小程序反编译

❤️博客主页&#xff1a; iknow181 &#x1f525;系列专栏&#xff1a; 网络安全、 Python、JavaSE、JavaWeb、CCNP &#x1f389;欢迎大家点赞&#x1f44d;收藏⭐评论✍ 0x01 前期准备 知识点准备-小程序结构 1.主体结构 小程序包含一个描述整体程序的 app 和多个描述各自页…

C++ : STL容器(适配器)之stack、queue剖析

STL容器适配器之stack、queue剖析 一、stack、queue的接口&#xff08;一&#xff09;stack 接口说明&#xff08;二&#xff09;queue 接口说明 二、stack、queue的模拟实现&#xff08;一&#xff09;stack、queue是容器适配器stack、queue底层默认容器--deque1、deque概念及…

Kubernetes的基本构建块和最小可调度单元pod-0

文章目录 一&#xff0c;什么是pod1.1pod在k8s中使用方法&#xff08;1&#xff09;使用方法一&#xff08;2&#xff09;使用方法二 1.2pod中容器的进程1.3pod的网络隔离管理&#xff08;1&#xff09;pause容器的作用 1.4 Pod分类&#xff1a;&#xff08;1&#xff09;自主式…

【CUDA】认识CUDA

目录 一、CUDA编程 二、第一个CUDA程序 三、CUDA关键字 四、device管理 4.1 初始化 4.2 Runtime API查询GPU信息 4.3 决定最佳GPU CUDA C 编程指南CUDA C在线文档&#xff1a;CUDA C 编程指南 CUDA是并行计算的平台和类C编程模型&#xff0c;能很容易的实现并行算法。只…

知识中台如何在精简供应链管理中发挥作用?

您如何与供应商沟通并分享您的最佳实践&#xff1f;您如何确保供应商了解您的基准&#xff1f;如果您正在为这些问题烦恼&#xff0c;请不要担心&#xff0c;本文章将为您提供宝贵的见解。 构建具备弹性的供应链模型&#xff0c;其关键在于知识中台的数据质量。若缺乏数据支撑…

Python 在PDF中绘制形状(线条、矩形、椭圆形等)

在PDF中绘制图形可以增强文档的视觉效果。通过添加不同类型的形状&#xff0c;如实线、虚线、矩形、圆形等&#xff0c;可以使文档更加生动有趣&#xff0c;提高读者的阅读兴趣。这对于制作报告、演示文稿或是教材特别有用。本文将通过以下几个示例介绍如何使用Python 在PDF中绘…

Gitlab-执行器为Kubetnetes时的注意事项,解决DNS解析问题

一、Gitlab-Runner 这里对于Runner的理解非常重要。 具体执行ci流水线的叫执行器。执行器可以部署是shell、docker、k8s的pod.执行完任务则生命周期结束。 管理执行器的叫Gitlab-Runner。Runner则是与Gitlab Server的Ci agent.(可以简单这么理解) 二、执行器为Kubetnetes时,DN…