视图在数据库中可以理解为一张虚拟的表。它是一个基于一个表或多个表的逻辑表,视图本身不包含任何数据,只是一个查询语句的结果。
语法:
CREATE [ OR REPLACE ] [ [ NO ] FORCE ] VIEW
[ schema.]viewName [ (alias,...) inline_constraint(s) ] [out_of_line_constrain(s)]
AS subquery
[
WITH {READ ONLY | CHECK OPTION [ CONSTRAINT constraint ] }
];
说明:
- [ NO ] FORCE:即FORRCE或NOFORCE,表示是否强制创建视图。例如:在基表不存在的情况下就创建视图是有错误的,这时可以用FORCE关键词强制创建视图,然后再创建基表。NO FORCE是默认值,即subquery中用到的表或者视图不存在,就会报错,如果用FORCE,则不会报错。
- [ (alias,...) inline_constraint(s) ]:视图字段的别名和内联的约束;
- [out_of_line_constrain(s)]:也是约束,是与 inline_constraint(s)相反的声明方式;
- subquery:查询语句,也就是视图中的数据来源;(这里的查询语句也可以包含其他的视图)
- WITH READ ONLY:设置视图只读,这样的视图具有更高的安全性;此时无法对只读的视图置顶DML操作;
- WITH CHECK OPTION [ CONSTRAINT constraint ]:一旦使用该限制,当对视图增加或修改数据时,必须满足子查询的条件。也就是说,是把子查询的条件作为一个约束,而constraint是这个约束的名称。
视图的创建:
CREATE OR REPLACE VIEW PRODUCT_VIEW
AS
select id, name from product;
创建带约束的视图:
- CREATE OR REPLACE VIEW PRODUCT_VIEW
- (
- id,
- name CONSTRAINT PRODUCT_VIEW_NAME UNIQUE RELY DISABLE NOVALIDATE,
- CONSTRAINT PRODUCT_VIEW_ID PRIMARY KEY(id) RELY DISABLE NOVALIDATE
- )
- AS
- select id, name from product;
说明:第4行使用inline方式对name创建了UNIQUE约束;
第5行用out_of_line方式对视图设置了主键约束;
第4和5行中的RELY DISABLE NOVALIDATE表示约束对此前和此后的数据都不进行检查,并告知Oracle此视图现在符合这两种条件约束条件。
对视图进行DML操作,使用方式就和操作普通的表一样,另外对视图进行DML操作,实际上就是对基表进行DML操作。注意:如果使用WITH READ ONLY,则不能对视图进行DML操作。WITH CHECK OPTION是加上约束:
CREATE OR REPLACE VIEW PRODUCT_VIEW
AS
select id, name from product where name = '小王'
WITH CHECK OPTION;
此时,如果添加一个数据,name不是小王,则会报错,修改同样也是。删除会成功,但是不会有任何记录受影响。
总得来说,加上了WITH CHECK OPTION后,对视图进行了DML操作后,会在视图上显示出来,如果不能显示出来,则是不符合的。
删除视图:
DROP VIEW [schema.]view [CASCADE CONSTRAINTS]
说明:CASCADE CONSTRAINTS:删除视图时删除约束。