oracle数据库视图:定义、查询与更新 实践学习报告

本篇博客分享SQL语言视图操作--详细实践学习报告(以截图方式展示)

软件:Oracle SQL Developer 

目录

1、学生-课程数据库

2、视图

①定义视图

②查询视图

③更新视图

④视图的作用


1、学生-课程数据库

(与之前相比我稍微修改了一点,以此展开下面的实践)


2、视图

1、视图是从一个或几个基本表(或视图)导出的表。

2、视图是个虚表:即数据库中只存放视图的定义,而不存放试图对应的数据,这些数据仍存放在原来的基本表中。所以一旦基本表中的数据发生变化,从视图中查询出的数据也随之改变。

3、视图一经定义,就可以和基本表一样被查询、被删除。也可以在一个视图纸上再定义一个视图,但对视图的更新(增、删、改)操作则有一定的限制。


①定义视图

1、建立视图

1.1、SQL语言用create view命令建立视图,其中的子查询可以是任意的select语句

组成视图的属性列名或者全部指定或者全部省略,没有第三中选择。若省略,则隐含该视图由子查询中select子句目标列中的的诸字段组成,但下列三种情况下必须明确指定组成视图的所有列名:

1)某个目标列不是单纯的属性名,而是聚集函数或列表达式;

2)多表连接时选出了几个同名作为视图的字段;

3)需要在视图中为某个列启用新的更合适的名字。

1.2、行列子集视图:一个视图是从单个基本表中导出的,并且只是去掉了基本表的某些行和某些列,但保留了主码,则称这类视图为行列子集视图。

视图不仅可以建立在一个或多个基本表上,也可以建立在一个或多个已定义好的视图上,或建立在基本表和视图上。

由基本数据经过各种计算派生出的数据一般是不存储的,所以定义视图时可以根据应用的需要设置一些派生属性列。这些派生属性列由于在基本表中并不实际存在,也称为虚拟列。

带有虚拟列的视图也称为带表达式的视图。

可以用带有聚集函数和group by子句的查询来定义视图,这种视图称为分组视图。

1.3、最好:修改了基本表之后删除由该表导出的视图,然后重建这个视图。

1.4、基本表删除后,由该表导出的所有视图均无法使用了!但视图的定义没有从字典中删除,删除定义需显式使用drop view语句。

1.4、实践

1)首先得在有权限的用户中授予user创建视图的权限,否则直接创建视图会出现执行错误:显示权限不足!

2)接下来就可以建立一系列视图了,如具体操作下:(详情请看注释)

3)删除视图(oracle不用cascade)


②查询视图

1、视图消解:关系数据库系统在执行对视图的查询时,首先进行有效性检查,检查查询中涉及的表、视图是否存在,若存在则从数据字典中取出视图的定义,把定义中的子查询和用户的查询结合起来,转换成等价的对基本表的查询,然后执行修正了的查询

注意where子句中是不能用聚集函数作为条件表达式的。

目前多数关系数据库系统对行列子集视图的查询均能进行正确转换,但对非行列子集视图的查询就不一定能做转换了。

2、定义视图并查询视图与基于派生表的查询的区别

1)视图一旦定义,其定义未被删除前将永远保存在数据字典中,之后的所有查询都可以直接引用该视图;

2)派生表这是在语句执行时临时定义,语句执行后该定义即被删除。

3、实践


③更新视图

1、更新视图:指通过视图来插入(insert)、删除(delete)和修改(update)数据。

由于视图是不实际存储数据的虚表,因此对视图的更新最终要转换为对基本表的更新。(像查询视图那样)

2、并不是所有视图都是可更新的。比如前A面提到的以学生学号和平均成绩定义的一个视图S_G。

一般地,行列子集视图是可更新的,除此,有些视图理论上是可更新的,还有些视图从理论上就是不可更新的。

目前,各个关系数据库管理系统一般都只允许对行列子集视图进行更新,而且各个系统对视图的更新还有更进一步的规定。

例如,DB2规定:

(1)若视图是由两个以上基本表导出的,则此视图不允许更新;

(2)若视图的字段来自字段表达式或常数,则不允许对此视图执行insert和update操作,但允许执行delete操作;

(3)若视图的字段来自聚集函数,则此视图不允许更新;

(4)若视图定义中含有group by子句,则此视图不允许更新;

(5)若视图定义中含有distinct短语,则此视图不允许更新;

(6)若视图定义中有嵌套查询,并且内层查询的from子句中涉及的表也是导出该视图的基本表,则此视图不允许更新。

例如,将sc表中成绩在平均成绩之上的元组定义成一个视图GOOD_SC:(GOOD_SC不允许更新

(7)一个不允许更新的视图上定义的视图也不允许更新(注意:不可更新的视图和不允许更新的视图是两个不同的概念)。

3、实践

此处注意:插入后通过IS_student表是查不到该学生记录的,查询student表可见已有该学生记录,其性别和系别均为null,即系统不会自动将系名置为“IS”,而是默认为NULL!如果创建视图时加上了with check option,执行语句时会显示错误,插入不了!

(不同系统这里应该会有区别)


④视图的作用

合理使用视图能够带来好处!

1、视图能够简化用户的操作:用户所做的只是对一个虚表的简单查询,而无需了解虚表怎样来的。

2、视图使用户能以多种角度看待同一数据:许多不同种类的用户共享同一个数据库时,这种灵活性很重要!

3、视图对重构数据库提供了一定程度的逻辑独立性。

数据的物理独立性:用户的应用程序不依赖于数据库的物理结构。

数据的逻辑独立性:当数据库重构造时,如增加新的关系或对原有关系增加新的字段等,用户的应用程序不会受影响。

重构数据库最常见的是将一个基本表“垂直”地分成多个基本表,例如:将学生关系

尽管数据库的逻辑结构改变了(变为SX和SY两个表),但应用程序不必改变,因为新建立的视图定义为用户原来的关系,使用户的外模式保持不变,用户的应用程序通过视图仍然能够查找数据!

视图只能在一定程度上提供数据的独立性。比如由于对视图的更新是有条件的,因此应用程序中修改数据的语句可能仍会因基本表结构的改变而需要做相应修改。

4、视图能够对机密数据提供安全保护:对不同用户定义不同的视图,使每个用户只能看到他有权看到的数据,这样视图机制就自动提供了对机密数据的安全保护功能。

5、适当利用视图可以更清晰地表达查询。如下面的一个例子:


       接近两周的学习,写了两篇博客,数据库第3章的SQL语言学习报告分享就先到这了!当然后面还需要不断回顾复习,要不然我这脑子很容易忘掉的......也希望对大家有所帮助,可以给个小赞赞或者评论给点鼓励哦!

如有错漏欢迎纠正与补充,谢谢!

觉得还ok? 那就-->开启传送大阵,希望其他一些分享也能帮助到你嘞(笑脸)

猜你喜欢

转载自blog.csdn.net/weixin_44723488/article/details/105418610
今日推荐