Oracle-视图

Oracle-视图

在项目开发中,有时候会用到多表查询,有不少种方法,好比关联,好比视图,但对于查询来讲,视图查询是最快的,若是你的数据库的字段信息不少,那查询就得整表查,好比两表查询,咱们就能够把要的字段抽取出来,放在视图中,这样查询时就只要查询视图中所要的字段。先看个示例:数据库

  1. 建立视图
CREATE OR REPLACE VIEW OMBROMETERDATA_MONITORPOINT  
AS  
SELECT O.VALUEDAY,O.VALUEHOUR,O.VALUEMONTH,O.VALUEYEAR,O.DTIME ,O.PROJECTID ,M.ID,M.NAME
FROM OMBROMETERDATA O, MONITORPOINT M  
WHERE O.POINTNAME=M.NAME;

①.OR REPLACE :若所建立的试图已经存在,ORACLE自动重建该视图;安全

②.OMBROMETERDATA和MONITORPOINT关联的两个表的表名,OMBROMETERDATA_MONITORPOINT为自定义的视图名称设计

2.使用视图查询code

SELECT * FROM OMBROMETERDATA_MONITORPOINT

1、视图的概念

视图是基于一张表或多张表或另一个视图的逻辑表。视图不一样于表,视图自己不包含任何数据。表是实际独立存在的实体,是用于存储数据的基本结构。而视图只是一种定义,对应一个查询语句。视图的数据都来自于某些表,这些表被称为基表。经过视图来查看表,就像是从不一样的角度来观察一个(或多个)表。
视图有以下一些优势:
① 能够提升数据访问的安全性,经过视图每每只能够访问数据库中表的特定部分,限制了用户访问表的所有行和列。
②简化了对数据的查询,隐藏了查询的复杂性。视图的数据来自一个复杂的查询,用户对视图的检索却很简单。
③一个视图能够检索多张表的数据,所以用户经过访问一个视图,可完成对多个表的访问。
④视图是相同数据的不一样表示,经过为不一样的用户建立同一个表的不一样视图,使用户可分别访问同一个表的不一样部分。
视图能够在表可以使用的任何地方使用,但在对视图的操做上同表相比有些限制,特别是插入和修改操做。对视图的操做将传递到基表,因此在表上定义的约束条件和触发器在视图上将一样起做用。对象

2、视图的建立

建立视图须要CREAE VIEW系统权限,视图的建立语法以下:开发

CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW 视图名[(别名1[,别名2...])] 
AS 子查询 
[WITH CHECK OPTION [CONSTRAINT 约束名]] 
[WITH READ ONLY]

其中:编译

  1. OR REPLACE 表示替代已经存在的视图。
  2. FORCE表示无论基表是否存在,建立视图。
  3. NOFORCE表示只有基表存在时,才建立视图,是默认值。
  4. 别名是为子查询中选中的列新定义的名字,替代查询表中原有的列名。
  5. 子查询是一个用于定义视图的SELECT查询语句,能够包含链接、分组及子查询。
  6. WITH CHECK OPTION表示进行视图插入或修改时必须知足子查询的约束条件。后面的约束名是该约束条件的名字。
  7. WITH READ ONLY 表示视图是只读的。

1.建立简单视图

建立图书做者视图。

步骤1:建立图书做者视图:

CREATE VIEW 图书做者(书名,做者)   
        AS SELECT 图书名称,做者 FROM 图书;

步骤2:查询视图所有内容

SELECT * FROM 图书做者;

输出结果:程序设计


书名 做者原理

-------------------------------- --------------------  
    计算机原理                     刘勇  
     C语言程序设计                马丽  
    汇编语言程序设计               黄海明

步骤3:查询部分视图:

SELECT 做者 FROM 图书做者;

输出结果:软件


做者

----------  
    刘勇  
    马丽  
    黄海明

说明:本训练建立的视图名称为“图书做者”,视图只包含两列,为“书名”和“做者”,对应图书表的“图书名称”和“做者”两列。若是省略了视图名称后面的列名,则视图会采用和表同样的列名。对视图查询和对表查询同样,但经过视图最多只能看到表的两列,可见视图隐藏了表的部份内容。

建立清华大学出版社的图书视图。

步骤1:建立清华大学出版社的图书视图:

CREATE VIEW 清华图书   
AS SELECT 图书名称,做者,单价 FROM 图书 WHERE 出版社编号= '01';

步骤2:查询图书视图:

SELECT * FROM 清华图书;

执行结果:


图书名称 做者 单价


计算机原理                     刘勇             25.3

步骤3:删除视图:

DROP VIEW 清华图书;

2.建立复杂视图

修改做者视图,加入出版社名称。

步骤1:重建图书做者视图:

CREATE OR REPLACE VIEW 图书做者(书名,做者,出版社)   
        AS SELECT 图书名称,做者,出版社名称 FROM 图书,出版社   
        WHERE 图书.出版社编号=出版社.编号;

步骤2:查询新视图内容:

SELECT * FROM 图书做者;

输出结果:


书名 做者 出版社

-------------------------------------------- ---------- ----------------------------  
    计算机原理               刘勇       清华大学出版社  
    C语言程序设计         马丽       电子科技大学出版社  
    汇编语言程序设计     黄海明     电子科技大学出版社

说明:本训练中,使用了OR REPLACE选项,使新的视图替代了同名的原有视图,同时在查询中使用了相等链接,使得视图的列来自于两个不一样的基表。

建立一个统计视图。

步骤1:建立emp表的一个统计视图:

CREATE VIEW 统计表(部门名,最大工资,最小工资,平均工资)  
        AS SELECT DNAME,MAX(SAL),MIN(SAL),AVG(SAL) FROM EMP E,DEPT D  
        WHERE E.DEPTNO=D.DEPTNO GROUP BY DNAME;

步骤2:查询统计表:

SELECT * FROM 统计表;

执行结果:


部门名 最大工资 最小工资 平均工资

-------------------------- --------------- ----------------- ------------------  
    ACCOUNTING          5000       1300        3050  
    RESEARCH             3000        800        2175  
    SALES                  2850        950   1566.66667

说明:本训练中,使用了分组查询和链接查询做为视图的子查询,每次查询该视图均可以获得统计结果。

建立只读视图

建立只读视图要用WITH READ ONLY选项。
建立只读视图。

步骤1:建立emp表的经理视图:

CREATE OR REPLACE VIEW manager   
        AS SELECT * FROM emp WHERE job= 'MANAGER'  
        WITH READ ONLY;

步骤2:进行删除:

DELETE FROM manager;

执行结果:
ERROR 位于第 1 行:
ORA-01752: 不能从没有一个键值保存表的视图中删除

4.建立基表不存在的视图

正常状况下,不能建立错误的视图,特别是当基表还不存在时。但使用FORCE选项就能够在建立基表前先建立视图。建立的视图是无效视图,当访问无效视图时,Oracle将从新编译无效的视图。
使用FORCE选项建立带有错误的视图:

CREATE FORCE VIEW 班干部 AS SELECT * FROM 班级 WHERE 职务 IS NOT NULL;

执行结果:
警告: 建立的视图带有编译错误。

视图的操做

对视图常常进行的操做是查询操做,但也能够在必定条件下对视图进行插入、删除和修改操做。对视图的这些操做最终传递到基表。可是对视图的操做有不少限定。若是视图设置了只读,则对视图只能进行查询,不能进行修改操做。

1.视图的插入

视图插入练习。
步骤1:建立清华大学出版社的图书视图:

CREATE OR REPLACE VIEW 清华图书   
        AS SELECT * FROM 图书 WHERE 出版社编号= '01';

步骤2:插入新图书:

INSERT INTO 清华图书 VALUES('A0005','软件工程','01','冯娟',5,27.3);

步骤3:显示视图:

SELECT * FROM 清华图书;

执行结果:


图书 图书名称 出 做者 数量 单价

-------- ---------------------------------------- ----------- -------- ------------------------ --------------  
    A0001 计算机原理                     01 刘勇                5       25.3

A0005 软件工程 01 冯娟 5 27.3


步骤4:显示基表

SELECT * FROM 图书;

执行结果:


图书 图书名称 出 做者 数量 单价

-------- ------------------------------------------ ------- ---------------- ----------------- ---------------  
    A0001 计算机原理           01 刘勇        5        25.3  
    A0002  C语言程序设计        02 马丽    1       18.75  
    A0003 汇编语言程序设计     02 黄海明       15       20.18  
    A0005 软件工程              01 冯娟        5        27.3

说明:经过查看视图,可见新图书插入到了视图中。经过查看基表,看到该图书也出如今基表中,说明成功地进行了插入。新图书的出版社编号为“01”,仍然属于“清华大学出版社”。
可是有一个问题,就是若是在“清华图书”的视图中插入其余出版社的图书,结果会怎么样呢?结果是容许插入,可是在视图中看不见,在基表中能够看见,这显然是不合理的。

2.使用WITH CHECK OPTION选项

为了不上述状况的发生,可使用WITH CHECK OPTION选项。使用该选项,能够对视图的插入或更新进行限制,即该数据必须知足视图定义中的子查询中的WHERE条件,不然不容许插入或更新。好比“清华图书”视图的WHERE条件是出版社编号要等于“01”(01是清华大学出版社的编号),因此若是设置了WITH CHECK OPTION选项,那么只有出版社编号为“01”的图书才能经过清华视图进行插入。
使用WITH CHECK OPTION选项限制视图的插入。
步骤1:重建清华大学出版社的图书视图,带WITH CHECK OPTION选项:

CREATE OR REPLACE VIEW 清华图书   
        AS SELECT * FROM 图书 WHERE 出版社编号= '01'  
        WITH CHECK OPTION;

步骤2:插入新图书:

INSERT INTO 清华图书 VALUES('A0006','Oracle数据库','02','黄河',3,39.8);

执行结果:
ERROR 位于第 1 行:
ORA-01402: 视图 WITH CHECK OPTIDN 违反 where 子句
说明:可见经过设置了WITH CHECK OPTION选项,“02”出版社的图书插入受到了限制。若是修改已有图书的出版社编号状况会如何?答案是将一样受到限制。要是删除视图中已有图书,结果又将怎样呢?答案是能够,由于删除并不违反WHERE条件。

3.来自基表的限制

除了以上的限制,基表自己的限制和约束也必需要考虑。若是生成子查询的语句是一个分组查询,或查询中出现计算列,这时显然不能对表进行插入。另外,主键和NOT NULL列若是没有出如今视图的子查询中,也不能对视图进行插入。在视图中插入的数据,也必须知足基表的约束条件。
基表自己限制视图的插入。
步骤1:重建图书价格视图:

CREATE OR REPLACE VIEW 图书价格   
        AS SELECT 图书名称,单价 FROM 图书;

步骤2:插入新图书:

INSERT INTO 图书价格 VALUES('Oracle数据库',39.8);

执行结果:
ERROR 位于第 1 行:
ORA-01400: 没法将 NULL 插入 ("SCOTT"."图书"."图书编号")
说明:在视图中没有出现的基表的列,在对视图插入时,自动默认为NULL。该视图只有两列能够插入,其余列将默认为空。插入出错的缘由是,在视图中不能插入图书编号,而图书编号是图书表的主键,是必须插入的列,不能为空,这就产生了矛盾。

3、视图的查看

USER_VIEWS字典中包含了视图的定义。
USER_UPDATABLE_COLUMNS字典包含了哪些列能够更新、插入、删除。
USER_OBJECTS字典中包含了用户的对象。
能够经过DESCRIBE命令查看字典的其余列信息。在这里给出一个训练例子。
查看清华图书视图的定义:

SELECT TEXT FROM USER_VIEWS WHERE VIEW_NAME='清华图书';

执行结果:


TEXT

-----------------------------------------------------------------------------------------------  
    SELECT 图书名称,做者,单价 FROM 图书 WHERE 出版社编号='01'

查看用户拥有的视图:

SELECT object_name FROM user_objects WHERE object_type='VIEW';

执行结果:


OBJECT_NAME

----------------------------------------------------------------------------------------------  
    清华图书  
    图书做者

4、删除视图

删除视图的语法以下:

DROP VIEW 视图名;

删除视图者须要是视图的创建者或者拥有DROP ANY VIEW权限。视图的删除不影响基表,不会丢失数据。

相关文章
相关标签/搜索