当前位置: 首页 > article >正文

【数据库系统概论】第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 Sno
    FROM Student
    WHERE 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 Sno
    FROM Student
    WHERE Smajor = '计算机科学与技术');

总结:

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

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

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


http://www.kler.cn/a/387767.html

相关文章:

  • 【JavaEE进阶】导读
  • 解决C盘空间不足的三种方案
  • linux安装netstat命令
  • 【C++ 算法进阶】算法提升十三
  • 协程3 --- golang的协程调度
  • 大模型就业收入高吗?大模型入门到精通,收藏这篇就够了
  • 将Go项目编译为可执行文件(windows/linux)
  • Web 开发新趋势下,GET 请求与 POST 请求如何抉择
  • 考研要求掌握的C语言(选择排序)
  • 给cantian建议的第二篇
  • 备忘录模式:保存对象状态的设计模式
  • Python脚本模拟远程网络探测
  • 动态规划理论基础和习题【力扣】【算法学习day.26】
  • MYSQL隔离性原理——MVCC
  • 实时计算 Flash – 兼容 Flink 的新一代向量化流计算引擎
  • mac-泛洪
  • 我的 C# 白盒测试学习路线
  • [C++11] 类中新特性的添加
  • 网页版五子棋——匹配模块(服务器端开发)
  • 梧桐数据库与GBase日期函数比较
  • C++ 越来越像函数式编程了!
  • linux devfreq 模块
  • flink 内存配置(五):网络缓存调优
  • video素材格式转换--mp4转webm(vue3+Nodejs)
  • 如何运营Github Org
  • Hunyuan-Large:推动AI技术进步的下一代语言模型