视图:
    从表中抽出来的逻辑上相关的数据集合
    视图其实就是一条查询SQL语句,用于显示一个或多个表或其它视图中相关数据。
    视图将查询的结果作为一个表来使用,因此视图可以被看作是存储的查询或一个虚拟表
    视图来源于表,所有对视图数据的修改最终都会被反映到视图的基表中,这些修改必须服从基表的完整性约束,并同样会触发定义
(Oracle支持在视图上显式的定义触发器和定义一些逻辑约束)
 
使用视图的好处:
    可把复杂的SQL语句简单化
    可保证数据的安全性,限制对数据的访问,因为它对表中的一些字段是隐藏的
    可使相同的数据以不同形式出现在不同的视图中
 
视图分类:
    简单视图
       只从一个表中获取数据
       不包含函数
       不包含分组数据
       可通过该视图进行DML操作
   
    复杂视图
       从多个表中获取数据
       包含函数
       包含分组数据
       不一定能通过视图进行DML操作
   
创建视图:
CREATE [OR REPLACE] [FORCE |NOFORCE ]VIEW view_name [alias [,alias]...]
AS
    [WITH CHECK OPTION]
    [WITH READ ONLY]
 
OR REPLACE
    FORCE         不管引用的表是否存在,都创建这个视图
    NOFORCE        只有当表存在的时候,才能创建这个视图(默认方式)
WITH CHECK OPTION 只有子查询能够检索出的行才能够被插入,修改,或删除。默认情况下对此不作检查
                     没有指定约束名,系统会自动为约束命名,形式为SYS_Cn。
WITH READ ONLY        只读,不可对视图做DML操作
   
ORDER BY ,子查询可以是复杂的SELECT语句
 
 
修改视图
CREATE OR REPLACE VIEW
   
删除视图:
DROP VIEW
 
视图中使用DML的规定:
INSERT
    组函数
GROUP BY、ORDER BY
DISTINCT
    ROWNUM
    列的定义为表达式
    表中非空的列,在视图定义中未包括
 
UPDATE
    组函数
GROUP BY、ORDER BY
DISTINCT
    ROWNUM
    列的定义为表达式
 
DELETE
    组函数
GROUP BY、ORDER BY
DISTINCT
    ROWNUM
 
 
与视图有关的数据字典:
    DBA_VIEWS
    USER_VIEWS
 
--演示创建视图 
> create or replace view vw_emp as
select empno,ename,sal from emp where sal >2500;
 
View created.
 
> select * from vw_emp;
 
        EMPNO ENAME             SAL
---------- ---------- ----------
         7566 JONES            2975
         7698 BLAKE            2850
         7788 SCOTT            3000
         7839 KING             5000
         7902 FORD             3000
 
> update vw_emp set sal = 3500 where ename = 'FORD';  --可以更新并且直接修改了基表
 
.
 
> select * from emp where ename = 'FORD';
 
        EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
-DEC-81       3500                    20
 
> insert into vw_emp select 9999,'Robinson',6000 from dual;  --可以插入并且直接修改了基表
 
.
 
> select * from emp where empno = 9999;
 
        EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
         9999 Robinson                                        6000
     
.
 
> delete from emp where ename = 'Robinson'; --可以删除并且直接修改了基表
 
.
 
> select * from vw_emp;
 
        EMPNO ENAME             SAL
---------- ---------- ----------
         7566 JONES            2975
         7698 BLAKE            2850
         7788 SCOTT            3000
         7839 KING             5000
         7902 FORD             3500
 
> rollback;
 
Rollback complete.
 
 
--使用with check option
--使用WITH CHECK OPTION 子句确保DML只能在特定的范围内执行,任何违反
--WITH CHECK OPTION 约束的请求都会失败
   
> create or replace view
as
select empno,ename,sal from emp where sal  >
with check option;
 
View created.
 
> insert into vw_emp select 9999,'Robinson',2000 from dual;  --不满足条件sal > 2500 不可插入
insert into vw_emp select 9999,'Robinson',2000 from
*
:
-01402: view WITH CHECK OPTION where-clause violation
 
 
> select * from vw_emp;
 
        EMPNO ENAME             SAL
---------- ---------- ----------
         7566 JONES            2975
         7698 BLAKE            2850
         7788 SCOTT            3000
         7839 KING             5000
         7902 FORD             3000
 
> delete from vw_emp where empno = 7902;     -- 满足条件sal > 2500 可以删除,并且修改了基表
 
.
 
> select * from vw_emp;
 
        EMPNO ENAME             SAL
---------- ---------- ----------
         7566 JONES            2975
         7698 BLAKE            2850
         7788 SCOTT            3000
         7839 KING             5000
 
> select  * from emp;
 
        EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
-DEC-80        800                    20
-FEB-81       1600        300         30
-FEB-81       1250        500         30
-APR-81       2975                    20
-SEP-81       1250       1400         30
-MAY-81       2850                    30
-JUN-81       2450                    10
-APR-87       3000                    20
-NOV-81       5000                    10
-SEP-81       1500          0         30
-MAY-87       1100                    20
 
        EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
-DEC-81        950                    30
-JAN-82       1300                    10
 
.
 
> rollback;
 
Rollback complete.
 
> select * from vw_emp;
 
        EMPNO ENAME             SAL
---------- ---------- ----------
         7566 JONES            2975
         7698 BLAKE            2850
         7788 SCOTT            3000
         7839 KING             5000
         7902 FORD             3000
 
> update vw_emp set sal = 2000 where empno = 7499;   --不满足条件,不能更新
 
.
 
--WITH READ ONLY 屏蔽DML 操作
--可以使用WITH READ ONLY 选项屏蔽对视图的DML操作
--任何DML 操作都会返回一个Oracle server 错误
 
> create or replace view
as
select empno,ename,sal from emp where sal >
with read only;
 
View created.
 
> insert into vw_emp select 9901,'Robinson',3000 from dual;
insert into vw_emp select 9901,'Robinson',3000 from
*
:
-01733: virtual column not
 
 
> select * from vw_emp;
 
        EMPNO ENAME             SAL
---------- ---------- ----------
         7566 JONES            2975
         7698 BLAKE            2850
         7788 SCOTT            3000
         7839 KING             5000
         7902 FORD             3000
 
> update vw_emp set sal = 8000 where empno = 7902;
update vw_emp set sal = 8000 where empno =
*
:
-01733: virtual column not
 
 
> delete from vw_emp where empno = 7566;
delete from vw_emp where empno =
*
:
-01752: cannot delete from view without exactly one key-preserved table
     
--创建复杂视图
> create view vw_sum_emp(name,minsal,maxsal,avgsal)
as
select dname,min(e.sal),max(e.sal),avg(e.sal)
from
join
on e.deptno = d.deptno
group by dname;
 
View created.
 
> select * from vw_sum_emp;
 
NAME
-------------- ---------- ---------- ----------
    ACCOUNTING           1300       5000 2916.66667
    RESEARCH              800       3000       2175
    SALES                 950       2850 1566.66667
 
--查询与视图有关的数据字典
> select view_name,text from user_views;
 
TEXT
------------------------------ --------------------------------------------------------------------------------
select dname,min(e.sal),max(e.sal),avg(e.sal)
from
join
on e.deptno = d.deptno
group by
 
select empno,ename,sal from emp where sal >
with read