视图的作用

news/2024/5/9 9:51:03/文章来源:https://blog.csdn.net/weixin_67859959/article/details/136994049

目录

视图的作用

创建视图

为 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(*) countFROM empGROUP 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(*) countFROM empGROUP 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: 无法通过联接视图修改多个基表”。如果真的需要修改数据表的内容,可以使用替代触发器完成

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

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

相关文章

UMass、MIT等提出3D世界具身基础模型,机器人根据生成的世界模型无缝连接3D感知、推理和行动

在最近的研究中,视觉-语言-动作(VLA,vision-language-action)模型的输入基本都是2D数据,没有集成更通用的3D物理世界。 此外,现有的模型通过学习「感知到动作的直接映射」来进行动作预测,忽略了…

数据结构——线性表(一)

线性表,顾名思义,是具有像线一样的性质的表。如同学生们在操场上排队,一个跟着一个排队,有一个打头,有一个收尾,在其中的学生都知道前一个是谁,后一个是谁,这样就像一根线将他们都串…

html页面使用@for(){},@if(){},利用jquery 获取当前class在列表中的下标

基于以前的项目进行修改优化,前端代码根据List元素在html里进行遍历显示 原先的代码: 其中,noticeGuide.Id是标识noticeGuide的唯一值,但是不是从0开始的【是数据库自增字段】 但是在页面初始化加载的时候,我们只想…

鸿蒙OS开发问题:(ArkTS) 【解决中文乱码 string2Uint8Array、uint8Array2String】

在进行base64编码中,遇到中文如果不进行处理一定会出现乱码 let result1: string CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse((一二三四五六七八九十123)))LogUtils.i("result1 " result1);let result2: string CryptoJS.enc.Base64.par…

mac-git上传至github(ssh版本,个人tokens总出错)

第一步 git clone https://github.com/用户名/项目名.git 第二步 cd 项目名 第三步 将本地的文件移动到项目下 第四步 git add . 第五步 git commit -m "添加****文件夹" 第六步 git push origin main 报错: 采用ssh验证 本地文件链接公钥 …

软件杯 深度学习+opencv+python实现车道线检测 - 自动驾驶

文章目录 0 前言1 课题背景2 实现效果3 卷积神经网络3.1卷积层3.2 池化层3.3 激活函数:3.4 全连接层3.5 使用tensorflow中keras模块实现卷积神经网络 4 YOLOV56 数据集处理7 模型训练8 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 &am…

电脑windows 蓝屏【恢复—无法加载操作系统,原因是关键系统驱动程序丢失或包含错误。.......】

当你碰到下图这种情况的电脑蓝屏,先别急着重装系统,小编本来也是想重装系统的,但是太麻烦,重装系统后你还得重装各种软件,太麻烦了!! 这种情况下,你就拿出你的启动U盘,进…

OSCP靶场--GLPI

OSCP靶场–GLPI 考点(CVE-2022-35914 php执行函数绕过ssh端口转发jetty xml RCE) 1.nmap扫描(ssh端口转发) ## ┌──(root㉿kali)-[~/Desktop] └─# nmap 192.168.194.242 -sV -sC --min-rate 2500 Starting Nmap 7.92 ( https://nmap.org ) at 2024-03-26 22:22 EDT Nmap…

快速上手Spring Cloud 十一:微服务架构下的安全与权限管理

快速上手Spring Cloud 一:Spring Cloud 简介 快速上手Spring Cloud 二:核心组件解析 快速上手Spring Cloud 三:API网关深入探索与实战应用 快速上手Spring Cloud 四:微服务治理与安全 快速上手Spring Cloud 五:Spring …

python opencv稍基础初学

傅里叶变换 傅里叶变换f​​​​​傅里叶分析之掐死教程(完整版)更新于2014.06.06 - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/19763358 相当nice 傅里叶变换的作用 高频:变化剧烈的灰度分量,例如边界 低频:变…

【搜索引擎2】实现API方式调用ElasticSearch8接口

1、理解ElasticSearch各名词含义 ElasticSearch对比Mysql Mysql数据库Elastic SearchDatabase7.X版本前有Type,对比数据库中的表,新版取消了TableIndexRowDocumentColumnmapping Elasticsearch是使用Java开发的,8.1版本的ES需要JDK17及以上…

Elasticsearch-相关性

相关性描述的是⼀个⽂档和查询语句匹配的程度。ES 会对每个匹配查询条件的结果进⾏算分_score。_score 的评分越高,相关度越高。 ES 5.0之前使用TF-IDF 相关性算法, 5.0之后使用了BM25算法 TF-IDF 公式 score(q,d) queryNorm(q) coord(q,d) …

数据处理库Pandas数据结构DataFrame

Dataframe是一种二维数据结构,数据以表格形式(与Excel类似)存储,有对应的行和列,如图3-3所示。它的每列可以是不同的值类型(不像 ndarray 只能有一个 dtype)。基本上可以把 DataFrame 看成是共享…

@EnableWebMvc 导致自定义序列化器失效

目录 前言 一. 自定义序列化器失效 1.1 EnableWebMvc 的作用 1.2 EnableWebMvc 带来了什么后果 1.3 原理分析 1.4 问题解决 二. 总结 前言 在使用Swagger的时候用 到了EnableWebMvc,发现之前为了解决Long类型、日期类型等自定义序列化器失效了 Configurati…

基于javaweb宠物领养平台管理系统设计和实现

基于javaweb宠物领养平台管理系统设计和实现 博主介绍:多年java开发经验,专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐留言 文末获取源码联…

Android ddms在macOS上面卡死和Java版本异常无法关闭弹窗处理

背景 在macOS上面打开ddms工具遇到错误。产留的uix文件无法打开,弹出无法关闭和进入ddms无任何响应。 问题-无法关闭的弹窗 首先ddms在Android SDK中位置/sdk/tools/monitor这个二进制文件就是ddms程序了。 终端执行这个程序即可。第一个遇到的问题,打开ddms之后,弹出一个…

MySQL 高级语句(二)

一、子查询 1.1 相同表子查询 1.2 不同表/多表子查询 1.3 子查询的应用 1.3.1 语法 1.3.2 insert 子查询 1.3.3 update 子查询 1.3.4 delete 子查询 1.4 exists 关键字 1.4.1 true 1.4.2 false 1.5 as别名 二、视图 2.1 视图和表的区别和联系 2.1.1 区别 2.1.2 …

阿里云云服务器资源规格推荐指南

资源规格推荐可以根据您的特定业务场景,为您推荐最合适的计算资源规格以及满足您算力需求的资源规模。本文介绍如何根据物理机规格推荐ECS资源和根据总算力推荐ECS资源。 根据物理机规格推荐ECS资源 IDC上云可以帮助您在将线下IDC服务器搬迁上云前,根据…

单臂路由和三层交换机

目录 一.单臂路由 1.单臂路由的工作原理 2.单臂路由的配置 2.1画出拓扑图 2.2配置PC 2.3配置交换机 2.4配置路由器 2.5测试 二.三层交换机 1.三层交换机的概述 2.三层交换机的配置 2.1画出拓扑图 2.2配置PC 2.3配置二层交换机 2.4配置三层交换机 2.5测试 3.拓展 三.总结 一.…

iOS_convert point or rect 坐标和布局转换+判断

文章目录 1. 坐标转换2. 布局转换3. 包含、相交 如:有3个色块 let view1 UIView(frame: CGRect(x: 100.0, y: 100.0, width: 300.0, height: 300.0)) view1.backgroundColor UIColor.cyan self.view.addSubview(view1)let view2 UIView(frame: CGRect(x: 50.0, …