【数据库系统概论】第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的出生日期改为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
子句中使用 AND
或 OR
来组合多个条件,或者使用 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):用于删除表中的记录,支持删除单个或多个记录,也支持带子查询删除。