Oracle 视图

来源:互联网 发布:2016年最火的网络用语 编辑:程序博客网 时间:2024/04/28 15:20

Oracle 视图

    视图: 你可以通过创建表的视图来表现数据的逻辑子集或数据的组合.视图是基于表或者另一个
          视图的逻辑表,一个视图并不包含它自己的数据,它象一个窗口,通过该窗口可以查看或改变
          表中的数据.视图基于其上的表称为基表.视图在数据字典中作为一个select语句存储.
         
          优点:
           1.限制数据的访问,因为视图能够选择性的显示表中的列.
             视图可以用来构成简单的查询以取出复杂查询的结果.例如,视图能用于从多表中
             查询信息,而用户不必知道怎样写连接语句.
     
           2.视图可以用来构成简单的查询以取回复杂查询的结果.例如,视图能用于多表查询信息.
             而用户不必知道怎样写连接语句.
 
           3.视图对特别的用户和应用程序提供数据独立性,一个视图可以从几个表中取回数据.
 
           4.视图提供用户组按照他们的特殊标准访问数据.
 
       复杂视图VS简单视图
            简单视图:
                      数据仅来自一个表,
                      不包含函数或数据分组
                      能通过视图执行DML操作
            复杂视图:
                      数据来自多个表
                      包含函数或数据分组
                      不总是允许通过视图进行DML操作(若非要进行操作,可使用替代触发器实现)
 
        创建视图:
             create [or replace] [force|noforce] View view_name alias as subquery
             子查询可以包含复杂的select语法
              or replace 如果视图已经存在重新创建它
              force      创建视图,而不管基表是否存在
              noforce    只在基表存在的情况下创建视图(默认)
              alias      为由视图查询选择的表达式指定名字
             
              with check option 指定只有可访问的行在视图中才能被插入或修改
              constraint        为check option 约束指定名字
              with read only    确保在该视图中没有DML操作被执行
 
        创建视图:
              create view v1 as select id from Test3 ;
             
              定义一个视图的子查询可以包含复杂的select语法,包括连分组和多个字
              查询.
 
              定义视图的子查询不能包含order by子句,当你从视图取回数据时可以指
              定order by子句.
              如果你没有为with check option选项创建的视图指定一个约束,系统将以
              SYS_Cn格式指定一个默认的名字.
                  
              可以用or replace选项改变视图的定义而无须删除和重建它,或重新授予以
              前已经授予它的对象权限.
       
        修改视图:
             create or replace view v1  as select id  from Test5; 
             用 or replace 选项,允许创建视图时同名存在,这样旧版本的的视图会被替换
        
        创建复杂视图:
             create view v2 as select a.id,b.content from Test3 a,Test2 b group by a.id;
        视图中DML操作的执行规则
             1.只能在简单视图上执行DML操作
             2.如果视图中包含下面的部分就不能删除行(视图为只读)
                    组函数,group by子句,distinct 关键字,伪列rownum关键字(补充:AVG、SUM等聚合函数)

     
        视图中DML操作的执行规则
             1.组函数
             2.group by 子句
             3.distinct关键字
             4.伪列rownum关键字
             5.用表达式定义的列
             6.基表中not null列不在视图中
       with check option 子句
             你可以确保DML操作在视图上被执行,用with check option 子句检查视图的域
             create or replace view TV3 as select * from Test5
             where id =1 with check option constraint TV3_PK;
            
             update TV3 set id = 2 where id = 1;
             执行错误;
 
             insert into TV3(id) values(3);
             执行错误;
             在TV3中已经指定了check option 为id =1,只能看到id为1的行,只能操作这一行,
             update TV3  set content='22' where id = 1;

        视图可以设置为只读属性:with read only
              create  or place view TV3 as select id from Test2 with read only;
 
        内建视图:
                 内建视图是一个带有别名的可以在SQL语句中使用的子查询
               
                 在一个主查询的from子句中指定的子查询就是一个内建视图
                 例:  select a.last_name,a.salary,a.department,b.maxsal
                      from  employees a,(select department_id,max(salary) maxsal
                                         from employees
                                         group by department_id) b
                      where a.department_id = b.department_id
                      and a.salary < b.maxsal
 
        Top-N分析 (oracle 中 不支持TOP N语句,所以需要用内建视图来完成.)
            Top-N查询寻找一列的n个最大值或最小值,例如:
               销售最好的前10位产品是什么?
               销售最差的前10位产品是什么?
            最大值和最小值在Top-N查询中设置
            select column_name,rownum
            from (select column
                  from table
                  order by Top-N_column)
            where rownum <= N;
           1.子循环或者内建视图产生数据的排序列表,该子查询或者内建视图
           包含order by 子句来确保排序
           2.在最后的结果集中用外循环限制行数.外循环包括下面的组成部分:
             rownum伪列,它从子查询返回每一行指定一个从1开始的连续的值
             where子句,它指定被返回的n行.

           例如: select rownum as rank,E.last_name,E.salary
                 from (select last_name,salary from employees
                       order by salary desc) E
                 where rownum <=3 
 
有关视图的一些数据字典的查看:
DESC DBA_VIEWS     管理员用户
DESC ALL_VIEWS      所有用户
DESC USER_VIEWS   当前用户
 
如查看某个视图的语法信息:
select  text from user_views where user_name='视图名'