4 视图
视图即数据库设计中的子模式。它是一张虚拟的表,隐藏了数据库的逻辑模式,并简化用户的逻辑层级的抽象,分别起到了数据库安全以及简单化用户使用的作用。
4.1 视图创建
视图创建的基本语句如下所示:
create view v as <query expression>;
其中query expression可以是任意的查询语句,以下为示例:
create view faculty as
select ID, given_name, dept_name
from instructor;
4.2 视图的使用
一般来说,视图同样被当做一张表使用。对于视图的查询语句与表的查询语句是一样的。其查询内容是视图定义中的表的内容。一般的关系数据库存储视图是存储视图定义的SQL语句而不是视图所对应的实际表数据,当对视图进行查询操作时数据库会根据视图定义将其转换为对实际表进行操作的语句。因此这些数据库中不会存在实际逻辑表被更改而视图没有相应更新的情况。
但是有些数据库还是会将一些运算复杂的视图的内容存储起来,以减少查询时候的运算量,此时视图需要定时进行更新以让视图与逻辑表同步。被更新的最新内容的视图叫做物化视图(Materialized Views),而这样的更新操作叫做物化视图维护(Materialized View maintenance)。
4.3 视图的更改
由于视图可能因为各个逻辑表的完整性约束无法进行更改,一般来说数据库不允许对视图的内容进行更新、删除、插入操作。但在一些情况下,视图是可以更改的。它的定义语句需要满足以下条件:
- from子句只能包含一个逻辑表
- select子句中只能包含表的属性名,不能包含任何表达式、汇总式以及distinct声明。
- 在select子句中出现的属性不是有not null约束且不能是主键的一部分
- 语句中不能有order by子句以及group by子句。
5 事务
SQL包含对于数据库中事务的支持。(事务相关见数据库笔记之数据库系统实现篇)事务包括了多个查询以及更新语句。事务中的SQL语句的开始意味着事务的开始。事务的结束则只能有以下两种SQL语句之一:
- 提交工作(Commit Work):提交当前的事务,使事务的结果永久地保存在数据库中。当该语句完成后,一个新的事务会自动开始。提交后,事务无法进行回滚工作。
- 回滚工作(Rollback Work):让数据库保持事务开始之前的状态,不使事务的执行生效。
一般来说,数据库会将单一SQL语句当做事务处理。但若事务存在复数个SQL语句,单一SQL的事务特性将不再保留。
(该部分先做到这里,深入学习后再补充)
6 完整性约束
完整性约束会在用户对数据库进行操作时进行检查,若不能满足约束条件,数据库会进行报错并不接受该操作。完整性约束保证了数据库的数据的规范性以及数据的安全。
单表的完整性约束可以在表创建的时候或者是创建表后进行声明。创建表时,对于某个特定属性的约束可以将约束放在该属性声明后:
create table table_name(
attribution_name1 type1 constrain1,
attribution_name2 type2 constrain2,
.....,
attribution_name_n type_n constrain_n);
还可以在属性声明之后单独进行约束声明,这个声明方式可实现单个表中的多个属性的约束,声明格式如下: