`

Oracle 视图

阅读更多

问题:什么是视图?
回答:
视图也是一种数据库对象,英文叫做“view”。视图的本义就是与客户交互的窗口。

简单理解有点象一个容器,窗口中只能存放一条查询语句。当“select * from 视图名“,其实执行的是容器中的查询语句。所以查询视图也可以得到数据,不过这些数据都是经过查询语句“加工”以后的数据,可能与原表的记录完全不同。

显然:通过视图所看到的数据,就象是看到化过妆以后的女人。两者可能相差很大。

问题:使用视图有什么好处?
回答:
1、数据访问控制。注意视图也是一个数据库对象。如果限制用户只能通过视图访问数据,那么就可能限制用户访问指定的数据,而不是数据库中的原始数据。

2、简单复杂SQL的调用。有些一条SQL可能有好多行,通常都是一些报表。直接在JAVA或C程序调用并不方便,此时就可以创建一个视图,然后就用一句简单的“select * from 视图名”就可以了。

3、实现相同查询语句的复用。下面讲一个需要统计数据出口的案例。假设大多数的业务都只针对本公司没有离职的员工,每次查询员工时都需要加上条件“where 离职状态=0”,不方便,也容易因为忘记加上条件而导致出错。所以就可以建立一个视图,这些业务每次查询要处理的员工时,都从视图中查询。当需求改变时,如需要根据出生日期显示员工年龄,也只需要改动视图一处。

问题:如何创建、使用、删除视图?
回答:

创建视图: create or replace view 视图名 as select语句。“create or replace”表示的意思是同名的视图没有则创建,有则替换。

使用视图:与表使用是完全一样的,所以视图也被当成一作“虚表”。

删除视图:drop view 视图名。

问题:创建视图时,提示“权限不够”,怎么办?

解决:这是因为scott没有创建视图的权限,解决方法见 这里

问题:删除视图以后,原来表的数据删除了没有?
回答:

没有,视图中的查询语句并没有改变。相反地,如果原表中的数据发生改变,查询视图得到的数据也马上会更新。

问题:视图中是否保存了所查询的数据?
回答:

没有。视图中只是保存了一条SQL语句,通过视图所得到的数据,其实也就是查询语句所返回的数据。

了解:Oracle中有一种物化视图,可以将SQL所查询的数据保存起来。缺点是对会降低数据库增删改的效率,因为在原表数据发生变化时,数据库必须同时更新物化视图中的数据。

 

问题:通过视图是否可以加快查询速度?
回答:

不能。当数据量比较大,可以明显感觉到通过视图查询的效率比直接执行SQL要低得多。要提高查询的效率,最简单的方法就是创建合理的索引。

问题:Oracle中可以通过视图可以更新数据吗?
回答:不一定。要取决于视图中的sql语句。

示例一:可更新视图。
create or replace view my_emp_view
as
select empno,ename,sal from emp;

--查询视图
select * from my_emp_view;

--更新视图
update my_emp_view set sal=sal+100 where empno=7900;

可以执行。


示例二:不可更新视图。
create or replace view my_emp_view
as
select deptno,count(*) as 人数 from emp
group by deptno;


--查询视图
select * from my_emp_view;

--更新视图
update my_emp_view set 人数=人数+1
where deptno=10;

报错:ORA-01732: 此视图的数据操纵操作非法

逻辑上也说不通。上面的数据是数据库计算出来的,也不可能被更新。


示例三:部分可更新视图。
create or replace view my_emp_view
as
select d.deptno,d.dname,e.ename,e.empno
from dept d,emp e
where d.deptno=e.deptno

--查询视图
select * from my_emp_view;

--更新视图
update my_emp_view set ename='张三' where empno=7900;
可以执行。

update my_emp_view set dname='市场部' where empno=7900;
不可以执行。因为此时dname是通过表连接动态计算出来的。

分析:视图能否更新,取决所更新的行是否能否实际的数据表中的行一一对应,如果能对应,则可以更新。emp表中的每一行数据与my_emp_view视图中的每一行能够一一对应,但是dept表中的每一行数据却对应my_emp_view视图的多行数据,所以在my_emp_view视图中是不能更新部门信息的,但是能够更新员工数据。


问题:如果有两个人的姓名都叫“MIKE”,能不能更新呢?
回答:
肯定可以,因为是根据empno进行更新的。

问题:如何才能通过视图更新数据(my_emp_view例)?
回答:
在这个视图上建立替代触发器(在学习了触发器以后才能看懂下面的内容)。
代码:

create or replace trigger tr_emp_view
instead of update
on my_emp_view
for each row
declare
begin
update emp set ename = :new.ename
where empno = :new.empno;

update dept set dname = :new.dname
where deptno = :new.deptno;
end;

测试:
--更新视图
update my_emp_view set ename='张三',dname='市场部'
where empno=7900;

可以执行,本质是上由触发器同时对emp和dept表进行了修改。

--查询视图,发现原来“sale”全部变成了“市场部”。
select * from my_emp_view;

分享到:
评论

相关推荐

    自己总结的数据库oracle视图用法

    总的来说,Oracle视图是数据库设计和管理中非常实用的工具,通过合理利用视图,可以提高数据查询的效率,保护数据安全,并简化应用程序的开发和维护。在学习Oracle数据库的过程中,理解和掌握视图的用法至关重要。

    oracle 视图,函数,过程,触发器自动编译脚本

    ### Oracle视图、函数、过程、触发器自动编译脚本知识点详解 #### 一、背景与需求 在日常管理维护Oracle数据库服务器的过程中,我们经常会遇到需要修改视图(View)、表(Table)结构的情况。由于Oracle中的视图、...

    Oracle视图操作

    Oracle 视图操作 Oracle 视图是基于一张表或多张表或另外一个视图的逻辑表,视图不同于表,视图本身不包含任何数据。表是实际独立存在的实体,是用于存储数据的基本结构。而视图只是一种定义,对应一个查询语句。...

    Oracle 视图详解

    "Oracle 视图详解" Oracle 视图详解是指在 Oracle 数据库中创建的虚拟表,以便用户可以更方便地访问和操作数据库中的数据。视图的定义是一个基于查询的结果集,可以来自一个或多个实际表或视图,或者甚至来自其他...

    oracle视图详解

    Oracle 视图详解 Oracle 视图(View)是一种逻辑表,基于一个或多个实际表,它不占用物理空间,只存在逻辑定义。每次使用视图时,都是重新执行 SQL 语句。视图可以从一个或多个实际表中获得,这些表的数据存放在...

    C# 实现oracle数据库视图的迁移

    在C#中,迁移Oracle视图的步骤主要包括以下几个方面: 1. **建立数据库连接**:使用OracleConnection类创建连接字符串,并建立与源数据库和目标数据库的连接。连接字符串应包含数据库的服务器地址、服务名、用户名...

    Oracle_View视图创建

    ### Oracle视图创建详解 #### 一、前提条件与背景介绍 在Oracle数据库环境中,我们已经建立了两张表:`rt_issuesect` 和 `roadstate`。为了更好地管理和查询这两张表的数据,本教程将详细介绍如何利用Oracle的视图...

    oracle带参数视图

    Oracle 带参数视图实践 Oracle 数据库中的视图通常是不带参数的,但有时,我们需要使用带参数的视图来方便查询数据。下面将简要介绍 Oracle 带参数视图的实践。 一、问题描述 在实际应用中,我们遇到了一个问题...

    oracle 视图、索引(自用)

    一、Oracle视图 1. 定义:视图是从一个或多个表中创建的虚拟表,它并不实际存储数据,而是存储查询语句。当用户查询视图时,Oracle会执行视图背后的SQL语句并返回结果。 2. 创建视图:使用CREATE VIEW语句,可以创建...

    17oracle的视图 PPT

    下面将详细解释Oracle视图的各个方面。 1. 数据抽象:视图可以将复杂的数据结构简化为用户友好的形式,只展示他们需要看到的列和行。例如,一个视图可能只包含一个大型表的一部分列,或者合并来自多个表的相关信息...

    oracle视图的增删改查操作举例[参考].pdf

    Oracle视图是数据库管理系统中一种非常重要的概念,它提供了从不同角度查看和操作数据的手段。视图是基于一个或多个表或另一个视图的虚拟表,它不存储数据,而是动态生成结果集。视图的主要优点包括安全性、简化查询...

    19.Oracle视图1

    Oracle视图是数据库管理系统中非常重要的一个特性,它允许用户以一种特定的方式查看数据库中的数据,而无需直接操作基础表。视图本质上是基于一个或多个表的预定义SQL查询,这些表被称为基表。视图提供了一种数据...

    oracle实现带参数视图

    ### Oracle 实现带参数视图 #### 背景与概念 在数据库设计与管理过程中,视图(View)作为一种虚拟表,对于简化查询、增强数据安全性和提供数据抽象具有重要作用。然而,标准的视图定义是静态的,无法根据不同的...

    ORACLE视图技术在用户数据管理中的应用分析.pdf

    总的来说,Oracle视图技术在用户数据管理中发挥着重要作用,它提供了一种安全、灵活的数据访问机制,既能保护数据安全,又能简化用户操作,是数据库设计和管理中不可或缺的工具。通过合理利用视图,可以优化数据访问...

    通过MSQL通过视图访问ORACLE中的表

    标题“通过MySQL通过视图访问ORACLE中的表”意味着我们将探讨如何利用MySQL的视图功能,来间接访问和操作Oracle数据库中的数据。视图是一种虚拟表,它不实际存储数据,而是根据用户定义的SQL查询动态生成结果集。这...

    oracle常用系统视图+导入导出

    在Oracle数据库管理中,系统视图是获取数据库信息的关键途径,它们提供了丰富的元数据,用于监控、优化和理解数据库的内部工作。这篇博客主要聚焦于Oracle的常用系统视图以及数据导入导出的相关操作,这对于数据库...

    如何在Oracle或SQLServer中对视图(view)加密以保护视图中的SQL代码?

    因Oracle暂不支持对视图(View)的加密,在实际工作中有时需提供给第三方只读账户,为保护知识产权,可用文中所述方法防止第三方账户查看视图(View)中的SQL代码。

    oracle实验二视图

    本实验涵盖了 Oracle 中的视图概念、创建视图、显示视图的内容、从数据字典视图中选择视图的名字和文本、使用视图查询数据、创建带有条件的视图、显示视图的结构和内容、更新视图、创建复杂视图等内容,为读者提供了...

    oracle表字段或是视图字段添加备注方法

    Oracle 表字段或是视图字段添加备注方法 Oracle 是一个强大的关系数据库管理系统,提供了多种方式来添加备注信息到表字段或视图字段中。在本节中,我们将详细介绍如何使用 Oracle 的 Comment 机制来添加备注信息到...

Global site tag (gtag.js) - Google Analytics