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

news2024/10/5 22:39:25

一、引言

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

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

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,sB
     from s
	 where sD='数计学院';

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

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

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

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

create view s_ave(sNo,grade)
  as select sNo,avg(grade)
     from s_grade
	 group 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,sC
	 where s.sNo=sC.sNo
	 group by(s.sNo);

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

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

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

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

(1)

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

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

create view sJ_s (sJ_sNo,sJ_sN,sJ_sB)
  as select sNo,sN,sB
     from s
	 where 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,grade
     from s,sC
     where s.sNo=sC.sNo;

创建学生平均成绩视图

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

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

create view s_g(sNo,sN,cNo,grade,gave)
  as select s_grade.sNo,sN,cNo,grade,gave
     from s_grade,s_ave
	 where 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,sD
     from sX,sY
	 where sX.sNo,sY.sNo

八、总结

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

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

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

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

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

相关文章

基于SVD的点云配准(下)

点云配准及特征提取详细解读 本篇博客将介绍一个用于点云配准的 C++ 代码示例,该示例使用 PCL(Point Cloud Library)库来处理和配准两个点云数据集。我们将逐步解析代码的关键部分,并解释每个步骤的作用。 代码说明 代码的整体结构及其主要功能: int main(int argc, ch…

Vue 状态管理:从Vuex到Pinia,Vue 3官方推荐的状态管理库深度解析

大家好&#xff0c;我是前端宝哥。 在编程界有句老话&#xff1a;“命名和缓存失效是世上两大难题。” 我得说&#xff0c;在现代Web应用的状态管理上&#xff0c;这难题得排第三&#xff01; 今天&#xff0c;咱们来深挖一下Vue的状态管理之道&#xff0c;并介绍一个超直观的解…

汽车IVI中控开发入门及进阶(二十八):视频SERDES芯片

前言: SerDes不是很常见,SerDes是将Ser和Des两种产品组合在一起的名称。Ser是Serializer或“并串转换器”的缩写,Des是Deserializer或“串并转换器”的简写。 Serdes是不是必须的?上一节介绍了camera,上上节也研究了video decoder,那么带摄像头的应用应该具体选哪个方案…

从踢足球到数字孪生

前言 贵州“村超”的火热现象是一个多方面因素共同作用的结果,它不仅是一场体育赛事,更是一个文化现象,反映了时代的精神和人民的情感诉求,同时也推动了乡村振兴和地区发展。足球的魅力是多方面的,它不仅仅是一项运动,更是一种全球性的文化现象。 简单规则下的无限变化:…

MySQL数据操作与查询- select 数据查询

一、select 选择列表 1、select基本结构 select 字段列表 from 表名 where 条件表达式 说明&#xff1a; &#xff08;1&#xff09; 必须的子句只有 select 子句和 from 子句。 &#xff08;2&#xff09;where 子句用于对查询结果进行过滤。 2、选择&#xff08;查询&am…

【会议征稿,IEEE出版】第六届物联网、自动化和人工智能国际学术会议(IoTAAI 2024,7月26-28)

第六届物联网、自动化和人工智能国际会议&#xff08;IoTAAI 2024&#xff09;将于2024年07月26-28日在中国广州召开。 会议旨在拓展国际科技学术交流渠道&#xff0c;搭建学术资源共享平台&#xff0c;促进全球范围内的科技创新&#xff0c;提升中外学术合作。会议还鼓励不同领…

再谈软件设计中的抽象思维(下),从FizzBuzz到规则引擎

作为《程序员的底层思维》出版两年之后的再回顾&#xff0c;在上一篇《再谈软件设计中的抽象思维&#xff08;上&#xff09;&#xff0c;从封装变化开始》中&#xff0c;我介绍了抽象设计的本质是发现变化点&#xff0c;结合问题域&#xff0c;提炼共性&#xff0c;沉淀领域知…

Golang | Leetcode Golang题解之第151题反转字符串中的单词

题目&#xff1a; 题解&#xff1a; import ("fmt" )func reverseWords(s string) string {//1.使用双指针删除冗余的空格slowIndex, fastIndex : 0, 0b : []byte(s)//删除头部冗余空格for len(b) > 0 && fastIndex < len(b) && b[fastIndex]…

建造者模式(大话设计模式)C/C++版本

建造者模式 C 参考&#xff1a;https://www.cnblogs.com/Galesaur-wcy/p/15907863.html #include <iostream> #include <vector> #include <algorithm> #include <string> using namespace std;// Product Class&#xff0c;产品类&#xff0c;由多个…

【Java】Object类中的toString、equals方法

Object类 所有类都直接或间接的继承自Object类&#xff0c;Object类是所有Java类的根基类。 也就意味着所有的Java对象都拥有Object类的属性和方法。 如果在类的声明中未使用extends关键字指明其父类&#xff0c;则默认继承Object类。 toString()方法 【1】Object类的toStr…

植物大战僵尸杂交版 v2.0.88 mac版 Plants vs. Zombies 杂交版下载

特别注意&#xff1a;该游戏最低系统要求为macOS Sonoma 14.X&#xff0c;低于此系统版本的请勿下载&#xff01; 游戏介绍 植物大战僵尸杂交版是由B站UP主“潜艇伟伟迷”制作的一款结合了《植物大战僵尸》原有元素与创新玩法的游戏。这款游戏以其独特的“杂交”植物概念在B站…

【TypeScript】泛型工具

跟着 小满zs 学 ts&#xff1a;学习TypeScript24&#xff08;TS进阶用法-泛型工具&#xff09;_ts泛型工具-CSDN博客 Partial 所有属性可选的意思Required 所有属性必选的意思Pick 提取部分属性Exclude 排除部分属性emit 排除部分属性并且返回新的类型 Partial 属性变为可选。…

Python基础教程(二十):SMTP发送邮件

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; &#x1f49d;&#x1f49…

Python 小市值股票模型代码及回测分析

目录 一、模型介绍 二、代码详解 2.1 初始化函数 2.2 股票筛选过滤函数 2.3 止损函数 2.4 开盘时运行函数 2.5 调仓函数 三、回测结果分析 3.1 收益净值图与概述 3.2 模型收益概览 3.3 年度收益图 3.4 月度收益的时间序列 3.5 月度收益热力图 3.6 月度收益频次分…

CorelDraw 2024软件安装包下载 丨不限速下载丨亲测好用

​简介&#xff1a; CorelDRAW Graphics Suite 订阅版拥有配备齐全的专业设计工具包&#xff0c;可以通过非常高的效率提供令人惊艳的矢量插图、布局、照片编辑和排版项目。价格实惠的订阅就能获得令人难以置信的持续价值&#xff0c;即时、有保障地获得独家的新功能和内容、…

conda安装pytorch使用清华源

原命令&#xff0c;例&#xff1a; # CUDA 11.3 conda install pytorch1.11.0 torchvision0.12.0 torchaudio0.11.0 cudatoolkit11.3 -c pytorch使用清华源&#xff0c;例&#xff1a; # CUDA 11.3 conda install pytorch1.11.0 torchvision0.12.0 torchaudio0.11.0 cudatool…

Qwen2——阿里巴巴最新的多语言模型挑战 Llama 3 等 SOTA

引言 经过几个月的期待&#xff0c; 阿里巴巴 Qwen 团队终于发布了 Qwen2 – 他们强大的语言模型系列的下一代发展。 Qwen2 代表了一次重大飞跃&#xff0c;拥有尖端的进步&#xff0c;有可能将其定位为 Meta 著名的最佳替代品 骆驼3 模型。在本次技术深入探讨中&#xff0c;我…

【redis的基本数据类型】

基本数据类型 Redis的基本数据类型有五种&#xff0c;分别是 StringListHashSetSortedSet 这些基本的数据类型构成了其他数据类型的基石&#xff0c;而这些基本数据类型又对应着不同的底层实现&#xff0c;不同的底层实现往往是针对不同的使用场景做的特殊的优化&#xff0c;…

探索档案未来,尽在ARCHE-2024

2024年第三届上海国际智慧档案展览会暨高峰论坛&#xff08;ARCHE-2024&#xff09;将于2024年6月19日至21日在上海跨国采购会展中心隆重举行。深圳市铨顺宏科技有限公司应邀参展&#xff0c;将以全新形象盛装亮相&#xff0c;展示其在档案管理领域的最新技术和解决方案。 ARC…

Linux系统脚本开机自启动,开机自启动jar包vue前台等

脚本内容jiaobenname.sh #!/bin/bash # 设置环境变量 export JAVA_HOME/usr/local/java/jdk-17.0.10 export CLASSPATH.:$JAVA_HOME/lib/ export PATH.:$JAVA_HOME/bin:$PATHwhile true; doif ps aux | grep -v grep | grep "tomcat" > /dev/null; thenecho &quo…