首页 > 数据库 >【数据库系统概论】第3章 SQL(二)数据更新

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

时间:2024-11-09 10:18:22浏览次数:3  
标签:INSERT -- INTO 表中 插入 SQL 数据库系统 WHERE 概论

目录

插入数据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的出生日期改为2001年3月18日

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):用于删除表中的记录,支持删除单个或多个记录,也支持带子查询删除。

标签:INSERT,--,INTO,表中,插入,SQL,数据库系统,WHERE,概论
From: https://blog.csdn.net/Z15922342915/article/details/143635625

相关文章

  • 直播短视频系统,Mysql执行顺序代码解析
    直播短视频系统,Mysql执行顺序代码解析MySQL执行顺序FROM<left_table>ON<join_condition><join_type>JOIN<right_table>WHERE<where_condition>GROUPBY<group_by_list>HAVING<having_condition>SELECTDISTINCT<select_list&......
  • 20-数据库系统安全
    20.1概况1)概念数据库安全是指数据库的机密性、完整性、可用性能够得到保障,其主要涉及数据库管理安全、数据安全、数据库应用安全以及数据库运行安全。2)威胁授权的误用逻辑推断和汇聚:利用逻辑推理,把不太敏感的数据结合起来可以推断出敏感信息。进行逻辑推断也可能要用到某些......
  • SQL语句的基本理解与应用
        首先借用Freesql的官方文档中的一段复杂代码举例,说明SQL语句的基本使用并最终实现读懂下列的复杂代码INSERTINTO[Role]([Name])OUTPUTINSERTED.[Id]as[Id],INSERTED.[Name]as[Name]VALUES(N'role1'),(N'role2')INSERTINTO[User]([Name])OUTPUTINS......
  • 1.存储引擎:深入解析 MySQL 存储引擎与 InnoDB 文件结构
    MySQL提供了多种存储引擎,适用于不同的业务场景。每种引擎在文件结构上设计独特,以便优化性能和功能。本文将详细介绍MySQL中常用存储引擎的文件结构,尤其是InnoDB引擎的多种文件类型及其作用,以帮助更深入地理解和选择适合的存储引擎。一、MySQL存储引擎概述与常用存储......
  • 2. MySQL 索引分类
    MySQL中的索引是提高数据查询速度的重要工具,就像一本书的目录,可以帮助我们快速定位到所需的内容。选择适合的索引类型对数据库设计和性能优化至关重要。本文将详细介绍MySQL中常见的索引类型,并重点讲解聚集索引和二级索引的概念及应用。1.主键索引(PrimaryKeyIndex)概......
  • Oracle 存储过程分页 + Sqlsugar调用
    一、Oracle存储过程分页1createPROCEDUREGetPatientVisitData(2p_HospIdINVARCHAR2,--院区编码3p_strDateINVARCHAR2,--开始日期4p_endDateINVARCHAR2,--结束日期5p_page_sizeINNUMBER,--每页记录数6p_page_numberIN......
  • 【GreatSQL 优化器 - 01】const_table
    一、const_table介绍GreatSQL的优化器主要用JOIN类来进行处理SQL语句的,JOIN类有以下四个table数量相关的成员变量。其中const_tables是optimize最开始就检查并且标识的,因为这样可以把记录最少的表放在执行计划的第一步,在后面的执行计划里面这些consttables是不参......
  • 关于MySQL表设计,测试人员可以关注哪些点
    测试人员关注数据库表设计是“测试左移”的一种手段,可以把有关数据库的潜在bug消灭在系统测试之前,从而提高交付效率。以MySQL为例,QA可从以下方面对数据库表设计做测试的左移:1、数据表功能表结构确保每张表都有主键,且主键值唯一且非空,以保证表中每行数据的唯一性和可识别性检......
  • mysql ubuntu 卸载
    mysql卸载:引用https://developer.aliyun.com/article/1306777在Ubuntu系统中,MySQL是一种常用的关系型数据库服务器。有时,我们可能需要完全卸载MySQL服务器,包括所有配置文件和数据,以便重新安装或切换到其他数据库服务器。本文将详细介绍在Ubuntu中如何完全卸载MySQL服......
  • MySQLMonitor: 黑盒测试Mysql实时监控辅助工具
    MySQLMonitorMySQL实时监控工具(代码审计、黑盒测试辅助工具)使用1.自行打包使用gitclonehttps://github.com/fupinglee/MySQLMonitorcdMySQLMonitormvncleanpackage-DskipTests=true打开target下的jar文件即可执行2.直接下载使用https://github.com/fupinglee/......