视图-什么是(VIEW)?怎么创建(CREATE VIEW)?怎么删除(DROP)?怎么用(SELECT/INSERT/UPDATE/DELETE)?

一、引言

之前对数据库的操作都是针对基本关系表,操作都是在数据库的全局逻辑模式上进行的,而在实际的数据库系统中,可能用户只关心或只被允许使用数据库中的某些基本关系表或基本关系表中的某些属性列,这些数据构成了数据库的外模式,外模式的定义可通过定义视图来实现

二、视图的定义-什么是视图?

1、视图是一个命名了的代数表达式,是从一个或几个基本表(或视图)导出来的关系变量视图的值是代数表达式计算后所得到的结果

2、在SQL语言中,视图是一个虚表,在数据库中只存放视图的定义,不存放视图对应的数据,视图的创建为用户提供了一个观察底层数据的窗口,基本表发生变化后,对应视图也会随之改变

三、视图的创建-怎么创建视图?(CREAT VIEW

1、语法格式:

CREATE VIEW 视图名

【(<属性列名1>【,<属性列名2>,...】)】

AS 子查询

【WITH CHECK OPTION】

2、注意:

(1)以在视图名后面对子查询结果中各个属性列进行重命名也可以省略重命名,直接使用子查询结果中的属性列名

(2)通常在以下三种情况下要对子查询中的目标列一一对应地进行重命名操作

子查询目标列中含有聚集函数或列表达式时

子查询目标列中含有对多表查询产生的同名属性列时

需要在视图中为某些列使用更合适的列名时

(3)子查询可以是任意复杂的SELECT语句,实现对基本表或其它视图的查询,但有些DBMS不支持子查询中包含与查询结果的显示有关的ORDER BY语句和DISTINCT选项

(4)若CREATE VIEW语句后面加上WITH CHECK OPTION,则要求在对视图进行更新操作时检查待更新的元组是否满足子查询中的元组选择条件

(5)DBMS执行创建视图语句的结果只是把视图的定义存入数据字典中,并不执行其中的子查询

3、举例1:创建数计学院的学生视图

create view sJ_s (sJ_sNo,sJ_sN,sJ_sB)as select sNo,sN,sBfrom swhere sD='数计学院';

此视图是行列子集视图,即从单个表导出的,只去掉了基本表的某些行或列,但保留基本表的主键的视图

4、举例2:创建学生成绩视图

create view s_grade(sNo,sN,cNo,grade)as select s.sNo,s.sN,sC.cNo,sC.gradefrom s,sCwhere s.sNo=sC.sNo;

5、举例3:定义由学号及该学生的平均成绩构成的视图(视图的基础上创建视图)

create view s_ave(sNo,grade)as select sNo,avg(grade)from s_gradegroup by sNo;

四、视图的删除-怎么删除视图?

1、语句格式:

DROP VIEW 视图名【CASCADE】

1、当基本表被删除,或基本表的结构发生了变化,则从基本表中导出的视图也无法使用,需要使用DROP VIEW语句来删除视图

2、如果在待删除视图上还导出了其它视图,可使用CASCADE选项,把该视图由它导出的所有视图一起删除

3、举例1:将前面创建的视图sJ-s删除

drop view sJ_s;

4、举例2:将前面创建的视图s_grade及在其基础上创建的视图s_gve删除

drop view s_grade cascade;

注意:不同DBMS对CASCADE选项的支持程度不同对视图上还创建有视图的删除操作限制也不同,比如SQL Server就不直接支持这种关联式删除

五、视图的查询-怎么查询视图?

视图定义之后,就可以像查询基本表一样查询视图

1、例1:查询学生的学号和平均成绩

方式一:查询学生成绩视图

select sNo,avg(grade)
from s_grade
group by(sNo);

方式二:查询学生平均成绩视图

select sNo,grade
from s_ave;

注:DBMS执行对视图的查询时,首先要进行有效性检查,检查查询中涉及的基本表、视图是否存在,如果存在,则从数据字典中取出视图的定义,把定义的子查询与用户对视图的查询结合起来,转化为对等价基本表的查询

比如方式一所执行的对视图的查询语句本质上执行的是如下的对等价表的查询:

select s.sNo,avg(grade)from s,sCwhere s.sNo=sC.sNogroup by(s.sNo);

六、视图的更新-怎么更新视图?

1、和对基本表的更新一样,包括插入元组、修改属性值和删除元组操作

2、对视图的更新本质上还是对表的更新,不会作用到视图上

3、插入元组-在sJ_s中插入元组

(1)

insert into sJ_svalues('202218014038','张飞','2000-06-01') 

(2)如果想要在视图中插入元组时只插入满足定义视图时的子查询的元组选择条件表达式的元组,只需要再定义视图时设置WITH CHECK OPTION

create view sJ_s (sJ_sNo,sJ_sN,sJ_sB)as select sNo,sN,sBfrom swhere sD='数计学院'
with check option

2、修改属性值-将学号为202218014030的学生的名字改为西施

update sJ_s
set sJ_sN='西施'
where sJ_sNo='202218014030'

3、删除元组-删除学号为202218014037的学生

delete
from sJ_s
where sJ_sNo='202218014037'

4、不是所有对视图的更新操作都是可行的,有些对视图的更新操作不能唯一的有意义地转换成对相应基本表的更新,就不执行成功,比如想要将学号为202218014030的学生的成绩改为90

update s_ave
set grade=90
where sNo='202218014030'

原因:grade是派生属性,实质上是对sC表进行分组聚集查询所得到的属性,无法将学生的平均成绩作用到各科的成绩上

5、DBMS系统对视图的更新通常有如下限制:

(1)由多表导出的视图不允许更新

(2)如果视图的属性列来自表达式或常数,则不允许执行INSERT和UPDATE操作,但允许执行DELETE操作

(3)如果在定义视图用到GROUP BY子句或聚集函数则不允许更新该视图

(4)建立在一个不允许更新的视图上的视图不允许更新

(5)一般都允许对行列子集视图进行更新

(6)基本表中没在视图中出现的属性无NOT NULL约束时,才允许进行插入操作

七、视图的作用-为什么要有视图?

1、视图提供了一个简化用户操作的快捷方式

举例:查询“西施”同学课程成绩高于其平均成绩的课程编号及成绩

(1)创建两个视图:

创建学生成绩视图

create view s_grade(sNo,sN,cNo,grade)as select s.sNo,sN,cNo,gradefrom s,sCwhere s.sNo=sC.sNo;

创建学生平均成绩视图

create view s_ave(sNo,gave)as select sNo,avg(grade)from s_gradegroup by(sNo)

(2)在两个创建好的视图上通过连接查询再创建一个视图

create view s_g(sNo,sN,cNo,grade,gave)as select s_grade.sNo,sN,cNo,grade,gavefrom s_grade,s_avewhere s_grade.sNo=s_ave.sNo;

(3)直接在创建好的视图进行查询需要的数据即可

select cNo,grade
from s_g
where sN='西施' and grade>gave

2、支持多用户同时以不同的方式对相同的数据进行查询

3、可提供对数据的安全保护

4、可以实现数据的逻辑独立性

(1)比如数据库中有一个学生表s(sNo,sN,sex,sB,sD),里面已经有了数据

(2)因为某些原因,要对学生表s进行重构为两个表sX(sNo,sN,sex,sB)和sY(sNo,sD)

(3)通过在表sX和sY的基础上创建视图可以去避免因为对表的重构而带来的对原表中的数据进行访问所带来的问题

create view s(sNo,sN,sex,sB,sD)as select sX.sNo,sN,sex,sB,sDfrom sX,sYwhere sX.sNo,sY.sNo

八、总结

1、视图是DBMS所管理的一个数据库对象,是数据库的外模式

2、视图是创建在基本表之上的,是通过基本表来进行创建的,对视图的操作类似于对基本表的操作

3、视图在数据库的应用中发挥着重要作用

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

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

相关文章

vue(v-if,v-else-if-else-show)

基本应用 例子 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTE-8"> <meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-w…

实战篇(一):软体2D模拟详解

import java.util.ArrayList; import com.thomasdiewald.pixelflow.java.DwPixelFlow; import com.thomasdiewald.pixelflow.java

LabView_波形控件

波形图表 将一定数量的数据点存储在缓冲区&#xff0c;并通过这种方式存储并显示这些数据点。当缓冲区被填满后&#xff0c;波形图表将会用新的数据点覆盖缓冲区中存在时间最久的数据点。 当数据点可用时&#xff0c;波形图表将显示已有的数据点外加最新接收到的数据点 。 您可…

nodejs安装及环境配置常见报错解决

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时环境,它允许 JavaScript 代码在服务器端运行。Node.js 的出现极大地扩展了 JavaScript 的应用场景,使其不仅仅局限于前端开发,还能够处理服务器端逻辑、数据库操作、网络编程等任务。以下是 Node.js 的一些主要功能详…

NVIDIA Triton系列02-功能与架构简介

NVIDIA Triton系列02-功能与架构简介 B站&#xff1a;肆十二-的个人空间-肆十二-个人主页-哔哩哔哩视频 (bilibili.com) 博客&#xff1a;肆十二-CSDN博客 问答&#xff1a;(10 封私信 / 72 条消息) 肆十二 - 知乎 (zhihu.com) 前面文章介绍微软 Teams 会议系统、微信软件与腾讯…

使用file.transferTo()做Java文件复制,目标文件存在时,是抛异常还是覆盖写入?

背景 最近在做一个项目&#xff0c;在服务端涉及到文件的复制操作&#xff0c;于是想到了 Java 中 FileInputStream 类的 transferTo() 方法。这里简单记录一下用法&#xff0c;另外&#xff0c;如果目标文件已经存在&#xff0c;该如何处理这种情况呢&#xff1f;是出现异常还…

儿童编程语言

儿童编程是指为儿童设计的编程教育活动&#xff0c;旨在通过有趣、互动的方式教授儿童编程的基本概念和技能。随着科技的发展&#xff0c;编程教育越来越受到重视&#xff0c;因为它不仅能够培养儿童的逻辑思维、问题解决能力和创造力&#xff0c;还能为他们未来的学习和职业发…

C语言怎样复制图形?

一、问题 C语⾔中如何实现把屏幕某⼀处的图形复制到另⼀处&#xff1f; 二、解答 复制图形要⽤到以下3个函数&#xff1a; void far getimage(int xl,nt yl, int x2,int y2, void far *mapbuf); void far putimge(int x,int,y,void *mapbuf, int op); unsined far imagesiz…

Thinkphp一文鸡富贵鸡玫瑰庄园富农场仿皮皮果理财农场源码

Thinkphp一文鸡富贵鸡玫瑰庄园富农场仿皮皮果理财农场源码&#xff0c;喜欢的朋友可以下载研究 一文鸡富贵鸡玫瑰庄园富农场仿皮皮果理财农场源码

Django初学者指南

文章目录 Django初学者指南1 Django简介1.1 Django的历史1.2 使用Django的知名网站1.4 Django的主要特点1.5 Django的工作原理 2 Django 使用2.1 Django 支持的 Python 版本2.2 Django 版本 3 Django 开发 Web 程序3.1 安装Django3.2 创建Django项目3.3 运行开发服务器3.4 创建…

数据结构02 队列及其应用【C++实现】

目录 队列及其特点 利用数组模拟队列的基本操作 创建队列 空队条件 元素入队 元素出队 模拟超市收银问题 队列操作 初始化 入队操作 出队操作 取出队首元素 STL模板中队列的基本使用 训练&#xff1a;约瑟夫问题 参考程序 队列及其特点 队列是一种特殊的线性表&am…

求导,积分

求导公式&#xff1a; 复合函数求导法则&#xff1a;两个函数导函数的乘积. 例如&#xff1a;f(x)2x1,f(x)2,g(x)x^24x4,g(x)2x4 那么复合函数&#xff1a; g(f(x))(2x1)^24(2x1)4 把&#xff08;2x1&#xff09;看做整体,则g2(2x1)4 然后再求&#xff08;2x1&#xff09;的导函…

Stable Diffusion vs DALL·E3

大模型技术论文不断&#xff0c;每个月总会新增上千篇。本专栏精选论文重点解读&#xff0c;主题还是围绕着行业实践和工程量产。若在某个环节出现卡点&#xff0c;可以回到大模型必备腔调或者LLM背后的基础模型新阅读。而最新科技&#xff08;Mamba,xLSTM,KAN&#xff09;则提…

网络编程(五)IO模型

文章目录 一、 阻塞IO&#xff08;一&#xff09;阻塞IO模式&#xff08;二&#xff09;示例 二、非阻塞IO&#xff08;一&#xff09;特点&#xff08;二&#xff09;fcntl&#xff08;三&#xff09;示例 三、IO多路复用&#xff08;一&#xff09;实现原理&#xff08;二&am…

基于System-Verilog的流水灯设计与仿真

文章目录 一、system Verilog1.语言基本介绍2.过程赋值和连续赋值 二、编写testbench仿真1.流水灯testbench2.2位全加器3.实验结果 一、system Verilog 1.语言基本介绍 像 Verilog 和 VHDL 之类的硬件描述语言 (HDL) 主要用于描述硬件行为&#xff0c;以便将其转换为由组合门…

【实用技巧】Unity中的3D物理系统:刚体——使用技巧

在使用Unity的3D物理系统中的刚体&#xff08;Rigidbody&#xff09;时&#xff0c;有一些技巧可以帮助你更有效地实现物理效果和优化性能。以下是一些使用刚体的技巧&#xff1a; 合理使用Is Kinematic属性&#xff1a; 对于那些不需要物理计算的对象&#xff0c;比如玩家控制…

海底管缆先敷后埋与边敷边埋有什么区别?

海缆铺设有两种方式&#xff1a;“边敷边埋”和“先敷后埋”。 “边敷边埋”冲埋式埋设犁施工法———通过埋设犁(水力开沟机)泵送高压水&#xff0c;在海底冲出一条沟槽的同时&#xff0c;将海缆平铺下去,然后利用在潮汐作用下海床面自行回填(必要时采取压盖保护施工)。主要施…

[linux]如何跟踪linux 内核运行的流程呢

前面已经可以把内核编译出来&#xff0c;但是作为技术狗想看到内核是怎么运行的怎么办&#xff1f; 内核很多代码都是C语言写的&#xff0c;那简单&#xff0c;添加2行代码&#xff1a; include/linux/printk.h 529和530原来的&#xff1a; #define pr_info(fmt, ...) \ …

python查看包的版本

在Python中,有多种方法可以查看已安装包的版本。以下是几种常用的方法: 使用pip命令: 在命令行或终端中,你可以使用pip命令来查看已安装包的版本。例如,要查看numpy的版本,可以运行: pip show numpy这将显示numpy包的详细信息,包括版本号。 如果你使用的是pip3(对应于…

vue input 限制输入,小数点后保留两位 以及 图片垂直居中显示 和 分享 git 小技巧

&#xff08;1&#xff09;input 限制输入&#xff0c;小数点后保留两位 <template><div><el-input v-model"number" input"checkNumber" blur"completeNumber" placeholder"请输入"></el-input></div>…