视图

一.基本信息

  1. 含义
    视图是一个虚拟表,视图并不在数据库中存储数据值,数据库中只在数据字典中存储对视图的定义。
  2. 优点
    a.为用户集中数据,简化用户的数据查询和处理。
    b.屏蔽数据库的复杂性,用户不必了解数据库的复杂性。
    c.简化用户权限的管理,只授予用户使用视图的权限。
    d.便于数据共享,多个用户不必都定义所需的数据。
    e.可以重新组织数据,以便关联到其他应用中。
  3. 基本语法—-创建、修改/删除
    创建/修改视图
    CREATE [OR REPLACE] VIEW view_name [(column_name1[,column_name2… AS select_statement [WITH CHECK OPTION] [WITH READ ONLY]
    参数说明
    CREATE OR Replace:用于创建和修改视图。
    WITH CHECK OPTION:用于创建限制数据访问的视图。
    WITH READONLY:用于创建只读视图。
    删除视图
    Drop view view_name;
  4. 视图类别
    4-1.分类一
    a、简单视图:指基于单个表并且不包含函数或表达式的视图,在该视图上可以执行DML语句(即可执行增、删、改操作)。
    b、复杂视图:指包含函数、表达式或者分组数据的视图,在该视图上执行DML语句时必须要符合特定条件。
    注:在定义复杂视图时必须为函数或表达式定义别名
    c、连接视图:指基于多个表建立的视图,一般来说不会在该视图上执行INSERT、UPDATE、DELETE操作。
    d、只读视图:指只允许进行SELECT操作的视图,在该视图时指定WITHREADONLY选项。
    注:该视图上不能执行INSERT、UPDATE、DELETE操作。
    e、check约束视图:WITHCHECKOPTION用于在视图上定义CHECK约束,即在该视图上执行INSERT或UPDATE操作时,数据必须符合查询结果。
    4-2.分类二
    a、关系视图:Oracle视图是作为数据库对象存在的,因此,创建之后也可以通过工具或数据字典来查看视图的相关信息。这是大家常用的视图
    如:create view 视图名称 as 查询语句|关系运算。
    b、内嵌视图:在from语句中的可以把表改成一个子查询,如:select a.id ,b.id from emp a,(select id from dept) b where a.id=b.id内嵌视图不属于任何用户,也不是对象,内嵌视图是子查询的一种,可以与数据表、视图一样作为查询语句的数据源存在,但在形式上有较大的区别,内嵌视图不必使用create view命令进行创建,因此,在数据字典中也无法获得相应信息。内嵌视图的特点在于无须创建真正的数据库对象,而只是封装查询,因此会节约数据库资源,同时不会增加维护成本。但是内嵌视图不具有可复用性,因此当预期将在多处调用到同一查询定义时,还是应该使用关系视图。
    c、对象视图:对象类型在数据库编程中有许多好处,但有时,应用程序已经开发完成。为了迎合对象类型而重建数据表是不现实的。对象视图正是解决这一问题的优秀策略。对象视图创建之后,同样可以在数据字典中获得其相应信息。利用Oracle内置视图user_views可以获得对象视图相关信息。Oracle中的对象数据实际仍然以关系数据的形式存储。但是,对象的特性,例如继承、封装等,都为开发人员提供了更加灵活的处理形式。同样,可以构造复杂的对象类型来封装复杂的多表查询。
    d、物化视图:常用于数据库的容灾,不是传统意义上虚拟视图,是实体化视图,和表一样可以存储数据、查询数据。主备数据库数据同步通过物化视图实现,主备数据库通过data link连接,在主备数据库物化视图进行数据复制。当主数据库垮掉时,备数据库接管,实现容灾。

二.视图进阶

  1. 一些其他应用
    1.1查询权限
    select table_name,column_name,updatable,inser table,deletable from user_updatable_columns;
    说明
    updatable:表示当前字段是否可以执行修改操作。
    insertable:表示当前字段是否可以执行添加操作。
    deletable:表示当前字段是否可以执行删除操作。
    1.2视图状态
    当创建视图后,ORACLE将会验证视图的有效性,如修改了基本表,则会导致视图的无效状态.可查询数据字典user_objects的status.
    a.创建表T,包含ID和NAME两列;
    b.使用该表创建一个视图t_view,查看该表所有信息;
    c.使用该表创建一个视图t_view2,查看该表的ID和NAME列
    d.查看该视图状态;
    e.在表T上增加一列性别sex,重新查看视图t_view的状态.
    f.在表T上删除列NAME,重新查看视图t_view2的状态.
    注:VALID表示正常状态,invalid表示非正常状态
    有效方法
    a.在ORACLE中对该视图进行一次查询,如果没有错误,则系统会自动对其进行重新编译,视图状态变为有效。
    b.手动重新编译视图
    语句格式:ALTER VIEW view_nameCOMPILE;
    1.3视图中使用DML
    可以在简单视图中执行 DML 操作
    当视图定义中包含以下元素之一时不能使用delete:
    组函数、GROUP BY 子句、DISTINCT 关键字、ROWNUM 伪列
    create or replace view sal_view as select avg(salary) avg_sal from employees group by department_id;
    当视图定义中包含以下元素之一时不能使用update:
    组函数、GROUP BY子句、DISTINCT 关键字、ROWNUM 伪列、列的定义为表达式
    查询权限当视图定义中包含以下元素之一时不能使insert:
    组函数、GROUP BY 子句、DISTINCT 关键字、ROWNUM 伪列、列的定义为表达式、表中非空的列在视图定义中未包括
    屏蔽DML操做
    可以使用 WITH READ ONLY 选项屏蔽对视图的DML 操作
    任何 DML 操作都会返回一个Oracle server 错误。
    CREATE OR REPLACE VIEW empvu10 (employee_number, employee_name, job_title) AS SELECT employee_id,last_name,job_id FROM employees WHERE department_id = 10 WITH READ ONLY; View created.
    1.4视图中使用Top-N 分析
    Top-N 分析查询一个列中最大或最小的 n 个值。
    具体语法:
    SELECT [column_list],ROWNUM FROM (SELECT [column_list] FROM tableORDER BY Top-N_column) WHERE ROWNUM <= N;
作者:liuyang  创建时间:2023-09-15 11:27
最后编辑:liuyang  更新时间:2023-10-23 13:28