第十一章:视图

视图:命名的sql语句,存储在数据字典中,视图本身不包含数据,视图的数据来源于

基表(创建视图时的子查询所关联的表)


授予scott用户创建试图的权限:

conn / as sysdba

grant create view to scott;


conn scott/tiger

create view v10

as

select empno,ename,sal,deptno

from emp --视图的基表

where deptno=10;


select * from v10;


查看视图的源代码

select text from user_views where view_name='V10';


select * from

(select empno,ename,sal,deptno

from emp

where deptno=10);


修改视图:

create or replace view v10

as

select empno,ename,sal,comm,deptno

from emp

where deptno=10;


create or replace view v

as

select deptno,job,sum(sal) total_sal

from emp

group by deptno,job

order by deptno;


对简单视图作delete的限制:

组函数

分组计算

有去重处理(distinct)

有rownum伪列


create or replace view v10

as

select rownum rn, empno,ename,sal,comm,deptno

from emp

where deptno=10;


对简单视图作update的限制:

组函数

分组计算

有去重处理(distinct)

有rownum伪列

带有计算表达式所生成的伪列


对简单视图作insert的限制:

组函数

分组计算

有去重处理(distinct)

有rownum伪列

带有计算表达式所生成的伪列

表中受非空约束作用的列在视图中没有包含


create or replace view v10

as

select empno,ename,sal,comm,deptno

from emp

where deptno=10;


insert into v10 values (7935,'ALEX',3500,null,20);


create or replace view v10

as

select empno,ename,sal,comm,deptno

from emp

where deptno=10

with check option; --不符合where条件的数据被屏蔽在视图之外


insert into v10 values (7935,'ALEX',3500,null,20);


create or replace view v10

as

select empno,ename,sal,comm,deptno

from emp

where deptno=10

with read only; --只读视图


create or replace view v20

as

select empno,ename,sal,comm,deptno

from emp_copy

where deptno=20

with read only;


ORA-00942: table or view does not exist


基表不存在的时候强制创建视图(force):

create or replace force view v20

(empno,first_name,salary,commission,department_id)

as

select empno,ename,sal,comm,deptno

from emp_copy

where deptno=20

with read only;


create or replace force view v20

as

select empno empno,

ename first_name,

sal salary,

comm commission,

deptno department_id

from emp_copy

where deptno=20

with read only;


删除视图:

drop view view_name;


内嵌视图:from 子句中包含的子查询

select * from

(select empno,ename,sal,comm,deptno from emp where deptno=10);