Oracle入门(十二E)之视图操作

转载自 Oracle创建视图(View)

视图:是基于一个表或多个表或视图的逻辑表,本身不包含数据,通过它可以对表里面的数据进行查询和修改。视图基于的表称为基表,Oracle的数据库对象分为五种:表,视图,序列,索引和同义词。

视图是存储在数据字典里的一条select语句。通过创建视图可以提取数据的逻辑上的集合或组合。

 

视图的优点:

1.对数据库的访问,因为视图可以有选择性的选取数据库里的一部分。

2.用户通过简单的查询可以从复杂查询中得到结果。

3.维护数据的独立性,试图可从多个表检索数据。

4.对于相同的数据可产生不同的视图。

视图分为简单视图和复杂视图:

1、简单视图只从单表里获取数据,复杂视图从多表;

2、简单视图不包含函数和数据组,复杂视图包含;

3、简单视图可以实现DML操作,复杂视图不可以。

 

 

语法结构:创建视图

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

 

语法解析:

OR REPLACE    :若所创建的试图已经存在,则替换旧视图;

FORCE:不管基表是否存在ORACLE都会自动创建该视图(即使基表不存在,也可以创建该视图,但是该视图不能正常使用,当基表创建成功后,视图才能正常使用);

NOFORCE  :如果基表不存在,无法创建视图,该项是默认选项(只有基表都存在ORACLE才会创建该视图)。

alias:为视图产生的列定义的别名;

subquery  :一条完整的SELECT语句,可以在该语句中定义别名;

WITH CHECK OPTION  :插入或修改的数据行必须满足视图定义的约束;

WITH READ ONLY       :默认可以通过视图对基表执行增删改操作,但是有很多在基表上的限制(比如:基表中某列不能为空,但是该列没有出现在视图中,则不能通过视图执行insert操作),WITH READ ONLY说明视图是只读视图,不能通过该视图进行增删改操作。现实开发中,基本上不通过视图对表中的数据进行增删改操作。

 

案例3:基于EMP表和DEPT表创建视图

代码演示:视图

SQL> CREATE OR REPLACE VIEW EMPDETAIL

  2  AS

  3  SELECT EMPNO,ENAME,JOB,HIREDATE,EMP.DEPTNO,DNAME

  4  FROM EMP JOIN DEPT ON EMP.DEPTNO=DEPT.DEPTNO

  5  WITH READ ONLY

  6  /

 

VIEW CREATED

 

SQL> SELECT * FROM EMPDETAIL;  ①

 EMPNO

ENAME

JOB

HIREDATE

DEPTNO

DNAME

7369

SMITH

CLERK

17-12月-80

20

RESEARCH

7499

ALLEN

SALESMAN

20-2月 -81

30

SALES

7521

WARD

SALESMAN

22-2月 -81

30

SALES

7566

JONES

MANAGER

02-4月 -81

20

RESEARCH

7654

MARTIN

SALESMAN

28-9月 -81

30

SALES

7698

BLAKE

MANAGER

01-5月 -81

30

SALES

7782

CLARK

MANAGER

09-6月 -81

10

ACCOUNTING

7788

SCOTT

ANALYST

19-4月 -87

20

RESEARCH

7839

KING

PRESIDENT

17-11月-81

10

ACCOUNTING

7844

TURNER

SALESMAN

08-9月 -81

30

SALES

7876

ADAMS

CLERK

23-5月 -87

20

RESEARCH

7900

JAMES

CLERK

03-12月-81

30

SALES

7902

FORD

ANALYST

03-12月-81

20

RESEARCH

7934

MILLER

CLERK

23-1月 -82

10

ACCOUNTING

14 ROWS SELECTED

代码解析:

① 对视图可以像表一样进行查询。该视图中隐藏了员工的工资。

删除视图可以使用“DROP VIEW 视图名称”,删除视图不会影响基表的数据。

 

例如:

  CREATE OR REPLACE VIEW dept_sum_vw(name,minsal,maxsal,avgsal)AS SELECT d.dname,min(e.sal),max(e.sal),avg(e.sal)FROM    emp e,dept dWHERE e.deptno=d.deptnoGROUP BY d.dname;

 

视图的定义原则:

1.视图的查询可以使用复杂的SELECT语法,包括连接/分组查询和子查询;

2.在没有WITH CHECK OPTION和 READ ONLY 的情况下,查询中不能使用ORDER BY 子句;

3.如果没有为CHECK OPTION约束命名,系统会自动为之命名,形式为SYS_Cn;

4.OR REPLACE选项可以不删除原视图便可更改其定义并重建,或重新授予对象权限。

 

视图的查询:

视图创建成功后,可以从视图中检索数据,这点和从表中检索数据一样。

还可以查询视图的全部信息和指定的数据行和列。 如:检索数据:

SQL>SELECT * FROM dept_sum_vw;

查询视图定义:

SELECT view_name,text from user_views;

其中text显示的内容为视图定义的SELECT语句,可通过DESC USER_VIEWS 得到相关信息。

 

修改视图:

通过OR REPLACE 重新创建同名视图即可。

 

视图上的DML 操作:

DML操作应遵循的原则:

1.简单视图可以执行DML操作;

2.在视图包含GROUP 函数,GROUP BY子句,DISTINCT关键字时不能删除数据行;

3.在视图不出现下列情况时可通过视图修改基表数据或插入数据:

   a.视图中包含GROUP 函数,GROUP BY子句,DISTINCT关键字;

   b.使用表达式定义的列;

   c.ROWNUM伪列。

   d.基表中未在视图中选择的其他列定义为非空且无默认值。

视图可用于保持数据库的完整性,但作用有限。

通过视图执行引用完整性约束可在数据库级执行约束。

WITH CHECK OPTION 子句限定:

通过视图执行的INSERTS和UPDATES操作不能创建该视图检索不到的数据行,因为它会对插入或修改的数据行执行完整性约束和数据有效性检查。

例如:

CREATE OR REPLACE VIEW vw_emp20AS SELECT * FROM empWHERE deptno=20WITH CHECK OPTION constraint vw_emp20_ck;

视图 已建立。

查询结果:

SELECT empno,ename,job FROM vw_emp20;EMPNO    ENAME    JOB---------------------  -------------- -------------7369     SMITH    CLERK7566     JONES   MANAGER7902     FORD    ANALYST

 

修改:

  UPDATE vw_emp20SET    deptno=20WHERE  empno=7902;

将产生错误:

UPDATE vw_emp20

*

ERROR 位于第一行:

ORA-01402:视图WITH CHECK OPTION 违反WHERE 子句

 

视图的删除:DROP VIEW VIEW_NAME语句删除视图。

删除视图的定义不影响基表中的数据。

只有视图所有者和具备DROP VIEW权限的用户可以删除视图。

视图被删除后,基于被删除视图的其他视图或应用将无效。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/329470.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

renderthread是什么_Android5.0中 hwui 中 RenderThread 工作流程

前言本篇文章是自己的一个学习笔记,记录了 Android 5.0 中 hwui 中的 RenderThread 的简单工作流程。由于是学习笔记,所以其中一些细节不会太详细,我只是将大概的流程走一遍,将其工作流标注出来,下次遇到问题的时候就可…

官方博客明确了 .NET Core RC2/RTM 时间表

.NET Core 经过了将近2年的开发,去年12月份发布的RC1版本,明确来说那只是一个beta版本,自从RC1发布以来,看到github里的RC2分支,整个工具链都发生了很大的变化,大家都在焦急的等待着微软发布.NET Core RC2,…

12.进程同步与信号量

【README】 1.本文内容总结自 B站 《操作系统-哈工大李治军老师》,内容非常棒,墙裂推荐; 2.进程同步: 让进程间的合作变得合理有序; 3.通过 信号量 来实现进程同步 ; 4.操作系统借助信号量实现进程合作…

如何使 WebAPI 自动生成漂亮又实用在线API文档

1.前言 1.1 SwaggerUI SwaggerUI 是一个简单的Restful API 测试和文档工具。简单、漂亮、易用(官方demo)。通过读取JSON 配置显示API. 项目本身仅仅也只依赖一些 html,css.js静态文件. 你可以几乎放在任何Web容器上使用。 1.2 Swashbuckle Swashbuckle 是…

springboot超详细教程_SpringBoot五步配置Mybatis超简教程

第一步:Maven里面添加mybatis的引用jar包:org.mybatis.spring.bootmybatis-spring-boot-starter1.3.1com.github.pagehelperpagehelper-spring-boot-starter1.2.3mysqlmysql-connector-javaorg.springframeworkspring-tx第二步:在application…

13.信号量临界区保护

【README】 1.本文内容总结自 B站 《操作系统-哈工大李治军老师》,内容非常棒,墙裂推荐; 2.操作系统使用信号量实现进程同步(合作),走走停停,推进多进程合理有序向前执行; 3.靠临…

Oracle入门(十二F)之表分区

转载自 oracle的 分表 详解 -----表分区一、分区表基础知识 (1) 表空间及分区表的概念表空间:是一个或多个数据文件的集合,所有的数据对象都存放在指定的表空间中,但主要存放的是表, 所以称作表空间。分区表: 当表中的…

工作展望简短_新一年工作展望短句

1、愿所有人认真告别现实的2020,认真迎接希望的2021。2、新的一年快开始了,年底一总结,发现自己只收获了年龄。3、来年,有趣有盼,福气不减。4、新的一年,心情,生活都像烟花一样灿烂。5、待凛冬离…

关于《在Windows与.NET平台上的持续交付实践》的问答录

《在Windows与.NET平台上的持续交付实践》(Continuous Delivery with Windows and .Net)(免费下载)是由Matthew Skelton与Chris ODell所编著的一本简短的书籍。对于在Windows与.NET环境中工作的开发者而言,本书可以说是…

14.信号量的代码实现

【README】 1.本文内容总结自 B站 《操作系统-哈工大李治军老师》,内容非常棒,墙裂推荐; 2.信号量基础知识,refer2 posts below. 12.进程同步与信号量_PacosonSWJTU的博客-CSDN博客1.本文内容总结自 B站 《操作系统-哈工大李治…

Oracle入门(十二G1)修改序列(Sequence)起始值的方法

转载自 Oracle修改序列(Sequence)起始值的方法Oracle 序列(Sequence)主要用于生成流水号,在应用中经常会用到,特别是作为ID值,拿来做表主键使用较多。 但是,有时需要修改序列初始值&…

weex安装环境_WEEX跨平台开发环境搭建

一、Weex简介大约两年前,为了写一本Weex的入门书籍,我花了几个月的时间学习了下Weex跨平台相关的知识。Weex 是阿里前端技术团队开源的一套跨平台开发方案,能以Web的开发体验构建高性能、可扩展的 Native 应用。简单来说,在集成了…

C#中使用gRPC

由于有NuGet,使得C#在配置项目时非常简单。 1. 在NuGet中添加ProtocolBuffer和gRPC引用 protocol buffer 3.0版本,在NuGet插件界面选择Include Prerelease,查找google protocol buffer。如果不选择include rerelease,查找到的prot…

15.操作系统死锁处理

【README】 1.本文内容总结自 B站 《操作系统-哈工大李治军老师》,内容非常棒,墙裂推荐; 【19.1】死锁场景 1)死锁: 多个进程由于互相等待对方持有的资源而造成的谁也无法执行的情况; 1.1)死…

使用VS Code 开发.NET Core 应用程序 部署到Linux 跨平台

前面讲解了VSCode开发调试 .NET Core。都只是在windows下运行。 .NET Core真正的核心是跨平台,我们现在来了解学习 .NET Core 跨平台。 在windows 下开发.NET Core 应用程序,然后部署到Linux 平台运行。 .NET Core RC2版基本上已经完成。 https://githu…

centos 并发请求数_linux实现高并发请求工具

使用工具abCentOS6默认安装CentOS7需要手动安装contos7下:1、联网:yum install httpd-tools2、未联网(没试过):(1)进入cd /run/media/root/CentOS78664/Packages(路径跟centos6不同)(2)顺序安装apr-1.4.8-3.el7.86_64.rpmapr-util-1.5.2-6.el…

16.内存使用与分段

【README】 1.本文内容总结自 B站 《操作系统-哈工大李治军老师》,内容非常棒,墙裂推荐; 【1】 内存使用 【1.1】程序加载到内存 1)内存使用:将程序放到内存中,PC寄存器指向开始地址; 2&…

Oracle入门(十三)之SQL的DML

数据操纵语言(Data Manipulation Language, DML)是SQL语言中,负责对数据库对象运行数据访问工作的指令集,以INSERT、UPDATE、DELETE三种指令为核心,分别代表插入、更新与删除,是开发以数据为中心的应用程序…

.NET Core 跨平台发布(dotnet publish)

.NET Core 跨平台发布(dotnet publish) ,无需安装.NET Core SDK,就可以运行。 前面讲解了.NET Core 的VSCode 开发。现在来讲讲发布(dotnet publish)。 .NET Core and ASP.NET Core 1.0 RC2 runtime and libraries 在五月中旬发布。 .NET Core and ASP.N…

Oracle入门(十三A)之Select

一、数据查询语句 (1)select语句完整的句法select 目标表的列名或列表达式序列from 基本表名和(或)视图序列[ where 行条件表达式 ][ group by 列名序列[ having 组条件表达式 ] ][ order by 列名[ asc|desc ],… ] &a…