Oracle视图

来源:互联网 发布:adb forward多个端口 编辑:程序博客网 时间:2024/06/05 08:01
视图是基于一张表或多张表或另外一个视图的逻辑表。视图不同于表,视图本身不包含任何数据。表是实际独立存在的实体,是用于存储数据的基本结构;而视图只是一种定义,对应一个查询语句。视图的数据都来自于某些表,这些表被称为基表数据库中只在数据字典中存储对视图的定义。
视图的好处:
用户可以通过视图以不同形式来显示基表中的数据。
通过视图可以设定允许用户访问的列和数据行,从而为表提供了额外的安全控制。
视图就对用户隐藏了数据的来源.
视图的分类:简单视图和复杂视图
简单视图:视图所代表的sql语句中如果没有group by、组函数语句,查询的只是一张表,这样的视图就是简单视图。
复杂视图:视图所代表的sql语句中如果有group by、组函数语句,查询的是多张表,这样的视图就是复杂视图。
简单视图和复杂视图的区别:
通过简单视图可以修改原来表中的数据,而通过复杂视图不可以修改原来表中的数据。
创建视图:
语法:
CREATE [OR REPLACE] VIEW view_name [(alias[, alias]...)]AS subquery[WITH CHECK OPTION [CONSTRAINT constraint]][WITH READ ONLY]
参数说明:
OR REPLACE:如果已经创建过该视图,oracle会自动重新再创建一次视图的。
alias:为了解决视图重名而起的别名。
subquery:为一条完整的select语句,可以在该语句中定义别名。
WITH CHECK OPTION:插入或删除的数据行必须满足视图定义的约束。
WITH READ ONLY:该视图上不能进行任何的DML操作。
例如:
create view view_testasselect * from  studentwhere  id<5;
说明:通过查询student表中id<5的数据来作为一个视图view_test,视图中的数据来源于基表student
查看视图的内容(和Oracle表的查询语句是一样的):
语法:select * from 视图名例如:select * from view_test
向视图中插入数据:
insert into student(id,name,age) values (1,"s1",22);
注意:这里插入操作是针对基表的,基表数据增加,视图的数据也会相应的自动增加
删除视图中的数据:
delete from 视图名  [限制条件]例如:delete from view_test where id=1;
注意:以上语句可以删除基表中id为1的数据行,但是仅限于简单查询

前面有说,WITH CHECK OPTION表示插入或删除的数据行必须满足视图定义的约束。也就是说,要通过视图来进行修改数据(插入,删除),那么也必须能通过这个视图显示出来
现在假设student表的结构是:id name,并且表中没有任何数据
现在插入两条数据:
insert  into  student  values(1,"aa");insert  into  student  values(2,"bb");
重新创建一个视图,并且加上with check option约束,如下:
create or replace view view_testasselect * from studentwhere id = 1with check option
下面执行如下操作
insert into view_test values(3,"cc")
这个插入会报错,因为这个操作通过视图显示不出来
update view_testset name="new"where id = 2
这个更新会报错,以为这个操作通过视图不能显示出来
update view_testset name="new"where id = 1
这样的更新才行,因为这个操作可以通过视图显示出来

视图上的DML操作应遵循的原则:
简单视图可以执行DML操作;
在视图包含GROUP 函数,GROUP BY子句,DISTINCT关键字时不能删除数据行;
在视图不出现下列情况时可通过视图修改基表数据或插入数据:
视图中包含GROUP 函数,GROUP BY子句,DISTINCT关键字;
使用表达式定义的列;
ROWNUM伪列。
基表中未在视图中选择的其他列定义为非空且无默认值。