数据库原理及MySQL应用 | 视图

news2025/7/8 18:52:11

 视图是关系数据库系统提供给用户以多种角度观察数据库中数据的重要机制,透过视图用户可以看到数据表中看书需要的内容。

视图(View)是关系数据库系统提供给用户以多种角度观察数据库中数据的重要机制。在用户看来,视图是通过不同角度去看实际表中的数据,就像一个窗口,通过窗口去看外面的楼房,可以看到楼房的不同部分,而透过视图用户可以看到数据表中自己需要的内容。

视图是一种数据库对象,是从一个或多个数据表或视图中导出的虚拟表,视图并不存放任何物理数据,只是用来查看数据的窗口,用来显示一个查询结果。视图的结构和数据是对数据表进行查询的结果,为视图提供数据的表称为基表。如图7-28所示为由四个表建立的一个视图。

■ 图7-28由四个表建立的一个视图

视图和数据表在使用时很类似,但二者之间还存在着以下区别。

  • (1) 数据表中存放的是物理存在的数据,而视图中存储的是查询语句,并不存储视图查询的结果集。
  • (2) 视图中的数据源于基表,是在视图被引用时动态生成的,当基表中的数据发生变化时,由视图查询出的数据也随之变化。
  • (3) 通过视图更新数据时,实际上是对基表进行数据更新。
  • (4) 视图可以是表的一部分,也可以是多个基表的联合。

视图对象经常被用户使用,因为它有以下优点。

  • (1) 视图数据针对性强。视图能将用户感兴趣的数据集中在一起,而不必担心存储空间问题。
  • (2) 视图可以简化数据操作。视图可将复杂的查询封装起来,每次执行相同查询时,不必重写复杂的查询语句,只需一条简单的查询视图语句即可查询到想要的数据。
  • (3) 视图可以对机密数据提供安全保护。系统通过用户权限的设置,允许用户通过视图访问特定的数据,而不授予用户直接访问基表的权限,以便有效地保护基表中的数据。
  • (4) 视图作为外模式,面向不同用户,非常灵活。

01、创建视图

创建视图要求用户具有创建视图(CREATE VIEW)的权限,并且对创建视图涉及的表具有选择(SELECT)权限。创建视图的基本语法格式如下所示。

 语法说明如下。

● OR REPLACE是可选选项,表示替换已经创建的视图。若加了该参数,还需要用户具有删除视图(DROP VIEW)的权限。

● ALGORITHM是可选选项,表示视图选择的算法。它的取值有3个,选择其中一种即可。

◇ UNDEFINED表示由MySQL自动选择算法,为默认选项。一般会首选MERGE,因为MERGE更有效率。

◇ MERGE表示当使用视图时,会把查询视图的语句和创建视图的语句合并起来,形成一条语句,最后再从基表中查询。

◇ TEMPTABLE表示当使用视图时,会把创建视图的语句的查询结果当成一张临时表,再从临时表中进行筛选。

● DEFINER是可选选项,表示定义视图的用户,默认为当前用户。也可在创建时指定不同的用户作为创建者,或者叫视图持有人。

● SQL SECURITY是可选选项,用于定义视图查询数据时的安全验证方式,表示在执行过程中,使用谁的权限来执行。它有2个选项:DEFINER表示创建视图时,验证视图持有人是否有权限访问视图所引用的对象;INVOKER表示查询视图时,验证查询的用户是否拥有权限访问视图及视图所引用的对象。

● view_name是新建视图的名称。视图名称必须符合标识符命名规则。默认情况下,新创建的视图保存在当前数据库中,若要在给定数据库中创建视图,创建时应将名称指定为db_name.view_name。视图名称不能和数据库中已经存在的数据表名相同。

● column是视图中的列名。当视图中的列是派生列,或多个列具有相同名称时,必须指定该参数,或在SELECT语句中为列指定别名。如果没有指定列名,其列名由SELECT语句指派。一个视图最多只能引用1024个列。

● AS是要引出视图要执行的操作。

● select_statement是定义视图的SELECT语句。该语句可以使用多个表或其他视图。

● WITH CHECK OPTION是可选选项,用于视图数据操作时的检查条件。若省略此子句,则不进行检查。 

◇ CASCADED表示当在一个视图的基础上创建另一个视图时,进行级联检查,即更新视图时要满足所有相关视图和表的条件,为默认选项。建议采用该参数,从该视图派生出来的视图在更新视图时需要考虑其父视图的约束条件,这样更加严谨,数据更加安全。

◇ LOCAL表示更新视图时满足该视图本身定义的条件即可。

【例7-57】在图书销售数据库booksale中,由图书表books创建出隐藏价格列unitprice的计算机类图书信息的视图v_partbooks,然后查询视图。

执行结果如图7-29所示。

■ 图7-29创建单表视图

从执行结果可以看到,视图中记录的类别代号ctgcode都是computer。创建的视图有列需要隐藏,因此用SELECT子句指出需显示的列名。使用视图时,用户接触不到实际操作的表和表中的列,这样可以很好地保证数据的安全。

【例7-58】在图书销售数据库booksale中,由图书表books和订单项目表orderitems创建出显示订单编号orderid、书名title、单价unitprice和销售价格price的视图v_booksprice,然后查询视图。

booksale.v_booksprice表示在booksale数据库中创建名为v_booksprice的视图。通过视图可以简洁地把多个数据表的数据进行连接查询。SELECT语句中因为两个价格不好区分,为了方便用户查看,给两个价格设置了别名。检查为LOCAL,更新视图只需要满足该视图本身定义的条件即可。

【例7-59】在图书销售数据库booksale中,由顾客表customers、订单表orders和订单项目表orderitems创建出显示顾客姓名、累计订购数量和平均销售价格的视图v_salebooks,然后查询视图。

视图中的SELECT语句不仅仅局限于简单查询,也适用于复杂查询。该例使用了分组查询,输出列采用聚合函数。采用聚合函数的列如果不起别名,显示输出为聚合函数,为了方便用户查看,定义了视图输出的列名。例7-58中设置别名的位置和例7-59中设置别名的位置效果是一样的,大家选择适合自己的即可。

视图不是必需的数据库对象,只有创建视图的优势明显,才会创建视图,否则创建没用的视图只会浪费空间。如果某用户只有视图的查询权限,而没有基表的查询权限,则该用户无法进行视图查询。只有拥有基表及视图的查询权限的用户才能方便地使用视图查询数据。

02、查看视图

查看视图是指查看数据库中已经存在的视图的定义。查看视图必须要有SHOW VIEW的权限。查看视图包括4种方法。

1. 使用DESCRIBE(DESC)语句查看视图

DESCRIBE语句不仅可以查看数据表的定义,还可以查看视图的定义,因为视图是一张比较特殊的表——虚拟表。DESCRIBE语句查询视图的基本语法格式如下所示。

语法说明:view_name是要查看定义的视图的名称。

【例7-60】在图书销售数据库booksale中,查看视图v_salebooks的定义。

2. 使用SHOW TABLES语句查看视图

SHOW TABLES语句不仅可以查看数据库中有哪些数据表,还可以查看有哪些视图。SHOW TABLES语句的基本语法格式如下所示。

语法说明:db_name是要查看表和视图所在的数据库的名称。

【例7-61】在图书销售数据库booksale中,查看有哪些数据表和视图。

3. 使用SHOW CREATE VIEW语句查看视图

可以使用SHOW CREATE命令查看定义表或视图的SQL语句,从而得到表或视图的详细结构。SHOW CREATE命令的基本语法格式如下所示。

语法说明:view_name是要查看定义的视图的名称。

【例7-62】在图书销售数据库booksale中,查看视图v_salebooks的定义。

创建视图的SQL定义语句在Create View列中显示。在图形化界面中由于列宽问题显示不全,可在命令行状态输入该命令并将“;”替换成“\G”结尾,结果将以垂直方向显示,执行结果如图7-30所示。

■ 图7-30SHOW CREATE VIEW语句查询视图

4. 在VIEWS表中查看视图

创建视图后,视图的定义都存储在information_schema数据库的VIEWS表中。查询该数据表,可以看到数据库中所有表或视图的详细结构。

【例7-63】在图书销售数据库booksale中,查看视图v_salebooks的定义。

视图执行的SQL语句在VIEW_DEFINITION列中显示。在图形化界面中由于列宽问题显示不全,可在命令行状态输入该命令并将“;”替换成“\G”结尾,结果将以垂直方向显示。

03、修改视图

修改视图是指修改数据库中已经存在的视图的定义。例如:当视图引用的数据表中的列发生了变化时,需要将视图进行修改以保持一致才能再使用。修改视图包括两种方法。

1. 使用CREATE OR REPLACE VIEW语句修改视图

创建视图时,如果视图已经存在,系统会将原视图删除,再创建新视图;如果视图不存在,则直接创建新视图。方法见7.5.1节。

【例7-64】在图书销售数据库booksale中,由图书表books、顾客表customers、订单表orders和订单项目表orderitems创建出显示顾客姓名cstname、书名title、图书国际标准书号isbn和订购数量quantity的视图v_salebooks,然后查询视图。

booksale.v_salebooks表示在booksale数据库中创建名为v_salebooks的视图。由于视图v_salebooks在booksale数据库中已经存在,使用OR REPLACE参数来替换已经创建的同名视图,原视图系统会自动删除。通过视图可以简洁地把四个数据表的数据进行连接查询,连接条件采用了两种方式,效果一致。

2. 使用ALTER VIEW语句修改视图

修改视图的基本语法格式如下所示。

 

语法说明:所有关键字和参数同创建视图的语法保持一致。

【例7-65】在图书销售数据库booksale中,修改视图v_partbooks,在原有计算机类图书信息的基础上再添加上生活类的图书信息,然后查询视图。

04、查询视图

MySQL允许用户采用操作表的方法操作视图,即对视图进行SELECT、UPDATE、INSERT、DELETE操作。但由于视图只是虚表,并不存储数据,因此通过视图操作数据将被转换为对基表进行数据操作。

查询视图就是指通过视图来查看数据表中的数据。

【例7-66】在图书销售数据库booksale中,查看视图v_partbooks。

05、更新视图

更新视图是指通过视图来插入、修改、删除基表中的数据,但并不是所有的视图都可以更新,只有满足更新条件的视图才能更新。更新视图,应遵循以下规则。

(1) 系统允许修改基于两个或多个基表得到的视图,但是每次修改只能涉及一个基表,否则操作失败。

(2) 系统不允许修改视图中的计算列、聚合列和DISTINCT关键字作用的列。

(3) 如果视图定义中包含GROUP BY子句或HAVING子句,则不能通过视图修改数据。

(4) 通过视图修改基表中的数据时,必须满足基表上定义的完整性约束。

(5) 如果视图定义中包含WITH CHECK OPTION选项,则INSERT操作必须符合视图定义中WHERE子句设定的查询条件;不满足WHERE子句查询条件的UPDATE和DELETE操作虽被允许,但对基表不起任何作用。

(6) 由不可更新的视图导出的视图不可更新。

(7) 定义视图的SELECT语句中包含子查询,或是合并查询(UNION)的视图不可更新。

(8) 带有常量的视图不可更新。

(9) 创建视图时,ALGORITHM为TEMPLATE类型的视图不可更新。

视图虽然可以更新数据,但是有很多的限制,因此,最好将视图作为查询数据的方法,而不要通过视图来更新数据。

【例7-67】在图书销售数据库booksale中,利用视图v_partbooks,插入一条图书信息,然后查询视图。

插入失败。这里插入数据的ctgcode列的值为'fiction',违反了WITH CHECK OPTION的条件,必须是'computer'或'life'类图书才能插入成功。

修改代码,如下。

插入成功。books表中添加了一条记录,由于视图中不包括单价unitprice,且该列允许为空,系统自动赋值为NULL。如果该列不允许为空且没有设置默认值,通过视图将无法成功地添加记录。利用视图插入一条图书信息后基表数据更新,视图同步更新。

【例7-68】在图书销售数据库booksale中,利用视图v_partbooks,更新一本图书信息,然后查询视图。

【例7-69】在图书销售数据库booksale中,利用视图v_booksprice,将订单编号为1的订单的销售价格调整为单价打七折的价格,然后查询视图。

当视图数据来自多个基表时,每次更新操作只能更新一个基表中的数据。因v_booksprice视图输出的列名是指定的,故SET子句中列名应该使用指定名,若仍使用基表中的原列名,系统将报错。

【例7-70】在图书销售数据库booksale中,利用视图v_booksprice,删除订单编号为1的订单。

删除失败,因为视图v_booksprice涉及两张表。

【例7-71】在图书销售数据库booksale中,利用视图v_partbooks,删除图书编号bookid为11的图书,然后查询视图。

06、删除视图

删除视图就是指删除数据库中已存在的视图。因为视图并不存放任何物理数据,所以删除视图只是删除视图的定义,和数据无关。

删除视图要求用户具有删除视图(DROP VIEW)的权限。删除视图的基本语法格式如下所示。

语法说明如下。

  • view_name是要删除视图的名称。视图名可以有一个或多个,可同时删除一个或多个视图,视图名之间用逗号分隔。如果多个视图名中有不存在的视图名,则视图删除操作失败,并在报错信息中陈述无法删除的视图的名称。

  • IF EXISTS是可选选项。添加该选项,表示指定的视图存在时执行删除视图操作,否则忽略此操作。

  • RESTRICT | CASCADED是可选选项。CASCADE是自动删除依赖此视图的对象(例如其他视图)。RESTRICT是如果有依赖对象存在,则拒绝删除此视图,此项是默认选项。

【例7-72】在图书销售数据库booksale中,删除视图v_partbooks和视图v_salesbooks,然后查看视图列表。

因为视图v_salesbooks不存在,故系统报错,指出无法删除的视图名称,且该命令无法完成删除。

修改代码,如下所示。

视图v_partbooks存在,则该视图被删除;视图v_salesbooks不存在,则系统忽略此操作。

 

 

 

 

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

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

相关文章

如何在GPU上运行pandas和sklearn?

当涉及大量数据时,Pandas 可以有效地处理数据。但是它使用CPU 进行计算操作。该过程可以通过并行处理加快,但处理大量数据仍然效率不高。 在以前过去,GPU 主要用于渲染视频和玩游戏。但是现在随着技术的进步大多数大型项目都依赖 GPU 支持&a…

【C++初阶7-string实现】xxx坐享其成,xxx苦不堪言

前言 本期分享Cstring类的模拟实现(参考SGI 30实现),不套类模版,降低学习成本, 进一步加深理解。 属性介绍 名称具体成员动态字符数组char* _s存储有效数据的容量size_t capacity有效数据的个数size_t sizenposstat…

【OpenCV 例程 300篇】251. 特征匹配之暴力匹配

『youcans 的 OpenCV 例程300篇 - 总目录』 【youcans 的 OpenCV 例程 300篇】251. 特征匹配之暴力匹配 特征匹配是特征检测和特征描述的基本应用,在在图像拼接、目标识别、三维重建等领域的应用非常广泛。 基于特征描述符的特征点匹配是通过对两幅图像的特征点集合…

基于统一空间方法的动态切换拥挤(DSC)DSC-MOAGDE算法附matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。 🍎个人主页:Matlab科研工作室 🍊个人信条:格物致知。 更多Matlab仿真内容点击👇 智能优化算法 …

Python编程零基础如何逆袭成为爬虫实战高手之《WIFI破解》(甩万能钥匙十条街)爆赞爆赞~

导语 Hello,大家好呀!我是木木子吖~ 一个集美貌幽默风趣善良可爱并努力码代码的程序媛一枚。 听说关注我的人会一夜暴富发大财哦~ (哇哇哇 这真的爱😍😍) 所有文章完整的素材源码都在&#…

dreamweaver网页大作业 我的家乡——南京玄武湖旅游攻略(4页) 学生网页设计作业源码

家乡旅游景点网页作业制作 网页代码运用了DIV盒子的使用方法,如盒子的嵌套、浮动、margin、border、background等属性的使用,外部大盒子设定居中,内部左中右布局,下方横向浮动排列,大学学习的前端知识点和布局方式都有…

Java项目写好了,如何部署上线?看这篇文章吧

嗨,各位小伙伴大家好,你有没有想壹哥呀?前几天有小伙伴给壹哥留言,说自己的项目写好了,想把项目部署到服务器上,这个该怎么实现呢?那么针对这个问题,今天壹哥就带大家走一遍完整的项…

【云计算与大数据计算】大数据物理、集成、安全架构及阿里云飞天系统架构讲解(超详细)

一、物理架构 物理架构 - 企业大数据系统的各层次系统最终要部署到主机节点中,这些节点通过网络连接成 为一个整体,为企业的大数据应用提供物理支撑 ,企业大数据系统由多个逻辑层组成,多个逻辑层可以映射到一个物理节点上,也可以映射到多个物…

nacos--基础--1.1--理论--介绍

nacos–基础–1.1–理论–介绍 1、介绍 是阿里的一个开源产品致力于帮助您发现、配置和管理微服务 1.1、参考资料 https://nacos.io/zh-cn/docs/what-is-nacos.html1.2、功能 服务发现中心:动态服务发现服务注册中心:管理注册服务服务配置中心&#…

行为管理(锐捷智慧教室)

大家好,我是小杜,被师傅“强制”休息两天,感觉整个人都升华了,精神满满的,看来还是需要劳逸结合,一味的高强度精神亢奋的情况下其实是事倍功半......。随着学习的深入,师傅也带着我对公司的业务…

PCIe Dma coherent

目录 1.PCIe Dma coherent前言 2.DMA与Cache 的一致性 2.1一致性问题 2.2Coherent DMA buffers 一致性 2.3DMA Streaming Mapping 流式DMA映射 2.4dma_alloc_coherent的例外 2.5SMMU | IOMMU 3.Linux 内核中 DMA 及 Cache 分析 3.1arm 3.2DMA ZONE 3.3DMA ZONE 的内…

南昌市-中安协-安防工程企业设计施工维护能力评价

安防工程企业设计、施工、维护能力评价是指中国安全防范产品行业协会从本行业实际出发,制定评价标准和实施办法,确定其能力等级,并颁发证书的活动。安防工程企业(以下称企业)设计、施工、维护能力(以下称能…

以太网 传统STP生成树简介、STP工作方式简单介绍

2.10.0 以太网 传统STP生成树(简介、工作方式) 作用: STP(Spanning Tree Prortoco)生成树协议,它的出现解决了交换机网络环路的问题。 交换机网络中收到BUM帧的时候,将会进行泛洪的操作&…

CSS 父选择器,:has()

在CSS Selectors 4规范中,CSS 引入了一个名为 的新选择器:has(),它最终让我们可以选择父级。这意味着我们可以选择具有特定元素的父元素。目前Safari和Chrome105已经支持。 父选择器如何在 CSS 中工作 在 CSS 中,如果我们想要选择某些东西&a…

【Pygame小游戏】史上最全:《唐诗三百首》合集,每一首都是精华,果断收藏~(学诗+锻炼记忆+Python诗句填空小程序上线啦)

前言 岁岁年龄岁岁心,不负时光不负卿 哈喽!我是你们的栗子同学,今天给大家来点儿有趣的—— 有句话说:“读史使人明智,读诗使人灵秀。”唐诗本来就是中国文化的绚丽瑰宝,是每个人都 该学习的人生必修课。…

蚂蚁三面遭分布式血虐,意外收获史诗级分布式笔记手册,从基础到进阶收获满满

学习分布式系统设计的难题在于,这个过程存在一个环境障碍,工作中只有一些中大规模的互联网企业,才有开发大规模分布式系统的场景和需求。这就造成目前只有少数身在一线互联网公司的架构师和开发者,才有机会接触并掌握分布式系统设…

Spring Security入门学习

认识Spring Security Spring Security 是为基于 Spring 的应用程序提供声明式安全保护的安全性框架。Spring Security 提供了完整的安全性解决方案,它能够在 Web 请求级别和方法调用级别处理身份认证和授权。因为基于 Spring 框架,所以 Spring Security…

树莓派Pico开发板与大功率MOSFET/IGBT器件驱动控制24V直流电机技术实践

摘要:本文在介绍MOSFET器件和IGBT器件作为电子开关基本原理的基础上,讲述了Pico与MOSFET&IGBT器件驱动控制24V直流电机硬件接口技术,最后给出了Pico开发板GP15端口控制24V直流电机启停的MicroPython测试程序。 一、实验设备和元器件清单 …

[附源码]Nodejs计算机毕业设计基于Java的智慧停车软件Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置: Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术: Express框架 Node.js Vue 等等组成,B/S模式 Vscode管理前后端分…

React 入门:实战案例 TodoList 对组件的 props 进行限制

文章目录安装 prop-types 库给组件的 props 添加限制给 Header 组件添加限制给 List 组件添加限制给 Item 组件添加限制验证 props 限制完整代码Header 组件完整代码List 组件完整代码Item 组件完整代码本文实现对组件的 props 进行属性的类型和必要性的限制。为什么要对 props…