精华内容
下载资源
问答
  • oracle视图

    2019-03-14 16:19:32
    Oracle的oracle视图 介绍 视图是一张虚拟表,其内容由查询定义,同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的...

     

    Oracle的oracle视图

    • 介绍

    视图是一张虚拟表,其内容由查询定义,同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。(视图不是真实存在磁盘上的)

    • 视图和表的区别
    1. 表需要占用磁盘空间,视图不需要。
    2. 视图不能添加索引(所以查询速度略微慢点)
    3. 使用视图可以简化复杂查询
    4. 视图的使用利于提高安全性(比如:不同用户查看不同视图)

     

    注意:当表结构过于复杂,请使用视图吧!

    展开全文
  • Oracle视图

    2019-01-18 14:07:52
    Oracle视图 1、概念 视图:视图就是一张通过查询获取的虚拟表,视图中本身不存在数据,数据来自于视图对源表的映射引用,一张数据表可以根据不同的需要创建多个不同的视图。 2、代码 --创建视图 create or replace ...

    Oracle视图

    1、概念

    视图:视图就是一张通过查询获取的虚拟表,视图中本身不存在数据,数据来自于视图对源表的映射引用,一张数据表可以根据不同的需要创建多个不同的视图。
    

    2、代码

    --创建视图
    create or replace view view_ownerpid as select * from t_owners where ownertypeid = 1
    --查看视图
    select * from view_ownerpid
    --更新视图
    update view_ownerpid set name='王刚' where id=2
    --删除视图
    drop view view_ownerpid
    --创建视图
    create or replace view t_owner as select id,t.name as 名字,t.adddate as 时间 from t_owners t where t.ownertypeid = 1
    --查看视图
    select * from t_owner
    --更新视图
    update t_owner set 名字='王强' where id=2
    --删除视图
    drop view t_owner
    
    展开全文
  • Oracle 视图

    2017-01-11 10:44:09
    昨天整理了Oracle存储过程的内容,今天又整理了一些关于Oracle视图的内容,很详细,分享给大家 Oracle视图详解一. 视图的定义 视图(view),也称虚表, 不占用物理空间,这个也是相对概念,因为视图本身的定义语句...
    昨天整理了Oracle存储过程的内容,今天又整理了一些关于Oracle视图的内容,很详细,分享给大家
    

    Oracle视图详解

    一. 视图的定义
    视图(view),也称虚表, 不占用物理空间,这个也是相对概念,因为视图本身的定义语句还是要存储在数据字典里的。视图只有逻辑定义。每次使用的时候,只是重新执行SQL。
    视图是从一个或多个实际表中获得的,这些表的数据存放在数据库中。那些用于产生视图的表叫做该视图的基表。一个视图也可以从另一个视图中产生。
    视图的定义存在数据库中,与此定义相关的数据并没有再存一份于数据库中。通过视图看到的数据存放在基表中。
    视图看上去非常象数据库的物理表,对它的操作同任何其它的表一样。当通过视图修改数据时,实际上是在改变基表中的数据;相反地,基表数据的改变也会自动反映在由基表产生的视图中。由于逻辑上的原因,有些Oracle视图可以修改对应的基表,有些则不能(仅仅能查询)。
    还有一种视图:物化视图(MATERIALIZED VIEW ),也称实体化视图,快照 (8i 以前的说法) ,它是含有数据的,占用存储空间。
    tips: 查询视图没有什么限制, 插入/更新/删除视图的操作会受到一定的限制; 所有针对视图的操作都会影响到视图的基表; 为了防止用户通过视图间接修改基表的数据, 可以将视图创建为只读视图(带上with read only选项)

    二. 视图的作用

    1)提供各种数据表现形式, 可以使用各种不同的方式将基表的数据展现在用户面前, 以便符合用户的使用习惯(主要手段: 使用别名);
    2)隐藏数据的逻辑复杂性并简化查询语句, 多表查询语句一般是比较复杂的, 而且用户需要了解表之间的关系, 否则容易写错; 如果基于这样的查询语句创建一个视图, 用户就可以直接对这个视图进行”简单查询”而获得结果. 这样就隐藏了数据的复杂性并简化了查询语句.这也是oracle提供各种”数据字典视图”的原因之一,all_constraints就是一个含有2个子查询并连接了9个表的视图(在catalog.sql中定义);
    3)执行某些必须使用视图的查询. 某些查询必须借助视图的帮助才能完成. 比如, 有些查询需要连接一个分组统计后的表和另一表, 这时就可以先基于分组统计的结果创建一个视图, 然后在查询中连接这个视图和另一个表就可以了;
    4)提供某些安全性保证. 视图提供了一种可以控制的方式, 即可以让不同的用户看见不同的列, 而不允许访问那些敏感的列, 这样就可以保证敏感数据不被用户看见;
    5)简化用户权限的管理. 可以将视图的权限授予用户, 而不必将基表中某些列的权限授予用户, 这样就简化了用户权限的定义。

    三 创建视图
    1权限: 要在当前方案中创建视图, 用户必须具有create view系统权限; 要在其他方案中创建视图, 用户必须具有create any view系统权限. 视图的功能取决于视图拥有者的权限.
    2 语法:

    create [ or replace ] [ force ] view [schema.]view_name
                          [ (column1,column2,...) ]
                          as 
                          select ...
                          [ with check option ]                      [ constraint constraint_name ]
                          [ with read only ];

    tips:
    1 or replace: 如果存在同名的视图, 则使用新视图”替代”已有的视图
    2 force: “强制”创建视图,不考虑基表是否存在,也不考虑是否具有使用基表的权限
    3 column1,column2,…:视图的列名, 列名的个数必须与select查询中列的个数相同; 如果select查询包含函数或表达式, 则必须为其定义列名.此时, 既可以用column1, column2指定列名, 也可以在select查询中指定列名.
    4 with check option: 指定对视图执行的dml操作必须满足“视图子查询”的条件,即对通过视图进行的增删改操作进行”检查”,要求增删改操作的数据, 必须是select查询所能查询到的数据,否则不允许操作并返回错误提示. 默认情况下, 在增删改之前”并不会检查”这些行是否能被select查询检索到.
    5 with read only:创建的视图只能用于查询数据, 而不能用于更改数据.
    3.1 创建简单视图
    简单视图定义:是指基于单个表建立的,不包含任何函数、表达式和分组数据的视图。

    SQL> conn /as sysdba
    Connected.
    SQL> grant create view to scott;
    SQL> conn scott/tiger
    Connected.
    SQL> create view vw_emp as select empno,ename,job,hiredate,deptno from emp;
    SQL> desc vw_emp

    Name Null? Type


    EMPNO NOT NULL NUMBER(4)
    ENAME VARCHAR2(10)
    JOB VARCHAR2(9)
    HIREDATE DATE
    DEPTNO NUMBER(2)

    SQL> select * from vw_emp where deptno=10;

     EMPNO ENAME      JOB       HIREDATE      DEPTNO
    

    ———- ———- ——— ———
    7782 CLARK MANAGER 09-JUN-81 10
    7839 KING PRESIDENT 17-NOV-81 10
    7934 MILLER CLERK 23-JAN-82 10

    对简单视图进行DML操作

    SQL> insert into vw_emp values(1,'a','aa','05-JUN-88',10);
    SQL> update vw_emp set ename='cc' where ename='KING';
    SQL> delete vw_emp where ename='cc';
    SQL> select * from vw_emp where deptno=10;
     EMPNO ENAME      JOB       HIREDATE      DEPTNO
    

      7782 CLARK      MANAGER   09-JUN-81         10
      7934 MILLER     CLERK     23-JAN-82         10
         1 a          aa        05-JUN-88         10
    

    基表也发生了相应的更改

    SQL> select empno,ename,job,hiredate,deptno from emp where deptno=10;
     EMPNO ENAME      JOB       HIREDATE      DEPTNO
    

      7782 CLARK      MANAGER   09-JUN-81         10
      7934 MILLER     CLERK     23-JAN-82         10
         1 a          aa        05-JUN-88         10
    
    SQL> select object_name,object_type from user_objects;

    OBJECT_NAME OBJECT_TYPE


    VW_EMP VIEW
    SALGRADE TABLE
    BONUS TABLE
    PK_EMP INDEX
    EMP TABLE
    DEPT TABLE
    PK_DEPT INDEX

    7 rows selected.

    创建只读视图

    SQL> create view vw_emp_readonly as select empno,ename,job,hiredate,deptno from emp with read only;
    
    SQL> select * from vw_emp_readonly where deptno=10;
     EMPNO ENAME      JOB       HIREDATE      DEPTNO
    

      7782 CLARK      MANAGER   09-JUN-81         10
      7934 MILLER     CLERK     23-JAN-82         10
         1 a          aa        05-JUN-88         10
    

    只能查询,无法进行更改

    SQL> delete vw_emp_readonly where empno=1;

    delete vw_emp_readonly where empno=1
    *
    ERROR at line 1:
    ORA-42399: cannot perform a DML operation on a read-only view

    更新基表,只读视图也发生了相应的更改
    SQL> update emp set empno=2 where ename=’a’;
    SQL> select * from vw_emp_readonly where deptno=10;

     EMPNO ENAME      JOB       HIREDATE      DEPTNO
    

      7782 CLARK      MANAGER   09-JUN-81         10
      7934 MILLER     CLERK     23-JAN-82         10
         2 a          aa        05-JUN-88         10
    

    创建检查约束视图with check option

    Sql>create view vw_emp_check as select empno,ename,job,hiredate,deptno from emp where deptno=10 with check option;
    
    SQL> insert into vw_emp_check values('2','c','cc','02-JAN-55',10);

    SQL> insert into vw_emp_check values(‘3’,’d’,’dd’,’02-JAN-65’,20);
    insert into vw_emp_check values(‘3’,’d’,’dd’,’02-JAN-65’,20)
    *
    ERROR at line 1:
    ORA-01402: view WITH CHECK OPTION where-clause violation
    创建检查视图:对通过视图进行的增删改操作进行检查,要求增删改操作的数据必须是select查询所能查询到的数据
    20号部门不在查询范围内,违反检查约束,所以无法插入;

    SQL> delete vw_emp_check where empno=2;

    1 row deleted.
    ——–所删除的数据在查询范围内,不违反检查约束

    3.2 连接视图

    3.2.1 连接视图定义:是指基于多个表所创建的视图,即,定义视图的查询是一个连接查询。 主要目的是为了简化连接查询;

    3.2.2 创建连接视图
    示例1: 查询部门编号为10和30的部门及雇员信息

    SQL> create view vw_dept_emp
        as select a.deptno,a.dname,a.loc,b.empno,b.ename,b.sal from dept a,emp b where a.deptno=b.deptno and a.deptno in(10,30);

    View created.

    SQL> select * from vw_dept_emp;

    DEPTNO DNAME          LOC             EMPNO ENAME             SAL
    

        30 SALES          CHICAGO             7499 ALLEN            1600
        30 SALES          CHICAGO             7521 WARD             1250
        30 SALES          CHICAGO             7654 MARTIN           1250
        30 SALES          CHICAGO             7698 BLAKE            2850
        10 ACCOUNTING    NEW YORK           7782 CLARK            2450
        30 SALES          CHICAGO             7844 TURNER           1500
        30 SALES          CHICAGO             7900 JAMES             950
        10 ACCOUNTING    NEW YORK           7934 MILLER           1300
        10 ACCOUNTING     NEW YORK               1 a
    

    9 rows selected.

    3.2.3 连接视图上的DML操作

    SQL> insert into vw_dept_emp values(10,'aaa','aaaa',22,'a',5000);

    insert into vw_dept_emp values(10,’aaa’,’aaaa’,22,’a’,5000)
    *
    ERROR at line 1:
    ORA-01779: cannot modify a column which maps to a non key-preserved table
    在视图上进行的所有DML操作,最终都会在基表上完成;
    select 视图没有什么限制,但insert/delete/update有一些限制;

    3.2.4键值保存表
    如果连接视图中的一个“基表的键”(主键、唯一键)在它的视图中仍然存在,并且“基表的键”仍然是“连接视图中的键”(主键、唯一键);即,某列在基表中是主键|唯一键,在视图中仍然是主键|唯一键,则称这个基表为“键值保存表”。
    一般地,由主外键关系的2个表组成的连接视图,外键表就是键值保存表,而主键表不是。

    3.2.5 连接视图的更新准则
    一:一般准则——(讲)
    1 任何DML操作,只能对视图中的键值保存表进行更新, 即,“不能通过连接视图修改多个基表”;
    2 在DML操作中,“只能使用连接视图定义过的列”;
    3 “自连接视图”的所有列都是可更新(增删改)的
    二:insert准则
    1 在insert语句中不能使用“非键值保存表”中的列(包括“连接列”);
       2 执行insert操作的视图,至少应该“包含”键值保存表中所有设置了约束的列;
       3 如果在定义连接视图时使用了WITH CHECK OPTION 选项,则“不能”针对连接视 图执行insert操作
    三:update准则
       1 键值保存表中的列是可以更新的;
       2 如果在定义连接视图时使用了WITH CHECK OPTION 选项,则连接视图中的连接列(一般就是“共有列”)和基表中的“其他共有列”是“不可”更新的,连接列和共有列之外的 其他列是“可以”更新的
    四:delete准则
    1如果在定义连接视图时使用了WITH CHECK OPTION 选项,依然“可以”针对连接视图执行delete操作
    3.2.6 可更新连接视图
    如果创建连接视图的select查询“不包含”如下结构,并且遵守连接视图的“更新准则”,则这样的连接视图是“可更新”的:
    一:集合运算符(union,intersect,minus)
    二:DISTINCT关键字
    三:GROUP BY,ORDER BY,CONNECT BY或START WITH子句
    四:子查询
    五:分组函数
    六:需要更新的列不是由“列表达式”定义的
    七:基表中所有NOT NULL列均属于该视图
    3.3 创建复杂视图
    复杂视图定义:是指包含函数、表达式、或分组数据的视图。主要目的是为了简化查询。主要用于执行查询操作,并不用于执行DML操作。
    注意:当视图的select查询中包含函数或表达式时,必须为其定义列别名。

    示例1:查询目前每个岗位的平均工资、工资总和、最高工资和最低工资。

    SQL> create view vw_emp_job_sal(job,avgsal,sumsal,maxsal,minsal)
         as select job,avg(sal),sum(sal),max(sal),min(sal) from emp group by job;

    View created.

    SQL> select * from vw_emp_job_sal;

    JOB AVGSAL SUMSAL MAXSAL MINSAL


    CLERK 1037.5 4150 1300 800
    SALESMAN 1400 5600 1600 1250
    aa
    MANAGER 2758.33333 8275 2975 2450
    ANALYST 3000 6000 3000 3000

    3.4 强制创建视图
    强制视图定义:正常情况下,如果基表不存在,创建视图就会失败。但是可以使用force选项强制创建视图(前提:创建视图的语句没有语法错误!),此时该视图处于失效状态。

    SQL> create force view vw_test_tab
         as select c1,c2 from test_tab;

    Warning: View created with compilation errors. 警告: 创建的视图带有编译错误。

    SQL> select * from vw_test_tab;

    select * from vw_test_tab
    *
    ERROR at line 1:
    ORA-04063: view “SCOTT.VW_TEST_TAB” has errors

    SQL> select object_name,status from user_objects where object_name='VW_TEST_TAB';

    OBJECT_NAME STATUS


    VW_TEST_TAB INVALID ———视图状态为不可用

    SQL> create table test_tab(c1 number(9) primary key,c2 varchar2(20),c3 varchar2(30));

    Table created.

    SQL> select * from vw_test_tab;

    no rows selected

    SQL> select object_name,status from user_objects where object_name='VW_TEST_TAB';

    OBJECT_NAME STATUS


    VW_TEST_TAB VALID ————–视图状态为可用

    四 更改视图
    在对视图进行更改(或重定义)之前,需要考虑如下几个问题:
     1  由于视图只是一个虚表,其中没有数据,所以更改视图只是改变数据字典中对该视图的
    定义信息,视图的所有基础对象都不会受到任何影响
     2  更改视图之后,依赖于该视图的所有视图和PL/SQL程序都将变为INVALID(失效)状态
     3  如果以前的视图中具有with check option选项,但是重定义时没有使用该选项,则以前
    的此选项将自动删除。

    4.1更改视图的定义
    方法——执行create or replace view语句。这种方法代替了先删除(“权限也将随之删除”)后创建的方法,会保留视图上的权限,但与该视图相关的存储过程和视图会失效。
    示例1:
    将视图改为改为只读

    SQL> create or replace view vw_emp
         as
         select empno,ename,job,hiredate,deptno from emp with read only;

    View created.

    4.2视图的重新编译
    语法:alter view 视图名 compile;
    作用:当视图依赖的基表改变后,视图会“失效”。为了确保这种改变“不影响”视图和依赖于该视图的其他对象,应该使用 alter view 语句“明确的重新编译”该视图,从而在运行视图前发现重新编译的错误。视图被重新编译后,若发现错误,则依赖该视图的对象也会失效;若没有错误,视图会变为“有效”。
    权限:为了重新编译其他模式中的视图,必须拥有alter any table系统权限。
    注意:当访问基表改变后的视图时,oracle会“自动重新编译”这些视图。

    示例1:

    SQL> select last_ddl_time,object_name,status from user_objects where object_name='VW_TEST_TAB';

    LAST_DDL_ OBJECT_NAME STATUS


    23-AUG-14 VW_TEST_TAB VALID —–视图的状态:有效

    SQL> alter table test_tab modify(c2 varchar2(30)); ——修改基表,c2列的长度

    SQL> select last_ddl_time,object_name,status from user_objects where object_name='VW_TEST_TAB';

    LAST_DDL_ OBJECT_NAME STATUS


    23-AUG-14 VW_TEST_TAB INVALID ——视图的状态:失效

    SQL> alter view vw_test_tab compile;                 ---重新编译
    SQL> select last_ddl_time,object_name,status from user_objects where object_name='VW_TEST_TAB';

    LAST_DDL_ OBJECT_NAME STATUS


    23-AUG-14 VW_TEST_TAB VALID —视图有效

    思考:若上述代码修改的不是列长,而是表名,结果又会如何?
    <警告:更改的视图带有编译错误;视图状态:失效>
    五 删除视图
    可以删除当前模式中的任何视图;
    如果要删除其他模式中的视图,必须拥有DROP ANY VIEW系统权限;
    视图被删除后,该视图的定义会从词典中被删除,并且在该视图上授予的“权限”也将被删除。
    视图被删除后,其他引用该视图的视图及存储过程等都会失效。
    示例1:drop view vw_test_tab;

    六 查看视图
    使用数据字典视图
    1 dba_views——DBA视图描述数据库中的所有视图
    2 all_views——ALL视图描述用户“可访问的”视图
    3 user_views——USER视图描述“用户拥有的”视图
    4 dba_tab_columns——DBA视图描述数据库中的所有视图的列(或表的列)
    5 all_tab_columns——ALL视图描述用户“可访问的”视图的列(或表的列)
    6 user_tab_columns——USER视图描述“用户拥有的”视图的列(或表的列)
    示例1:查询当前方案中所有视图的信息

    SQL> select view_name,text from user_views;

    VIEW_NAME TEXT


    VW_DEPT_EMP select a.deptno,a.dname,a.loc,b.empno,b.ename,b.sal fro
    m dept a,emp b where a.de

    VW_EMP select empno,ename,job,hiredate,deptno from emp
    VW_EMP_CHECK select empno,ename,job,hiredate,deptno from emp where d
    eptno=10 with check optio

    VW_EMP_JOB_SAL select job,avg(sal),sum(sal),max(sal),min(sal) from emp
    group by job

    VW_EMP_READONLY select empno,ename,job,hiredate,deptno from emp with re
    ad only

    VW_TEST_TAB select c1,c2 from test_tab

    6 rows selected.

    示例2:查询当前方案中指定视图(或表)的列名信息

    select * from user_tab_columns where table_name='VW_DEPT'; 

    七 在视图上执行DML操作的步骤和原理
    第一步:将针对视图的SQL语句与视图的定义语句(保存在数据字典中)“合并”成一条SQL语句
    第二步:在内存结构的共享SQL区中“解析”(并优化)合并后的SQL语
    第三步:“执行”SQL语句
    示例:假设视图v_emp的定义语句如下:

    create view v_emp 
    as
    select empno,ename,loc from employees emp,departments dept
    where
     emp.deptno=dept.deptno and dept.deptno=10; 

    当用户执行如下查询语句时:

    select ename from v_emp where empno=9876; 

    oracle将把这条SQL语句与视图定义语句“合并”成如下查询语句:

    select ename from employees emp,departments dept
    where
     emp.deptno=dept.deptno and dept.deptno=10 and empno=9876; 

    然后,解析(并优化)合并后的查询语句,并执行查询语句;
    7.1查询视图“可更新”(包括“增删改”)的列
    使用数据字典视图
    dba_updatable_columns——显示数据库所有视图中的所有列的可更新状态
    all_updatable_columns——显示用户可访问的视图中的所有列的可更新状态
    user_updatable_columns——显示用户拥有的视图中的所有列的可更新状态
    示例1:

    SQL> select table_name,column_name,insertable,updatable,deletable from user_updatable_columns;

    TABLE_NAME COLUMN_NAME INS UPD DEL


    VW_EMP_READONLY EMPNO NO NO NO
    VW_EMP_READONLY ENAME NO NO NO
    VW_EMP_READONLY JOB NO NO NO
    VW_EMP_READONLY HIREDATE NO NO NO
    VW_EMP_READONLY DEPTNO NO NO NO
    VW_EMP_CHECK EMPNO YES YES YES
    VW_EMP_CHECK ENAME YES YES YES
    VW_EMP_CHECK JOB YES YES YES
    VW_EMP_CHECK HIREDATE YES YES YES
    VW_EMP_CHECK DEPTNO YES YES YES
    VW_DEPT_EMP DEPTNO NO NO NO
    VW_DEPT_EMP DNAME NO NO NO
    VW_DEPT_EMP LOC NO NO NO
    VW_DEPT_EMP EMPNO YES YES YES
    VW_DEPT_EMP ENAME YES YES YES
    VW_DEPT_EMP SAL YES YES YES
    VW_EMP_JOB_SAL JOB NO NO NO
    VW_EMP_JOB_SAL AVGSAL NO NO NO
    VW_EMP_JOB_SAL SUMSAL NO NO NO
    VW_EMP_JOB_SAL MAXSAL NO NO NO
    VW_EMP_JOB_SAL MINSAL NO NO NO
    VW_TEST_TAB C1 YES YES YES
    VW_TEST_TAB C2 YES YES YES
    VW_EMP EMPNO YES YES YES
    VW_EMP ENAME YES YES YES
    VW_EMP JOB YES YES YES
    VW_EMP HIREDATE YES YES YES
    VW_EMP DEPTNO YES YES YES
    SALGRADE GRADE YES YES YES
    SALGRADE LOSAL YES YES YES
    SALGRADE HISAL YES YES YES
    EMP EMPNO YES YES YES
    EMP ENAME YES YES YES
    EMP JOB YES YES YES
    EMP MGR YES YES YES
    EMP HIREDATE YES YES YES
    EMP SAL YES YES YES
    EMP COMM YES YES YES
    EMP DEPTNO YES YES YES
    TEST_TAB C1 YES YES YES
    TEST_TAB C2 YES YES YES
    TEST_TAB C3 YES YES YES
    BONUS ENAME YES YES YES
    BONUS JOB YES YES YES
    BONUS SAL YES YES YES
    BONUS COMM YES YES YES
    DEPT DEPTNO YES YES YES
    DEPT DNAME YES YES YES
    DEPT LOC YES YES YES

    49 rows selected.

    完成啦。。。

    展开全文
  • oracle 视图

    2014-07-15 12:26:52
    oracle 视图 一.视图的定义就是其使用的查询语句,Oracle 将这个定义以文本形式存储在数据字典中。当用户在 SQL 语句中引用了视图时,Oracle 将进行以下工作: 1. 将引用了视图的语句与视图的定义语句整合为...
    

    oracle 视图

    一.视图的定义就是其使用的查询语句,Oracle 将这个定义以文本形式存储在数据字典中。当用户在 SQL 语句中引用了视图时,Oracle 将进行以下工作:
    1.  将引用了视图的语句与视图的定义语句整合为(merge)一个语句
    2.  在共享 SQL 区(shared SQL area)解析(parse)整合后的语句
    3.  执行(execute)此语句

    二.视图的使用与基表的索引
    oracle 会尽可能地将用户查询及其中所引用视图的定义查询(可能还包括视图所引用的其他视图)进行整合。Oracle 将优化整合后的语句,就
    如同用户提交的语句中没有引用视图一样。因此,无论一列是被视图的定义引用,还是被用户提交的查询引用,Oracle 都可以使用建于基表列
    (base table column)上的索引。

    视图实际上是一个或多个表上的预定义查询,这些表称为基表。  视图并不存储数据,只是在查询视图时才访问基表。 
    视图的优点: 
        ·限制用户只能通过视图检索数据,对用户屏蔽基表 
        ·可以将复杂的查询编写为视图,减少用户查询的复杂度 
        ·限制某个视图只能访问基表中的部分数据,提高了安全性 
     
    三.创建视图 
    create [or replace] [{force|noforce}] view view_name 
    [(alias_name[,alias_name...])] 
    as subquery 
    [with {check option|read only} constraint constraint_name] 

    or replace:如果视图存在就替换它。 
    force:即使基表不存在也要建立该视图。 
    noforce:若基表不存在就不建立此视图,默认值。 
    view_name:视图名称。 
    alias_name:为自查询中的表达式指定一个别名,别名个数与子查询中列数相同。 
    subquery:指定一个子查询,它对基表进行查询,如果已经提供别名,可以在select子句之后的列表中使用别名 
    with check option:表名只有子查询检索的行才能被插入、删除、更新, 
           默认情况下,在插入、删除、更新行之前并不会检查这些行是否被子查询检索。
    with read only:说明只能对基表中的行进行只读访问。 
    constraint_name:指定with check option或read only约束的名称。 
     
    视图有两种基表类型 
        ·简单视图,包含一个子查询,它只能从一个基表中检索数据 
        ·复杂视图,包含一个子查询,有以下特点: 
            ·从多个基表中检索数据 
            ·使用group by或distinct子句对行进行分组 
            ·包含函数调用
     
    #########################################################################
    一. 视图的定义
        视图(view),也称虚表, 不占用物理空间,这个也是相对概念,因为视图本身的定义语句还是要存储在数据字典里的。
    视图只有逻辑定义。每次使用的时候, 只是重新执行SQL.
        视图是从一个或多个实际表中获得的,这些表的数据存放在数据库中。那些用于产生视图的表叫做该视图的基表。
    一个视图也可以从另一个视图中产生。
        视图的定义存在数据库中,与此定义相关的数据并没有再存一份于数据库中。通过视图看到的数据存放在基表中。
        视图看上去非常象数据库的物理表,对它的操作同任何其它的表一样。当通过视图修改数据时,实际上是在改变基表中的数据;
    相反地,基表数据的改变也会自动反映在由基表产生的视图中。由于逻辑上的原因,有些Oracle视图可以修改对应的基表,有些则不能(仅仅能查询)。
        还有一种视图:物化视图(MATERIALIZED VIEW ),也称实体化视图,快照 (8i 以前的说法) ,它是含有数据的,占用存储空间。
        关于物化视图,具体参考Oracle 物化视图http://blog.csdn.net/tianlesoftware/article/details/4713553

    二. 视图的作用
    2.1 简单性。
           看到的就是需要的。视图不仅可以简化用户对数据的理解,也可以简化他们的操作。那些被经常使用的查询可以被定义为视图,
           从而使得用户不必为以后的操作每次指定全部的条件。
    2.2 安全性。
           通过视图用户只能查询和修改他们所能见到的数据。数据库中的其它数据则既看不见也取不到。
           数据库授权命令可以使每个用户对数据库的检索限制到特定的数据库对象上,但不能授权到数据库特定行和特定的列上。
           通过Oracle视图,用户可以被限制在数据的不同子集上:
           使用权限可被限制在基表的行的子集上。
           使用权限可被限制在基表的列的子集上。
           使用权限可被限制在基表的行和列的子集上。
           使用权限可被限制在多个基表的连接所限定的行上。
           使用权限可被限制在基表中的数据的统计汇总上。
           使用权限可被限制在另一视图的一个子集上,或是一些视图和基表合并后的子集上。
           视图的安全性可以防止未授权用户查看特定的行或列,是用户只能看到表中特定行的方法如下:

           1 在表中增加一个标志用户名的列;
           2 建立Oracle视图,是用户只能看到标有自己用户名的行;
           3 把视图授权给其他用户。

    2.3 逻辑数据独立性。
           视图可帮助用户屏蔽真实表结构变化带来的影响。
           视图可以使应用程序和数据库表在一定程度上独立。如果没有视图,应用一定是建立在表上的。
           有了视图之后,程序可以建立在视图之上,从而程序与数据库表被视图分割开来。
           视图可以在以下几个方面使程序与数据独立:
           1 如果应用建立在数据库表上,当数据库表发生变化时,可以在表上建立视图,通过视图屏蔽表的变化,从而应用程序可以不动。
           2 如果应用建立在数据库表上,当应用发生变化时,可以在表上建立视图,通过视图屏蔽应用的变化,从而使数据库表不动。
           3 如果应用建立在视图上,当数据库表发生变化时,可以在表上修改视图,通过视图屏蔽表的变化,从而应用程序可以不动。
           4 如果应用建立在视图上,当应用发生变化时,可以在表上修改视图,通过视图屏蔽应用的变化,从而数据库可以不动。

    三. 视图的基本语法:
    CREATE[OR REPLACE][FORCE][NOFORCE]VIEW view_name
    [(column_name)[,….n]]
    AS
    Select_statement
    [WITH CHECK OPTION[CONSTRAINT constraint_name]]
    [WITH READ ONLY]

    说明:
    view_name :  视图的名字
    column_name: 视图中的列名

    在下列情况下 , 必须指定视图列的名称
    * 由算术表达式 , 系统内置函数或者常量得到的列
    * 共享同一个表名连接得到的列
    * 希望视图中的列名与表中的列名不同的时候

    REPLACE:  如果创建视图时, 已经存在此视图, 则重新创建此视图, 相当于覆盖
    FORCE:  强制创建视图, 无论的视图所依赖的基表否存在或是否有权限创建
    NOFORCE:  只有基表存在且具有创建视图权限时, 才可以创建视图
    WITH CHECK OPTION  指出在视图上所进行的修改都要符合select_statement 所指定的限制条件
    WITH READ ONLY  只允许查看视图

    视图的定义原则:
           1. 视图的查询可以使用复杂的 SELECT 语法,包括连接 / 分组查询和子查询;
           2. 在没有 WITH CHECK OPTION 和 READ ONLY的情况下,查询中不能使用ORDER BY子句;
           3. 如果没有为 CHECK OPTION 约束命名,系统会自动为之命名,形式为SYS_Cn;
           4. OR REPLACE 选项可以不删除原视图便可更改其定义并重建,或重新授予对象权限。
     
    四. 视图操作
           视图分为简单视图( 基于单个基表,且不包含函数和数据分组操作 ) 和复杂视图( 基于多个基表或视图).
           简单视图可以通过视图修改数据. 这些修改包括插入数据. 更新数据和删除数据.
           但是对于复杂视图来说, 通过视图修改数据必须满足一定的规则.
     在视图定义中没有设定READ ONLY 的前提下, 如果视图包含了下面的内容, 那么不能通过视图删除表中的数据:
     * 分组函数, 如SUM,AVG,MIN,MAX 等
     *  GROUP BY 子句
     * 包含了表达式
     * ROWNUM 伪列

           插入数据时, 除了满足上面的条件外, 还需要保证那些没有包含在视图定义中的基表的列必须允许空值.
           如果在视图定义中还包含了WITH CHECK OPTION 子句, 那么对视图的修改除了前面的那些原则外,
           还必须满足指定的约束条件. 个人认为,视图利于查询,不利于修改.

    1. 查询视图: 可依赖于多个基表.
    SELECT  * FROM view_name; /* 类似于查询表数据*/

    2. 更新视图的前提:
    没有使用连接函数, 集合运算和组函数. 创建视图的select 语句中没有集合函数且没有GROUP BY,ONNECT BY ,START WITH 子句及DISTINCT 关键字.
    创建视图的SELECT 语句中不包含从基表列通过计算所得的列. 创建视图没有包含只读属性.

    3. 插入数据
    INSERT  INTO  view_name VALUES();

    4. 修改数据:
    UPDATE  view_name SET …
    若一个视图依赖于多个基本表, 则一次修改该视图只能修改一个基本表的数据.

    5. 删除数据:
    Delete from view_name where …
    同样, 当视图依赖多个基表时, 不能使用此语句来删除基表中的数据. 只能删除依赖一个基表的数据.

    6. 修改视图定义:
    修改视图的好处在于, 所有相关的权限都依然存在. 语法同创建视图相同.

    7. 删除视图:
    DROP VIEW view_name;
      只有视图所有者和具备DROP VIEW 权限的用户可以删除视图。删除视图的定义不影响基表中的数据。
      视图被删除后,基于被删除视图的其他视图或应用将无效。

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 18,371
精华内容 7,348
关键字:

oracle视图