一、插入元组
1、插入单个元组(使用的是VALUES子句)
(1)语句格式
INSERT INTO <表名> 【(<属性名1【,<属性名2>,...】)】
VALUES (<常量1>【,<常量2>,...】)
(2)分析
常量值必须与相应的属性名值域相同、个数相同
元组的某属性没在INTO后出现,则这些属性上的值会取控制NULL
INTO中没有指明任何属性,则VALUES子句中新插入的元组在每个属性上必须有值,且常量值的顺序要与表定义中属性的顺序一致
(3)举例:将一个新学生记录,插入学生关系表s中
方式一:
insert into s (sNo,sN,sex,sB,sD)
values('202218014036','贾宝玉','男','2000-7-13','机械学院');
方式二(省略属性列):
insert into s
values('202218014037','林黛玉','女','2000-9-13','机械学院');
注意:省略属性列插入新元组,其常量值数目及其常量值位置必须与表的属性列的数目以及定义表时属性列的位置相对应
2、插入多个元组(使用插入子查询的方式)
(1)语句格式:
INSERT INTO <表名> 【(<属性名1>【,<属性名2>...】)】
子查询
(2)举例:插入“数计学院”学生选修“计算机组成原理”课程的选课记录
insert into sC(sNo,cNo)
select sNo,cNo
from s,c
where sD='数计学院' and cN='大数据分析';
3、小结
无论是使用VALUES子句插入一个元组,还是使用嵌入子查询的方式插入多个元组,都必须保证常量与属性的数目对应、位置对应、数据类型对应
二、修改属性值
1、语句格式:
UPDATE <表名>
SET <属性名1>=<表达式1>【,<属性名2>=<表达式2>,...】
【WHERE<元组选择条件>】
2、注意:
(1)如果省略了WHERE子句,就要对对应表中所有元组的相关属性进行修改
(2)UPDATE子句后面只能跟一个表名
3、举例1:修改学生表s中“林黛玉”的所在院系为“数计学院”
update s
set sD='数计学院'
where sN='林黛玉';
4、举例2:将学号为‘202218014030’的学生所学“高分子材料”的成绩改为95.0
update sC
set grade=95
where sNo='202218014030' and cNo in(
select cNo
from c
where cN='高分子材料'
);
5、举例3:若课程成绩低于该课平均成绩,则将成绩提高5%
update sC
set grade=1.005*grade
where grade<(
select avg(grade)
from sC sC1
where sC1.cNo=sC.cNo
)
注意:小数溢出会四舍五入,整数溢出会出错
三、删除元组
1、语句格式:
DELETE
FROM <表名>
【WHERE <元组选择条件>】
2、注意:
(1)没有WHERE子句执行SELECT子句将会删除指定表中所有的元组,单不会删除表,表的定义依旧存在于数据库的数据字典中,只不过执行了此条DELETE语句后的表会变成空表,即没有一个元组的表
(2)DELETE语句中的FROM子句后面只能有一个表名
3、举例1:删除所有成绩为空值的选课记录
delete
from sC
where grade is null;
4、举例2:删除成绩低于所有课程平均成绩的选课元组
delete
from sC
where grade<(
select avg(grade)
from sC
);
四、更新操作的完整性检查
1、发生外键冲突的三种情况
(1)在参照表s中插入外键值不在其被参照表中的主键值范围内的元组
(2)修改被参照表中已经被对其应外键使用的元组的主键值
(2)删除被参照表中已被其对应外键使用的元组
2、跟新操作不能满足参照完整性时,DBMS采用的三种策略
(1)拒绝执行(NO ACTION)(默认策略)
(2)产生级联操作(CASCADE)
(3)设置为空值(SET NULL)
3、解决外键冲突的方式:在定义外键表时说明参照完整性的违约处理策略
create table sC(
sNo char(12),
cNo char (3),
grade dec(3,1),
primary key(sNo,cNo), -- sNo和cNo都是主键、也是主属性
foreign key(cNo)references c(cNo)
on update cascade -- 当修改表s的sNo时,自动级联修改sC表中相应元组的sNo
on delete no action, -- 当删除表s中已被外键cNo绑定的元组时,拒绝执行
foreign key(sNo)references s(sNo)
on update cascade
on delete no action,
check(grade between 0 and 100)
);
五、总结
1、数据更新不对关系表的模式结构进行改变
2、数据更新操作往往是在查询的基础上进行的,在更新操作语句中可能会嵌套子查询
3、数据更新操作时要考虑数据库上所定义的各类完整性约束,以及DBMS所采用的执行策略