视图,有关视图的官方解释是,它是一个基于一个表或多个表的逻辑表,视图本身不包含任何数据,恩,简单说就是一张虚拟的表,是一个查询语句的结果,但是它的数据是从表获取的,这些表成为源表或基表。当基表的数据发生变化时,视图里的数据同样发生变化。
通常视图的数据源有3种:1.单一表的子集 2.多表操作结果集 3.视图的子集
视图的三个作用: 1.简化数据 2.使数据更加独立 3.增加安全性
视图的基本语法:
CREATE [ OR REPLACE ] [ [NO] FORCE ] ] VIEW
[Schema.] VIEW
[ (alias,…) inline_constraint(s) ]
[out_of_line_constraint(s)]
AS SQLQUERY
[ WITH { READ ONLY | CHECK OPTION [CONSTRAINT constraint] } ];
语法解释说明:
OR REPLACE :表示新建视图可以覆盖原同名视图
[NO]FORCE :表示是否强制创建视图
Schema.view : 视图所属方案名称和视图本身的名称
Alias,… inline_constraint(s) : 视图字段别名和内联约束
Out_of_line_constraint(s) : 是与inline_constraint(s) 相反的约束声明
With read only : 只读视图,提高安全性
With check option [constraint constraint] : 对视图增加或修改数据时必须满足子查询的条件,相当于把子查询作为约束条件。(where 条件也作为约束条件)
例子:(单表视图)
CREATE OR REPLACEVIEW VIEW_TEST
AS
SELECT ORG_NUM,CUST_ID,ACCT_NUM,ACCT_NAME
FROM DEPOSIT_INFO
WHERE CUST_ID LIKE '1%'
WITH READ ONLY
注:多表视图相比于单表视图只是SQLQUERY部分是多个表关联出的数据,基于视图的视图则是由另一个视图而来,这里可以将视图看成表
带有约束的视图
CREATE OR REPLACE VIEW VIEW_TEST_QUE
(
ORG_NUM,
CUST_ID, --这个作为主键约束
ACCT_NUM,
ACCT_NAMECONSTRAINT ACCT_NAME_UNQ UNIQUE RELY DISABLE NOVALIDATE,--唯一约束
CONSTRAINT PK_CUST_ID PRIMARY KEY (CUST_ID) RELY DISABLE NOVALIDATE --建立主键约束
)
AS
SELECT ORG_NUM,CUST_ID,ACCT_NUM,ACCT_NAME
FROM DEPOSIT_INFO
WHERE CUST_ID LIKE '1%'
WITH CHECK OPTION;
如果想要一个可以更新(这里的更新是指增加删除,修改)的视图,源表应尽量是单表,否则限制比较多,
如下情况出现在视图中,视图就不允许更新
- DISTINCT关键字
- 集合运算或分组函数,如INTERSECT,SUM,MAX,COUNT等函数。
- 出现GROUP BY,ORDER BY,MODEL,START WITH等语句
- 出现伪列关键字,如ROWNUM
除了上述之外,还需要考虑基表的一些约束,这些约束对视图数据的更新都有一定影响,如果需要创建可以更新的视图,可以使用INSTEAD OF 触发器
视图约束的修改:
基本语法结构
ALTER VIEW [schema.]VIEW
Add [CONSTRAINTconstraint_name]
{ UNIQUE (column [,column] …)
| PRIMARY KEY (column [ ,column ]…)
| FOREIGN KEY (colum [,column ]…)
Reference_clause
| CHECK (condition)
}
[constraint_state]
说明:
- add [CONSTRAINT constraint_name ] 为视图增加一项约束,可以带约束名称
- unique 唯一约束 primary key 主键约束 foreign key 外键约束 check 检查约束
- constraint_state约束声明
例子: 增加
ALTER VIEW VIEW_TEST_QUE
ADD CONSTRAINT ACCT_NAME_UNQ UNIQUE (ACCT_NAME)
DISABLE NOVALIDATE;
例子:删除视图约束
Alter view [schema.] view drop CONSTRAINTconstraint_name;
视图的删除:
DROP view [schema.] view [cascade CONSTRAINTS]