现在的位置: 首页 > 综合 > 正文

SQL 基础–> 视图(CREATE VIEW)

2013年10月05日 ⁄ 综合 ⁄ 共 2774字 ⁄ 字号 评论关闭

--================================

-- SQL 基础--> 视图(CREATE VIEW)

--================================

 

视图:

    从表中抽出来的逻辑上相关的数据集合

    视图其实就是一条查询SQL语句,用于显示一个或多个表或其它视图中相关数据。

    视图将查询的结果作为一个表来使用,因此视图可以被看作是存储的查询或一个虚拟表

    视图来源于表,所有对视图数据的修改最终都会被反映到视图的基表中,这些修改必须服从基表的完整性约束,并同样会触发定义

    在基表上的触发器。(Oracle支持在视图上显式的定义触发器和定义一些逻辑约束)

 

使用视图的好处:

    可把复杂的SQL语句简单化

    可保证数据的安全性,限制对数据的访问,因为它对表中的一些字段是隐藏的

    可使相同的数据以不同形式出现在不同的视图中

 

视图分类:

    简单视图

       只从一个表中获取数据

       不包含函数

       不包含分组数据

       可通过该视图进行DML操作

   

    复杂视图

       从多个表中获取数据

       包含函数

       包含分组数据

       不一定能通过视图进行DML操作

   

创建视图:

    CREATE [OR REPLACE] FORCE NOFORCE VIEW view_name [alias [,alias]...]

    AS subquery

    [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 view_name

 

视图中使用DML的规定:

    当视图定义中含有以下元素之一不能使用INSERT

    组函数

    GROUP BYORDER BY

    DISTINCT

    ROWNUM

    列的定义为表达式

    表中非空的列,在视图定义中未包括

 

    视图定义含有以下元素不能使用UPDATE

    组函数

    GROUP BYORDER BY

    DISTINCT

    ROWNUM

    列的定义为表达式

 

    视图包含以下元素不能DELETE

    组函数

    GROUP BYORDER BY

    DISTINCT

    ROWNUM

 

 

与视图有关的数据字典:

    DBA_VIEWS

    USER_VIEWS

 

--演示创建视图 

    SQL> create or replace view vw_emp as

      2  select empno,ename,sal from emp where sal >2500;

 

    View created.

 

    SQL> select * from vw_emp;

 

        EMPNO ENAME             SAL

    ---------- ---------- ----------

         7566 JONES            2975

         7698 BLAKE            2850

         7788 SCOTT            3000

         7839 KING             5000

         7902 FORD             3000

 

    SQL> update vw_emp set sal = 3500 where ename = 'FORD';  --可以更新并且直接修改了基表

 

    1 row updated.

 

    SQL> select * from emp where ename = 'FORD';

 

        EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO

    ---------- ---------- --------- ---------- --------- ---------- ---------- ----------

         7902 FORD       ANALYST         7566 03-DEC-81       3500                    20

 

    SQL> insert into vw_emp select 9999,'Robinson',6000 from dual;  --可以插入并且直接修改了基表

 

    1 row created.

 

    SQL> select * from emp where empno = 9999;                   

 

        EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO

    ---------- ---------- --------- ---------- --------- ---------- ---------- ----------

         9999 Robinson                                        6000

     

    1 rows selected.

 

    SQL> delete from emp where ename = 'Robinson'; --可以删除并且直接修改了基表

 

    1 row deleted.

 

    SQL> select * from vw_emp;

 

        EMPNO ENAME             SAL

    ---------- ---------- ----------

         7566 JONES            2975

         7698 BLAKE            2850

         7788 SCOTT            3000

         7839 KING             5000

         7902 FORD             3500

 

    SQL> rollback;

 

    Rollback complete.

 

 

抱歉!评论已关闭.