视图——数据库中虚拟的表
什么是视图
视图是一个基于一个表或多个表的逻辑表,视图本身不包含任何数据。当基表中的数据发生变化时,视图里的数据同样发生变化。通常视图的数据源有:单一表的子集,多表操作结果集,视图的子集
视图的作用:使数据简化,使数据更加独立,增加安全性
视图的语法
CREATE [ OR REPLACE ] [[ NO ] FORCE ] VIEW --FROCE 强制创建视图
[ schema. ]view
[(alias,...) inline_constraint(s)] --别名和内联约束
[out_of_line_constraint(s)]
AS subquery
[
WITH { READ ONLY | CHECK OPTION [ CONSTRAINT constraint ]} --read only只读视图
--CHECK OPTION [ CONSTRAINT constraint ] 一旦使用,当对视图增加或者修改数据时必须满足子查询的条件。
];
创建视图
--单表视图
CREATE OR REPLACE VIEW SIMPLE_PRODUCTINFO_VIEW
AS
SELECT PRODUCTID,PRODUCTNAME,PRODUCTPRICE,CATEGORY,ORIGIN
FROM PRODUCTINFO
WHERE ORIGIN = 'CHINA'
AND ROWNUM < 6;
--多表视图
CREATE OR REPLACE VIEW MULTI_PRODUCTINFO_VIEW
AS
SELECT PT.PRODUCTID,PT.PRODUCTNAME,PT.PRODUCTPRICE,PT.CATEGORY,CG.CATEGROYNAME,PT.ORIGIN
FROM PRODUCTINFO PT,CATEGROYINFO CG
WHERE PT.CATEGORY = CG.CATEGROYID
AND PT.ORIGIN = '中国'
AND ROWNUM < 10;
--视图中的视图
CREATE OR REPLACE VIEW VI_PRODUCTINFO_VIEW
AS
SELECT PRODUCTID,PRODUCTNAME,PRODUCTPRICE,CATEGROYNAME,ORIGIN
FROM MULTI_PRODUCTINFO_VIEW;
--没有源表的视图
CREATE OR REPLACE FORCE VIEW NOTABLE_PRODUCTINFO_VIEW
AS
SELECT PRODUCTID,PRODUCTNAME,PRODUCTPRICE,CATEGROYNAME,ORIGIN
FROM NOTABLE
创建带约束的视图
CREATE OR REPLACE VIEW CONST_PRODUCTINFO_VIEW
(
PRODUCTID,
PRODUCTNAME CONSTRAINT PRODUCTNAME_UNQ UNIQUE RELY DISABLE NOVALIDATE, --使用inline方式对productname创建UNIQUE约束
PRODUCTPRICE,
QUANTITY,
CATEGORY,
ORIGIN,
CONSTRAINT VI_PRODUCTID_PRK PRIMARY KEY (PRODUCTID) RELY DISABLE NOVALIDATE --用out_of_line方式对视图设置主键约束
--RELY DISABLE NOVALIDATE 表示约束对此前此后的数据都不进行检查,并告知Oracle此视图现在符合这两种约束
)
AS
SELECT PRODUCTID,PRODUCTNAME,PRODUCTPRICE,QUANTITY,CATEGORY,ORIGIN
FROM PRODUCTINFO
WHERE ORIGIN = 'CHINA'
WITH CHECK OPTION;
对操作视图数据的限制
视图允许我们进行DML操作,但视图的增加和更新实际上是在源表中进行的,所以我们可以对视图进行设置更新限制条件。
视图的只读属性:在最后加上WITH READ ONLY
视图的检查约束: WITH CHECK OPTION
该选项表示视图启动了和子查询条件一样的约束,也就是说,如果对视图修改或插入的数据和查询条件不一致,那么该操作就会被终止。
如果你想要一个可以更新的视图,源表尽量是单表,否则限制比较多,下面的情况一旦出现在视图中,视图就不允许更新
- DISTINCT关键字
- 集合运算或分组函数,如INTERSECT,SUM,MAX,COUNT
- 出现GROUP BY,ORDER BY,MODEL,START WITH等语句
- 出现伪列关键字,如ROWNUM
对视图约束的修改
ALTER VIEW [schema.] view
ADD [CONSTRAINT constraint_name]
{UNIQUE (column [,column ]...)
| PRIMARY KEY (column [,column ]...)
| FOREIGN KEY (column [,column ]...)
references_clause
| CHECK (condition)
}
[constraint_state] --约束声明
--增加约束
ALTER VIEW SIMPLE_PRODUCTINFO_VIEW
ADD CONSTRAINT PUTPRIC_UNQ UNIQUE (PRODUCTPRICE)
DISABLE NOVALIDATE;
--查看约束
SELECT CONSTRAINT_NAME,TABLE_NAME,R_OWNER,R_CONSTRAINT_NAME
FROM USER_CONSTRAINTS
WHERE TABLE_NAME = 'SIMPLE_PRODUCTINFO_VIEW';
--删除约束
ALTER VIEW SIMPE_PRODUCTINFO_VIEW
DORP CONSTRAINT PUTPRIC_UNQ;
删除视图
DROP VIEW [.shcema.] view [CASCADE CONSTRAINTS] --删除视图时删除约束