21/7/27 读书笔记 SQL数据更新删除 空值的处理 视图

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.Sname
FROM 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.Grade
FROM 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的结构化特点,使得查询分层更为清晰。同时视图定义可以长期保存,因此可以重复使用而不需要像派生表一样随用随定义。

对于用户和应用程序来说,其使用视图而不是基本表,可以提高数据库系统的逻辑独立性。数据库系统中的基本表结构即使改变,只需要修改视图定义,就能维持外模式不变,用户和应用程序对数据的使用不受影响。

利用视图也能使得一张基本表通过定义多种不同的视图,将不同的数据以不同的权限和安全性暴露给不同的用户,提供了数据库的安全保护

posted @ 2021-07-27 10:40  neumy  阅读(367)  评论(0)    收藏  举报