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

浙公网安备 33010602011771号