视图的作用

目录

视图的作用

创建视图

为 scott 分配创建视图的权限

查询视图

复杂视图的创建

视图更新的限制问题

更新视图中数据的部门编号(视图的存在条件)

限制通过视图修改数据表内容

创建只读的视图

复杂视图创建


oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645

视图的作用

在所有的 SQL 语句中,查询是最复杂的操作之一,而且查询还和具体的开发要求有关,那么在开发过程中,程序员完成的并不是与数据库相关的所有内容,而应该更多地考虑到程序的设计结构。

可是没有一个项目里面会不包含复杂查询,那么程序员如何从复杂查询中解脱出来呢?

这种情况下就提出了视图的概念。利用视图可以实现复杂 SQL 语句的封装操作。

从实际开发来说,一个优秀的数据库设计人员,除了要给出合理的数据表结构,还应该将所有可能使用到的查询封装好视图,一并交给开发者。

视图可以看成是一张虚拟表,由存储的查询组成。

视图和真实的数据表一样,都包含若干行和列。

但是,在视图中并不存储数据,其数据仍然来源于视图定义时所使用的数据表中,数据库只在数据字典中存储视图的定义信息

create [OR REPLACE] VIEW 视图名称 AS 子查询 ;

创建视图

CREATE VIEW myview AS SELECT * FROM emp WHERE deptno=10 ;

这个语句实现将部门 10 的所有员工信息保存在视图中。

在 Oracle 10g 及以前的版本中,scott 是可以直接进行视图创建的,但是从 Oracle 10g R2 版本开始,如果想创建视图,就需要单独分配创建视图的权限

为 scott 分配创建视图的权限

CONN sys/change_on_install AS SYSDBA ;
GRANT CREATE VIEW TO scott ;
CONN scott/tiger ;

权限分配完成之后就可以进行视图的创建操作了。视图本身属于数据库对象,所以查看视图的信息可以使用“user_views”数据字典完成。

在这个数据字典里面可以查询到视图的具体语法。视图可以像普通的数据表那样直接进行查询

查询视图

SELECT * FROM myview ;

发现查询视图与之前直接使用 SELECT 查询语句所得到的结果是完全相同的,所以视图就封装了SQL 语句,而开发者可以通过视图简单地查询到所需要的数据。

下面继续利用视图封装一个复杂的 SQL 

复杂视图的创建

DROP VIEW myview ;
CREATE VIEW myview 
	AS
SELECT d.deptno,d.dname,d.loc,temp.count
FROM dept d,(
	SELECT deptno dno,COUNT(*) count
	FROM emp
	GROUP BY deptno) temp
WHERE d.deptno=temp.dno(+) ;

由于 myview 视图的名称已经被占用,所以理论上应该先删除,而后再创建一个新的视图,可是删除和创建之间有可能产生间隔。

其中 DROP VIEW 是删除视图的语句。所以在实际开发中,由于视图使用频率较高,而且直接与开发有关系,一般情况下不会选择删除后再重新创建,而是选择进行视图的替换。利用新的查询替换掉旧的查询

CREATE OR REPLACE VIEW myview 
	AS
SELECT d.deptno,d.dname,d.loc,temp.count
FROM dept d,(
	SELECT deptno dno,COUNT(*) count
	FROM emp
	GROUP BY deptno) temp
WHERE d.deptno=temp.dno(+) ;

上面这个语句表示,如果视图存在则进行替换,如果视图不存在则进行删除

从开发分工来说,此部分的操作应该是由数据库开发人员进行的,但是从现实来说,基本上除了大的开发团队,大部分的中小开发团队都会由开发人员自己编写

视图更新的限制问题

视图中只是包含查询语句的临时数据,并不是真实存在的,可是在默认情况下,创建的视图是可以直接进行修改操作的

更新视图中数据的部门编号(视图的存在条件)

CREATE OR REPLACE VIEW myview 
	AS 
SELECT * FROM emp WHERE deptno=20 ;

 此时在创建的 myview 视图中,deptno=20 是视图数据的存在依据,但是在默认情况下,可以通过视图修改原数据表中的信息。

下面修改其中一行数据的部门编号

UPDATE myview SET deptno=30 WHERE empno=7369 ;

发现此时更新了视图,结果导致 emp 数据表中的内容也发生了变化。

为了保证视图的创建条件不能够被更新,可以在创建视图的时候使用 WITH CHECK OPTION 子句

限制通过视图修改数据表内容

CREATE OR REPLACE VIEW myview 
	AS 
SELECT * FROM emp WHERE deptno=20
WITH CHECK OPTION ;

此时使用了 WITH CHECK OPTION 子句可以保证视图的创建条件不被更新

UPDATE myview SET deptno=30 WHERE empno=7566 ;

将出现如下的错误“提示信息:ORA-01402: 视图 WITH CHECK OPTION WHERE 子句违规”,即视图创建条件的字段不能修改。

但是视图中不仅仅只存在有创建条件的字段,还可能会包含其他字段。在现实操作中,可以修改视图中的其他字段内容

UPDATE myview SET sal=80000 WHERE empno=7369 ;

此时更新操作成功了

发现视图更新时改变的是数据表中的数据,这样的做法同样也不合理。

所以一般在创建视图的时候,由于里面都属于映射的数据,那么本质上就不建议对其进行修改,最好就是创建一个只读视图。

使用 WITH READ ONLY 子句完成

创建只读的视图

CREATE OR REPLACE VIEW myview 
	AS 
SELECT * FROM emp WHERE deptno=20
WITH READ ONLY ;

现在就创建好了一个只读视图信息,于是再次发出修改操作时,会出现“ORA-42399: 无法对只读视图运行 DML 操作”,这样就避免了通过视图的临时数据修改数据表的真实数据。

前面介绍了视图的创建,然而实际上如果是单张表的查询,建立视图并没有太大的作用,视图主要用来封装复杂查询,例如来源于多个表

下面是一个复杂查询的封装

复杂视图创建

CREATE OR REPLACE VIEW myview 
	AS 
SELECT e.empno,e.ename ename,e.job,d.dname,e.sal,m.ename mname
FROM emp  e,dept d,emp m
WHERE e.deptno=d.deptno AND e.mgr=m.empno(+) ;

直接进行下面的更新操作

UPDATE myview SET sal=8000,dname='SALES',mname='KING' 
WHERE empno=7902 ;

此时没有增加“WITH CHECK OPTION、WITH READ ONLY”等限制条件,但是运行时出现错误信息“ORA-01776: 无法通过联接视图修改多个基表”。如果真的需要修改数据表的内容,可以使用替代触发器完成

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Android 性能优化(六):启动优化的详细流程

书接上文,Android 性能优化(一):闪退、卡顿、耗电、APK 从用户体验角度有四个性能优化方向: 追求稳定,防止崩溃追求流畅,防止卡顿追求续航,防止耗损追求精简,防止臃肿 …

【研发日记】Matlab/Simulink开箱报告(十)——Signal Routing模块模块

文章目录 前言 Signal Routing模块 虚拟模块和虚拟信号 Mux和Demux Vector Concatenate和Selector Bus Creator和Bus Selector 分析和应用 总结 前言 见《开箱报告,Simulink Toolbox库模块使用指南(五)——S-Fuction模块(C MEX S-Fun…

SQLite中的动态内存分配(五)

返回:SQLite—系列文章目录 上一篇:SQLite中的原子提交(四) 下一篇:SQLite使用的临时文件(二) ​概述 SQLite使用动态内存分配来获得 用于存储各种对象的内存 (例如&#xff1a…

android 11 SystemUI 状态栏打开之后的界面层级关系说明之一

比如WiFi 图标的父layout为: Class Name: ButtonRelativeLayout Class Name: QSTileView Class Name: TilePage Class Name: PagedTileLayout Class Name: QSPanel Class Name: NonInterceptingScrollView Class Name: QSContainerImpl Class Name: FrameLayout Cl…

2018年亚马逊云科技推出基于Arm的定制芯片实例

2018年,亚马逊云技术推出了基于Arm的定制芯片。 据相关数据显示,基于Arm的性价比比基于x86的同类实例高出40%。 这打破了对 x86 的依赖,开创了架构的新时代,现在能够支持多种配置的密集计算任务。 这些举措为亚马逊云技术的其他创…

计算机票.java

题目:机票价格按照淡季旺季,头等舱和经济舱收费,输入机票原价,月份,头等舱或经济舱 。按照如下规则计算机票价格:旺季(5-10月)头等舱九折,经济舱8.5折,淡季&a…

Redis中的客户端(二)

客户端 输入缓冲区。 客户端状态的输入缓冲区用于保存客户端发送的命令请求: typedef struct redisClient {// ...sds querybuf;// ... }redisClient;例子 举个例子,如果客户端向服务器发送了以下命令请求: SET key value那么客户端状态的qureybuf属性将是一个…

帆软报表在arm架构的linux

有朋友遇到一个问题在部署帆软报表时遇到报错。 问 我在 arm架构的linux服务器上部署帆软报表遇到了一个棘手的问题,你有空帮忙看下嘛。 我看后台日志报的错是 需要升级 gcc、libmawt.so ,是系统中缺少Tomcat需要的依赖库,你之前处理过类似…

OCP NVME SSD规范解读-15.DSSD set feature功能要求-2

启用IEEE1667隔离区(Enable IEEE1667 Silo):特征标识符C4h允许开启符合IEEE1667标准的安全存储区功能,以实现数据的隔离和安全存储。 4.15.9章节描述了启用IEEE1667 Silo(通过Feature Identifier C4h标识的Set Feature命令)的相关…

高级DBA带你处理MySQL客户端程序频繁访问MYSQL数据库并错误链接不释放导致连接数爆满事故实战

高级DBA带你处理MySQL客户端程序频繁访问MYSQL数据库并错误链接不释放导致连接数爆满事故实战 一、生产事故描述 Mysql生产数据库最大连接数爆满,其余客户端也同样拿不到数据库连接,生产异常,数据传输失败! 报错如下&#xff1a…

iOS17 隐私协议适配详解

1. 背景 网上搜了很多文章,总算有点头绪了。其实隐私清单最后做出来就是一个plist文件。找了几个常用三方已经配好的看了看,比着做就好了。 WWDC23 中关于隐私部分的更新(WWDC23 隐私更新官网),其中提到了第三方 SDK 的…

Fastjson配置消息转换器(时间格式问题)

问题: 我们可以看见,日期的格式有点问题。 由于ArticleListVO类的createTime成员变量是Date类型,默认是由java的Jackson来处理,使用 ISO-8601 规范来处理日期时间格式。ISO-8601 是一种国际标准的日期时间表示法,例如&…

基于R语言的DICE模型技术应用

随着温室气体排放量的增大和温室效应的增强,全球气候变化问题受到日益的关注。我国政府庄严承诺在2030和2060年分别达到“碳达峰”和“碳中和”,因此气候变化和碳排放已经成为科研人员重点关心的问题之一。气候变化问题不仅仅是科学的问题,同…

6_相机坐标系_相机4个坐标系详述

相机系列文章是用来记录使用opencv3来完成单目相机和6轴机械臂手眼标定。本人吃饭的主职是linux下6轴机械臂相关应用开发。但对于机械臂运动学、相机应用等都非常感兴趣,所以对一些线性代数基础薄弱又想深入了解机械臂内部运算的同志比较有体会。由于是探索性学习&a…

ssm小区车库停车系统开发mysql数据库web结构java编程计算机网页源码eclipse项目

一、源码特点 ssm小区车库停车系统是一套完善的信息系统,结合springMVC框架完成本系统,对理解JSP java编程开发语言有帮助系统采用SSM框架(MVC模式开发),系统具有完整的源代码和数据库,系统主要采用B/S模…

基于Arduino IDE 野火ESP8266模块 一键配网 的开发

一、配网介绍 ESP8266 一键配网(也称为 SmartConfig 或 FastConfig)是一种允许用户通过智能手机上的应用程序快速配置 ESP8266 Wi-Fi 模块的方法,而无需手动输入 SSID 和密码。为了实现这一功能,则需要一个支持 SmartConfig 的智能…

作为数据分析师,如何能把AI工具和数据分析工作更好的结合?

在当今信息爆炸的时代,数据已经成为企业、研究机构乃至个人决策的重要依据。然而,如何高效地处理、分析和解读这些数据,从而提炼出有价值的信息,却成为了一个亟待解决的问题。 幸运的是,随着人工智能技术的飞速发展&a…

Ubuntu 中如何选择Java版本

如何在 Ubuntu 上安装多个版本的 Java 首先,我们得检查一下你的系统里是否已经装了 Java。这个很简单,只需运行下面这条命令: 在 Linux 上安装 Java 的实战示例update-java-alternatives --list 输出结果: 检查是否安装了 Java…

使用patchelf解决vscode远程连接不支持低版本glibc的问题

使用patchelf解决vscode远程连接不支持低版本glibc的问题 目录 使用patchelf解决vscode远程连接不支持低版本glibc的问题1. 动态链接库下载2. 用 patchelf 修改 vscode-server 依赖的 glibc 版本 VScode 1.86 版本的 remote 要求 glibc 2.28 及以上,于是在各种旧版本…

CheatFetcher风灵月影修改器快速下载器

地址:https://github.com/MartinxMax/CheatFetcher/releases/tag/v1.0 CheatFetcher网络爬虫风灵月影作弊器快速下载器 采用翻译接口,实现输入中文转为英文搜索,并且英文结果转为中文输出你可以在此更快的下载到游戏修改器 示例 打开cmd窗口,或者其他终端运行 >CheatFe…