view

1、视图的两大作用:

  • 限制数据访问
  • 简化命令文本

视图是基于表或另一个视图的逻辑表,一个视图并不包含它自己的数据,它象一个窗口,通过该窗口可以查看或改变表中的数据

简单视图:数据仅来自一个表,不包含函数或数据分组,能通过视图执行 DML 操作。
复杂视图:数据来自多个表,包含函数或数据分组,不总是允许通过视图进行 DML 操作。

Oracle 的视图大约可以分为以下几类:
(1)简单视图,基于单个表所建视图,不包含任何函数、表达式及分组数据的视图。
(2)复杂视图,包含函数、表达式或者分组数据的视图。
(3)连接视图,基于多表所建立的视图。
(4)只读视图,只允许执行查询操作。
(5)内联视图(Inline View),也叫内嵌视图、临时视图、行内视图、或内建视图,它是出现在 FROM子句中的子查询,内联视图不属于数据库对象。
(6)物化视图(Materialized Views),物化视图是包括一个查询结果的数据库对象。

CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view [(alias[, alias]...)]AS subquery [WITH CHECK OPTION [CONSTRAINT constraint]

OR REPLACE 如果视图已经存在重新创建它
FORCE 创建视图,而不管基表是否存在
NOFORCE 只在基表存在的情况下创建视图(这是默认值)
view 视图的名字
alias 为由视图查询选择的表达式指定名字(别名的个数必须与由视图选择的表达式的个数匹配)
subquery 是一个完整的 SELECT 语句(对于在 SELECT 列表中的字段你可以用别名)
WITH CHECK OPTION 指定只有可访问的行在视图中才能被插入或修改
constraint 为 CHECK OPTION 约束指定的名字
WITH READ ONLY 确保在该视图中没有 DML 操作被执行

 可以通过视图对数据进行执行 DML 操作,但那些操作必须符合下面的规则。如果视图中不包含下面的部分,你就可以从视图中删除数据:组函数、GROUP BY 子句、DISTINCT 关键字、伪列 ROWNUM 关键字。

select * from USER_UPDATABLE_COLUMNS        ---查询视图能否被修改等操作

使用 WITH CHECK OPTION 子句,可以通过视图执行引用完整性检查,你也可以在数据库级别强制约束。视图能用于保护数据的完整性,但用途非常有限

我们可在创建视图时带上 WITH READ ONLY 选项,以确保无 DML 操作发生。

2、管理视图

OR REPLACE 选项是从 Oracle7 开始有的,用 Oracle 的早期版本,如果要改变视图,先要删除旧视图,再重新创建。例如:
CREATE OR REPLACE VIEW empvu80(id_number, name, sal, department_id) AS SELECT EMPLOYEE_ID, FIRST_NAME || ' ' || LAST_NAME, SALARY, DEPARTMENT_ID FROM EMPLOYEES WHERE DEPARTMENT_ID = 80;

只有创建者或具有 DROP ANY VIEW 权限的用户才能删除视图。view 是视图的名字。例如:drop view empvu80;
视图依赖于基础表的存在而存在,当基础表的结构被改变后,视图的结构也可能会受影响。在这种情况下,要使用视图就需要重新编译;但一般在进行查询时,视图会自动重新编译,所以,手动编译其实并不常用。
手动编译视图的命令:
ALTER VIEW 视图名 COMPILE;

3、查询

使用 DBA_TAB_COLUMNS 视图可以查询到所有的表、视图和簇表的列的详细内容,但是这个视图不包括系统产生的隐藏列和不可见列,而视图 DBA_TAB_COLS 可以查询到系统产生的隐藏列和不可见列。另外,视图
DBA_UPDATABLE_COLUMNS 可以查询到所有连接视图中的列是否可以被更新。通过如下的 SQL 语句可以查询到视图的所有列的详细情况:
 SELECT  DV.OWNER,
      DV.VIEW_NAME,
      DL.COLUMN_NAME,
      DL.DATA_TYPE,
      DL.NULLABLE,
      DL.COLUMN_ID,
      DL.VIRTUAL_COLUMN,
      DL.HIDDEN_COLUMN,
      DU.DELETABLE, DU.UPDATABLE, DU.INSERTABLE
FROM DBA_VIEWS DV, DBA_TAB_COLS DL, DBA_UPDATABLE_COLUMNS DU
WHERE DV.VIEW_NAME = DL.TABLE_NAME
    AND DV.VIEW_NAME = DU.TABLE_NAME
    AND DL.COLUMN_NAME = DU.COLUMN_NAME
    AND DV.OWNER = DL.OWNER
    AND DV.OWNER = DU.OWNERORDER BY DL.COLUMN_ID;

select dbms_metadata.get_ddl('VIEW','VIEW_NAME','VIEW_OWNER') from dual; ---获取视图定义

4、Top-N 分析

Top-N 分析就是查询前几名的意思
Top-N 分析通过 ROWNUM 实现
Top-N 分析中必须使用 Order by 排序子句
Top-N 分析中通常会有内建视图,一般的方法是先对内建视图的某一列或某些列排序,然后对此内建视图使用 ROWNUM 取前多少行。

Select Rownum As Senior, e.Last_Name, e.Hire_Date From (Select Last_Name, Hire_Date From Employees Order By Hire_Date) e Where Rownum <= 4;

5、物化视图

 https://blog.csdn.net/u014330421/article/details/78606482

 

https://www.modb.pro/db/52367

 

https://www.modb.pro/db/26568

 

https://blog.csdn.net/cckevincyh/article/details/88982217

 

posted @ 2021-09-16 17:28  harrison辉  阅读(830)  评论(0)    收藏  举报