21/7/27 读书笔记
⽬录
数据库系统概论 SQL数据更新
SQL中对数据的更新操作主要基于INSERT插⼊、UPDATE修改、DELETE删除三种⼦句。注意,对基本表的增删改查可能破坏参照完整性!需要进⾏参照完整性检查和控制。
INSERT 插⼊
搭配INTO与VALUE,插⼊操作分为插⼊⼀个元组与插⼊多个元组。前者可以表⽰为:
INSERT
INTO Student
VALUE('19373333','Norton',NULL,'CS',21); # INTO后表名不指明属性列,则按基本表定义依次插⼊INSERT
INTO Student(Sno,Sdept,Sage,Sname)
VALUE('19373333','CS',21,'Norton') # 指明属性列,则按指明顺序插⼊,未指定列为NULL后者可以表⽰为:
INSERT
INTO Student(Sno)SELECT Sno,A.SnameFROM Student A,SC B
WHERE A.Sno=B.Cno AND B.Cno='123'; # 将选修123号课程的同学集合插⼊Student,仅插⼊学号与姓名列
UPDATE 修改
搭配SET与WHERE,将表中符合WHRER条件的元组以SET指定的⽅式修改。当不指定WHERE时默认更新全表。UPDATE Student
SET Sdept='Computer Science'WHERE Sdept='CS' AND Sage<19;
DELETE 删除
搭配FROM和WHERE,将符合WHERE条件的元组删除。不指定WHERE时默认删除所有元组(表还在,但是为空)。DELETE
FROM Student
WHERE Sdept='CS' AND Sage='20';
数据库系统概论 空值
空值的来源有以下两点:
应该存在该值,但是⽬前来说未知。⽐如某款新汽车的最⾼时速。不应该有该值。⽐如某款电动汽车的排放量。从SQL操作看,空值来源于插⼊、修改以及外连接。
在定义了UNIQUE、NOT NULL的属性下不能出现空值,码属性PRIMARY KEY也不能出现空值。
空值的任何⽐较运算都会产出布尔值Unknown。当Unknown涉及逻辑运算时,遵守如果该变量取True或False都不会影响最终结果,则以结果不变,否则结果同样Unknown。
数据库系统概论 视图
视图是从基本表导出的表,其是⼀个虚表,这意味着数据库系统中的内模式⾥并没有单独为视图开辟存储空间,⽽是仅在模式中定义了视图与基本表间的对应关系。当基本表被改变,视图内容也随之改变。
视图可以像基本表⼀样查询、删除,也可以基于视图定义新的视图,但是对视图的更新(增删改查)有限制。我们定义视图可以分为:
⾏列⼦集视图:从原基本表中取出⾏与列的⼦集构成新的视图。
⾮⾏列⼦集视图:利⽤了聚合函数或表达式构成了新的视图,这个视图并不是原基本表的⾏列⼦集。
定义视图
SQL定义了CREATE VIEW命令来创建视图,同时利⽤⼦查询来描述视图与基本表(或其他视图)的映像关系,并指定数据更新涉及的⽬标⾏应当满⾜的条件。CREATE VIEW CS_Student # 未指定视图的属性列名,⾃动以⼦查询的诸字段构成AS
SELECT Sno,Sname,Sage # ⼦查询的诸字段构成CS_Student的列FROM Student
WHERE Sdept='CS'
WITH CHECK OPTION; # WITH CHECK OPTION ⾃动以WHERE条件来筛选之后对该视图更新所涉及的元组,即只有当元组同样符合WHERE条件时才能进⾏增删改查组成视图的属性列名,要么全部忽略要么全部指定,⽽且当出现以下情况,视图的属性列必须指定:
视图的⽬标列不是属性名⽽是聚类函数或表达式多表连接时,表中具有同名列需要在视图中重新指定列名称
CREATE VIEW Birthday(Sno,Sbirth)AS
SELECT Sno,2021-Sage
FROM Student; # 2021-Sage构成了表达式CREATE VIEW S_G(Sno,Gavg)AS
SELECT Sno,AVG(Grade)FROM SC
GROUP BY Sno; # AVG(Grade)涉及聚合函数
CREATE VIEW N_G(Sno,Sname,Sgrade)AS
SELECT SC.Sno,Student.Sname,SC.GradeFROM Student,SC
WHERE Student.Sno=SC.Sno; # SC与Student有Sno同名列
注意,⼀旦基本表的结构改变,相依赖的视图映像关系也可能被破坏,因此如果修改基本表,最好删除该基本表导出的所有视图再重建。
删除视图与查询视图
删除视图的特点
DROP VIEW S_G CASCADE
CASCADE指定将该视图导出的其他视图也删除。
注意即使基本表被删除,视图的定义仍然没有删除。需要采⽤这条命令来显式地删除所有的视图定义。查询中的特点
对⽤户来说,查询视图的命令与查询基本表基本⼀致。
对系统来说,数据库系统需要先将对视图的查询根据视图的定义转换为对基本表的查询,这⼀步称为视图消解。⼤多数数据库都能对⾏列⼦集视图进⾏有效的视图消解,但是对于⾮⾏列⼦集视图的消解能⼒不确定。
更新视图
对于数据库系统来说,视图的更新也是需要经过数据库系统的视图消解来实现的。
但是并不是所有视图都可以更新!⼀般地,⾏列⼦集视图可以更新,⽽⾮⾏列⼦集视图有些理论上可更新。⽬前⼤多数数据库系统限制只能对⾏列⼦集视图进⾏更新,并各⾃有更多的限制。
举⼀个不可更新的视图的例⼦,⽐如我们之前利⽤聚合函数求出的学⽣平均成绩视图S_G(Sno,Gavg),我们如果修改Gavg字段,这意味着修改⼀个学⽣的平均成绩,我们不可能通过修改基本表内容来使得平均成绩改变为特定值,故该视图的该字段不可更新。⽽Sno是理论上可更新的字段,需要到基本表中找到所有Student.Sno=S_G.Sno的元组并更改Student.Sno。
视图的作⽤
视图与派⽣表⼀样,增强了SQL的结构化特点,使得查询分层更为清晰。同时视图定义可以长期保存,因此可以重复使⽤⽽不需要像派⽣表⼀样随⽤随定义。
对于⽤户和应⽤程序来说,其使⽤视图⽽不是基本表,可以提⾼数据库系统的逻辑独⽴性。数据库系统中的基本表结构即使改变,只需要修改视图定义,就能维持外模式不变,⽤户和应⽤程序对数据的使⽤不受影响。
利⽤视图也能使得⼀张基本表通过定义多种不同的视图,将不同的数据以不同的权限和安全性暴露给不同的⽤户,提供了数据库的安全保护。
因篇幅问题不能全部显示,请点此查看更多更全内容