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

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

-- 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 BY、ORDER BY

    DISTINCT

    ROWNUM

    列的定义为表达式

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

 

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

    组函数

    GROUP BY、ORDER BY

    DISTINCT

    ROWNUM

    列的定义为表达式

 

    视图包含以下元素不能DELETE

    组函数

    GROUP BY、ORDER 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.

 

 

--使用with check option

    --使用WITH CHECK OPTION 子句确保DML只能在特定的范围内执行,任何违反

    --WITH CHECK OPTION 约束的请求都会失败

   

    SQL> create or replace view vw_emp                    

      2  as

      3  select empno,ename,sal from emp where sal  > 2500

      4  with check option;

 

    View created.

 

    SQL> insert into vw_emp select 9999,'Robinson',2000 from dual;  --不满足条件sal > 2500 不可插入

    insert into vw_emp select 9999,'Robinson',2000 from dual

              *

    ERROR at line 1:

    ORA-01402: view WITH CHECK OPTION where-clause violation

 

 

    SQL> select * from vw_emp;

 

        EMPNO ENAME             SAL

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

         7566 JONES            2975

         7698 BLAKE            2850

         7788 SCOTT            3000

         7839 KING             5000

         7902 FORD             3000

 

    SQL> delete from vw_emp where empno = 7902;     -- 满足条件sal > 2500 可以删除,并且修改了基表

 

    1 row deleted.

 

    SQL> select * from vw_emp;

 

        EMPNO ENAME             SAL

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

         7566 JONES            2975

         7698 BLAKE            2850

         7788 SCOTT            3000

         7839 KING             5000

 

    SQL> select  * from emp;

 

        EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO

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

         7369 SMITH      CLERK           7902 17-DEC-80        800                    20

         7499 ALLEN      SALESMAN        7698 20-FEB-81       1600        300         30

         7521 WARD       SALESMAN        7698 22-FEB-81       1250        500         30

         7566 JONES      MANAGER         7839 02-APR-81       2975                    20

         7654 MARTIN     SALESMAN        7698 28-SEP-81       1250       1400         30

         7698 BLAKE      MANAGER         7839 01-MAY-81       2850                    30

         7782 CLARK      MANAGER         7839 09-JUN-81       2450                    10

         7788 SCOTT      ANALYST         7566 19-APR-87       3000                    20

         7839 KING       PRESIDENT            17-NOV-81       5000                    10

         7844 TURNER     SALESMAN        7698 08-SEP-81       1500          0         30

         7876 ADAMS      CLERK           7788 23-MAY-87       1100                    20

 

        EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO

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

         7900 JAMES      CLERK           7698 03-DEC-81        950                    30

         7934 MILLER     CLERK           7782 23-JAN-82       1300                    10

 

    13 rows selected.

 

    SQL> rollback;

 

    Rollback complete.

 

    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 = 2000 where empno = 7499;   --不满足条件,不能更新

 

    0 rows updated.

 

--WITH READ ONLY 屏蔽DML 操作

    --可以使用WITH READ ONLY 选项屏蔽对视图的DML操作

    --任何DML 操作都会返回一个Oracle server 错误

 

    SQL> create or replace view vw_emp

      2  as

      3  select empno,ename,sal from emp where sal > 2500

      4  with read only;

 

    View created.

 

    SQL> insert into vw_emp select 9901,'Robinson',3000 from dual;

    insert into vw_emp select 9901,'Robinson',3000 from dual

    *

    ERROR at line 1:

    ORA-01733: virtual column not allowed here

 

 

    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 = 8000 where empno = 7902;

    update vw_emp set sal = 8000 where empno = 7902

                    *

    ERROR at line 1:

    ORA-01733: virtual column not allowed here

 

 

    SQL> delete from vw_emp where empno = 7566;

    delete from vw_emp where empno = 7566

              *

    ERROR at line 1:

    ORA-01752: cannot delete from view without exactly one key-preserved table

     

    --创建复杂视图

    SQL> create view vw_sum_emp(name,minsal,maxsal,avgsal)

      2  as

      3  select dname,min(e.sal),max(e.sal),avg(e.sal)

      4  from emp e

      5    join dept d

      6      on e.deptno = d.deptno

      7  group by dname;

 

    View created.

 

    SQL> select * from vw_sum_emp;

 

    NAME               MINSAL     MAXSAL     AVGSAL

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

    ACCOUNTING           1300       5000 2916.66667

    RESEARCH              800       3000       2175

    SALES                 950       2850 1566.66667

 

--查询与视图有关的数据字典

    SQL> select view_name,text from user_views;

 

    VIEW_NAME                      TEXT

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

    VW_SUM_EMP                     select dname,min(e.sal),max(e.sal),avg(e.sal)

                               from emp e

                                 join dept d

                                   on e.deptno = d.deptno

                               group by dname

 

    VW_EMP                         select empno,ename,sal from emp where sal > 2500

                               with read only

 

更详细的创建视图的语法:

    http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_8004.htm#SQLRF01504

   

更多参考:

   

Oracle 数据库实例启动关闭过程

 

Oracle 10g SGA 的自动化管理

 

使用OEM,SQL*Plus,iSQL*Plus 管理Oracle实例

 

Oracle实例和Oracle数据库(Oracle体系结构)

 

SQL 基础-->常用函数

 

SQL基础-->过滤和排序

 

SQL 基础-->SELECT 查询

 

时间: 2024-09-14 08:07:26

SQL 基础--> 视图(CREATE VIEW)的相关文章

SQL 基础9——视图(CREATE VIEW)

视图:     从表中抽出来的逻辑上相关的数据集合     视图其实就是一条查询SQL语句,用于显示一个或多个表或其它视图中相关数据.     视图将查询的结果作为一个表来使用,因此视图可以被看作是存储的查询或一个虚拟表     视图来源于表,所有对视图数据的修改最终都会被反映到视图的基表中,这些修改必须服从基表的完整性约束,并同样会触发定义     在基表上的触发器.(Oracle支持在视图上显式的定义触发器和定义一些逻辑约束)   使用视图的好处:     可把复杂的SQL语句简单化    

SQL基础--> 约束(CONSTRAINT)

--============================= --SQL基础--> 约束(CONSTRAINT) --=============================   一.几类数据完整性     实体完整性:表中记录不重复(任何两条记录不全等)并且每条记录都有一个非空主键     域完整性:表中字段值必须与字段数据类型.格式.有效范围相吻合     参照完整性:不能引用不存在的值     自定义完整性:根据特定业务领域定义的需求完整性         保证数据完整性的几种常用方法

SQL基础--> 数据处理(DML、RETURNING、MERGE INTO)

--================================================= --SQL基础--> 数据处理(DML.RETURNING.MERGE INTO) --=================================================   一.常用的DML语句及事物处理     向表中插入数据(INSERT)     更新表中数据(UPDATE)     从表中删除数据(DELETE)     将表中数据和并(MERGE)     控制事务

SQL基础--> 序列(SEQUENCE)、同义词(SYNONYM)

--============================================= --SQL基础--> 序列(SEQUENCE).同义词(SYNONYM) --=============================================   一.序列     是一个Oracle对象,提供唯一的数字,在需要时根据指定的增量值来递增,通常用于产生主键值     类似于SQL server中的IDENTITY(int,1,1) 或者列为IDENTITY列.SQL serve

SQL 基础-->创建和管理表

--================================= --SQL 基础-->创建和管理表 --=================================   一.创建表:create table     1.语法:CREATE TABLE  [ 用户名. ] 表名          (列名 数据类型 [ default 默认值] [ 约束条件]  [ , ......]  )         TABLESPACE 表空间名       2.表名和列名命名规则:     

MS SQL基础教程:索引视图

在前面我们已经提到过有关视图的下述观点:由于视图返回的结果集与具有行列结构的表有着相同的表格形式,并且我们可以在SQL 语句中像引用表那样引用视图,所以我们常把视图称为虚表.标准视图的结果集并不以表的形式存储在数据库中,而是在执行引用了视图的查询时,SQL Server 2000 才把相关的基本表中的数据合并成视图的逻辑结构. 上面的结论常让我们产生这样的焦虑:由于是在执行了引用了视图的查询时,SQL Server 2000 才把相关的基本表中的数据合并成视图的逻辑结构,那么当查询所引用的视图包

sql入门教程:SQL CREATE VIEW

sql入门教程:SQL CREATE VIEW 有一种意见认为是一个视图. 创建期的SQL声明 在SQL ,有一种意见是一个虚拟的基础上表的结果集的语句. 有一种意见认为包含行和列,就像一个真正的表.该领域的观点,领域,从一个或多个真正的表在数据库中. 您可以添加SQL函数,在那里,并加入声明,以期和目前的数据,如果数据是来自一个单一的表. 的SQL CREATE VIEW语法 CREATE VIEW view_name AS SELECT column_name(s) FROM table_n

SQL server 视图(view)介绍_mssql2005

视图是一种常用的数据库对象,它将查询的结果以虚拟表的形式存储在数据中.因为视图有非常多的优点:1,可以简化操作,2,可以建立前台和后台的缓冲,3,可以合并分割数据,4,最重要的是可以提高安全性,因此在SQL中视图也占据着非常重要的地位.在这章的总结中,深刻体会到了,两种方法:1,企业管理器,2,T-SQL语句来管理视图,和四种操作:1,增,2,,删,3,改,4,查. 在企业管理器,也是现在的SQL server Management Studio中,来执行这些操作,其实都大同小异!例如建立视图,

【SQL优化器查询变换器】视图合并(View Merging)

(基于成本的优化器组件)   查询变换器   被解析器解析过的查询语句进入查询变换器,表现出来的是一组查询块(query block), 这些查询块之间是相互关联的或者是嵌套的,查询的形式决定这些查询块相互之间如何被关联.查询变换器的主要目的就是决定改变查询的形式是否有利于产生一个好的执行计划.查询变换器使用四种不同的查询变换技术: 1- 视图合并(View Merging) 2- 谓词推进(Predicate Pushing) 3- 非嵌套子查询(Subquery Unnesting) 4-