视图-什么是(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…

LabView_波形控件

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

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

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

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;则提…

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

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

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

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

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

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

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

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

文章解读与仿真程序复现思路——电工技术学报EI\CSCD\北大核心《计及台风时空特性和灵活性资源协同优化的配电网弹性提升策略》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

鸿蒙轻内核M核源码分析系列二一 03 文件系统LittleFS

2.2 文件信息数组操作 函数LfsAllocFd()设置文件信息数组元素信息。参数fileName为文件路径信息&#xff0c;传出参数fd为文件描述符即数组索引。遍历文件信息数组&#xff0c;遍历到第一个未使用的元素标记其为已使用状态&#xff0c;设置文件路径信息&#xff0c;把数组索引…

gbase8s数据库阻塞检查点和非阻塞检查点的执行机制

1. 检查点的描述 为了便于数据库系统的复原和逻辑恢复&#xff0c;数据库服务器生成的一致性标志点&#xff0c;称为检查点&#xff0c;其是建立在数据库系统的已知和一致状态时日志中的某个时间点检查点的目的在于定期将逻辑日志中的重新启动点向前移动 如果存在检查点&#…

Windows 服务器Nginx 下载、部署、配置流程(图文教程)

不定期更新 目录 一、下载Nginx安装包 二、上传安装包 三、启动Nginx 四、Nginx常用命令 五、Nginx&#xff08;最小&#xff09;配置详解 六、Nginx&#xff08;基础&#xff09;配置详解 七、反向代理 八、负载均衡 九、动静分离 十、报错 一、下载Nginx安装包 四…

【源码】综合股票币币合约交易所源码/etf交易所源码/美股港股台股交易所源码

支持多国语言 全开源可二开的一个版本&#xff01;支持虚拟货币 ETF 外汇 美股 A股 港股 台股。 前端是VUE开发&#xff08;带vue工程源码&#xff09;后端JAVA开发&#xff01;搭建也相对简单。 总的来说功能非常强大&#xff0c;适合线上运营的一个版本&#xff0c;有兴趣的可…

【因果推断python】38_预测模型1

目录 工业界中的机器学习 之前的部分涵盖了因果推理的核心。那里的技术是众所周知和成熟的。他们经受住了时间的考验。第一部分建立了我们可以依赖的坚实基础。用更专业的术语来说&#xff0c;第一部分侧重于定义什么是因果推理&#xff0c;哪些偏差会阻止相关性成为因果关系&…

Techo TVP技术 沙龙

Techo TVP技术 沙龙 今天参加了 在上海 徐汇 腾讯云大厦 举办的 Techo TVP 技术沙龙&#xff08;主要介绍 AI agent 让我感受很深&#xff09; &#xff0c;那什么是 AI Agent呢&#xff1f; 是一个智能体&#xff0c;由大语言模型驱动&#xff0c;具有自主理解、感知、规划、…

MISSING COURSE-shell

shell 01 what is the shell q: linux如何操作计算机硬件cpu 内存 磁盘 显示器等 a:使用linux的内核操作 1.shell -is命令 shell通过编写shell命令 发送给linux内核 去执行 操作就是计算机硬件 so shell 是用户操作计算机 类似于windows里的dos命令 shell是一门程序设计语言…