专栏首页小麦苗的DB宝专栏【DB笔试面试516】Oracle中的视图分为哪几类?

【DB笔试面试516】Oracle中的视图分为哪几类?

题目部分

Oracle中的视图分为哪几类?

答案部分

Oracle的视图大约可以分为以下几类:

(1)简单视图,基于单个表所建视图,不包含任何函数、表达式及分组数据的视图。

(2)复杂视图,包含函数、表达式或者分组数据的视图。

(3)连接视图,基于多表所建立的视图。

(4)只读视图,只允许执行查询操作。

(5)内联视图(Inline View),也叫内嵌视图、临时视图、行内视图、或内建视图,它是出现在FROM子句中的子查询,内联视图不属于数据库对象。

(6)物化视图(Materialized Views),物化视图是包括一个查询结果的数据库对象,更多内容可以参考【真题138、物化视图(Materialized Views)的作用是什么?】。

在Oracle中,如果要在当前用户中创建视图,那么用户必须具有CREATE VIEW的系统权限。如果要在其他用户中创建视图,那么用户必须具有CREATE ANY VIEW的系统权限。

在Oracle中创建视图的语法如下所示:

CREATE [ OR REPLACE ] [ FORCE ] VIEW [SCHEMA.]VIEW_NAME

[ (COLUMN1,COLUMN2,...) ]

AS

SELECT ...

[ WITH CHECK OPTION ] [ CONSTRAINT CONSTRAINT_NAME ]

[ WITH READ ONLY ];

有关创建视图的语法,需要注意以下几点内容:

① OR REPLACE:如果存在同名的视图,那么使用新视图重建已有的视图。

② FORCE:强制创建视图,不考虑基表是否存在,也不考虑是否具有使用基表的权限。

③ COLUMN1,COLUMN2,...:视图的列名,列名的个数必须与SELECT查询中列的个数相同。如果SELECT查询包含函数或表达式,那么必须为其定义列名。此时,既可以用COLUMN1,COLUMN2指定列名,也可以在SELECT查询中指定列名。

④ WITH CHECK OPTION:指定对视图执行的DML操作必须满足“视图子查询”的条件,即对通过视图进行的增、删、改操作进行检查,要求增、删、改操作的数据必须是SELECT所能查询到的数据,否则不允许操作,并返回错误提示。在默认情况下,在增、删、改之前并不会检查这些行是否能被SELECT检索到。

⑤ WITH READ ONLY:创建的视图只能用于查询数据而不能用于更改数据。

创建简单视图的示例如下所示:

SQL> CREATE VIEW VW_EMP_LHR AS SELECT * FROM SCOTT.EMP WHERE DEPTNO =20;

View created.

SQL> SELECT * FROM VW_EMP_LHR WHERE ROWNUM<=4;

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO

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

7369 SMITH CLERK 7902 17-DEC-80 800 20

7566 JONES MANAGER 7839 02-APR-81 2975 20

7788 SCOTT ANALYST 7566 19-APR-87 3000 20

7876 ADAMS CLERK 7788 23-MAY-87 1100 20

视图依赖于基础表的存在而存在,当基础表的结构被改变后,视图的结构也可能会受影响。在这种情况下,要使用视图就需要重新编译;但一般在进行查询时,视图会自动重新编译,所以,手动编译其实并不常用。手动编译视图的命令如下所示:

ALTER VIEW 视图名 COMPILE;

使用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.OWNER

ORDER BY DL.COLUMN_ID;

本文选自《Oracle程序员面试笔试宝典》,作者:李华荣。

本文分享自微信公众号 - DB宝(xiaomaimiaolhr),作者:小麦苗best

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-03-02

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【DB笔试面试431】在视图上不能完成的操作是()

    视图是由从数据库的基本表中选取出来的数据组成的逻辑窗口,它不同于基本表,它是一个虚拟表,其内容由查询定义。在数据库中,存放的只是视图的定义而已,而不存放数据,这...

    小麦苗DBA宝典
  • 【DB笔试面试539】在Oracle中,数据字典分为哪几类?

    数据字典(Data Dictionary)也就是通常所说的系统目录,它是Oracle数据库中最重要的组成部分。数据字典记录了数据库的系统信息,它是只读表和视图的...

    小麦苗DBA宝典
  • 【DB笔试面试424】SQL Server哪类视图是可以更新的?请举例说明。

    可以在视图上创建INSTEAD OF触发器,从而使视图可更新。当对一个定义了INSTEAD OF触发器的视图执行操作的时候,实际上执行的是触发器中定义的操作,而...

    小麦苗DBA宝典
  • MySQL(十)之视图

    前言 前面给大家介绍了查询语句,感觉写的还不错的,喜欢的可以去查看。今天给大家分享的是MySQL中的视图。 视图(View):视图是由查询结果形成一张虚拟的表。...

    用户1195962
  • SwiftUI:使用 @EnvironmentObject 从环境中读取自定义值

    SwiftUI的环境使我们可以使用来自外部的值,这对于读取Core Data上下文或视图的展示模式等很有用。但是我们也可以将自定义对象发送到环境中,并在以后将它...

    韦弦zhy
  • MySQL引擎和视图的点

    存储引擎Storage Engine:MySQL中的数据、索引以及其他对象是如何存储的,是一套文件系统的实现。

    孙玄@奈学教育
  • Mysql进阶三板斧(一)带你彻底搞懂View视图的原理及应用

    既然视图的定义是基于基本表的,哪为什么还要定义视图呢?这是因为合理地使用视图能够带来许多好处:

    陈哈哈
  • MySQL 视图

    看到这里,或许你已经对MySQL 的基本操作了如指掌,这篇文章讲解MySQL高级功能中 视图的概念及其用法。

    技能锦囊
  • MySQL 视图

    ​看到这里,或许你已经对MySQL 的基本操作了如指掌,这篇文章讲解MySQL高级功能中 视图的概念及其用法。

    技能锦囊
  • AI综述专栏 | 孙仕亮:多视图机器学习综述

    在科学研究中,从方法论上来讲,都应先见森林,再见树木。当前,人工智能科技迅猛发展,万木争荣,更应系统梳理脉络。为此,我们特别精选国内外优秀的综述论文,开辟“AI...

    马上科普尚尚

扫码关注云+社区

领取腾讯云代金券