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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用版 2核4GB 50GB
简介: 视图是关系数据库系统提供给用户以多种角度观察数据库中数据的重要机制,透过视图用户可以看到数据表中看书需要的内容。

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

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

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

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

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

● 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,然后查询视图。
image.png
执行结果如图7-29所示。
image.png
■ 图7-29创建单表视图

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

【例7-58】在图书销售数据库booksale中,由图书表books和订单项目表orderitems创建出显示订单编号orderid、书名title、单价unitprice和销售价格price的视图v_booksprice,然后查询视图。
image.png
booksale.v_booksprice表示在booksale数据库中创建名为v_booksprice的视图。通过视图可以简洁地把多个数据表的数据进行连接查询。SELECT语句中因为两个价格不好区分,为了方便用户查看,给两个价格设置了别名。检查为LOCAL,更新视图只需要满足该视图本身定义的条件即可。

【例7-59】在图书销售数据库booksale中,由顾客表customers、订单表orders和订单项目表orderitems创建出显示顾客姓名、累计订购数量和平均销售价格的视图v_salebooks,然后查询视图。
image.png
视图中的SELECT语句不仅仅局限于简单查询,也适用于复杂查询。该例使用了分组查询,输出列采用聚合函数。采用聚合函数的列如果不起别名,显示输出为聚合函数,为了方便用户查看,定义了视图输出的列名。例7-58中设置别名的位置和例7-59中设置别名的位置效果是一样的,大家选择适合自己的即可。

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

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

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

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

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

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

SHOW TABLES语句不仅可以查看数据库中有哪些数据表,还可以查看有哪些视图。SHOW TABLES语句的基本语法格式如下所示。
image.png
语法说明:db_name是要查看表和视图所在的数据库的名称。

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

image.png

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

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

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

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

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

  1. 在VIEWS表中查看视图

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

【例7-63】在图书销售数据库booksale中,查看视图v_salebooks的定义。
image.png
视图执行的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,然后查询视图。
image.png
booksale.v_salebooks表示在booksale数据库中创建名为v_salebooks的视图。由于视图v_salebooks在booksale数据库中已经存在,使用OR REPLACE参数来替换已经创建的同名视图,原视图系统会自动删除。通过视图可以简洁地把四个数据表的数据进行连接查询,连接条件采用了两种方式,效果一致。

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

修改视图的基本语法格式如下所示。
image.png
语法说明:所有关键字和参数同创建视图的语法保持一致。

【例7-65】在图书销售数据库booksale中,修改视图v_partbooks,在原有计算机类图书信息的基础上再添加上生活类的图书信息,然后查询视图。
image.png
04、查询视图
MySQL允许用户采用操作表的方法操作视图,即对视图进行SELECT、UPDATE、INSERT、DELETE操作。但由于视图只是虚表,并不存储数据,因此通过视图操作数据将被转换为对基表进行数据操作。

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

【例7-66】在图书销售数据库booksale中,查看视图v_partbooks。
image.png
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,插入一条图书信息,然后查询视图。
image.png
插入失败。这里插入数据的ctgcode列的值为'fiction',违反了WITH CHECK OPTION的条件,必须是'computer'或'life'类图书才能插入成功。

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

【例7-68】在图书销售数据库booksale中,利用视图v_partbooks,更新一本图书信息,然后查询视图。
image.png
【例7-69】在图书销售数据库booksale中,利用视图v_booksprice,将订单编号为1的订单的销售价格调整为单价打七折的价格,然后查询视图。
image.png
当视图数据来自多个基表时,每次更新操作只能更新一个基表中的数据。因v_booksprice视图输出的列名是指定的,故SET子句中列名应该使用指定名,若仍使用基表中的原列名,系统将报错。

【例7-70】在图书销售数据库booksale中,利用视图v_booksprice,删除订单编号为1的订单。
image.png
删除失败,因为视图v_booksprice涉及两张表。

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

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

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

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

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

RESTRICT | CASCADED是可选选项。CASCADE是自动删除依赖此视图的对象(例如其他视图)。RESTRICT是如果有依赖对象存在,则拒绝删除此视图,此项是默认选项。
【例7-72】在图书销售数据库booksale中,删除视图v_partbooks和视图v_salesbooks,然后查看视图列表。
image.png
因为视图v_salesbooks不存在,故系统报错,指出无法删除的视图名称,且该命令无法完成删除。

修改代码,如下所示。
image.png
视图v_partbooks存在,则该视图被删除;视图v_salesbooks不存在,则系统忽略此操作。

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
18小时前
|
SQL 算法 关系型数据库
|
1天前
|
NoSQL Java MongoDB
如何在Spring Boot应用中集成MongoDB数据库
如何在Spring Boot应用中集成MongoDB数据库
|
1天前
|
关系型数据库 MySQL 数据库
深入OceanBase分布式数据库:MySQL 模式下的 SQL 基本操作
深入OceanBase分布式数据库:MySQL 模式下的 SQL 基本操作
|
1天前
|
关系型数据库 MySQL 数据挖掘
MySQL窗口函数:原理和使用
MySQL窗口函数:原理和使用
|
1天前
|
存储 SQL 关系型数据库
MySQL索引下推:原理与实践
MySQL索引下推:原理与实践
|
1天前
|
存储 关系型数据库 MySQL
MySQL Doublewrite Buffer(双写缓冲区)深入解析:原理及作用
MySQL Doublewrite Buffer(双写缓冲区)深入解析:原理及作用
|
1天前
|
存储 关系型数据库 MySQL
MySQL Change Buffer 深入解析:概念、原理及使用
MySQL Change Buffer 深入解析:概念、原理及使用
MySQL Change Buffer 深入解析:概念、原理及使用
|
1天前
|
缓存 关系型数据库 MySQL
MySQL Buffer Pool 解析:原理、组成及作用
MySQL Buffer Pool 解析:原理、组成及作用
|
1天前
|
存储 缓存 关系型数据库
心得经验总结:理解MySQL——并行数据库与分区(Partion)
心得经验总结:理解MySQL——并行数据库与分区(Partion)
|
1天前
|
关系型数据库 MySQL 程序员
老程序员分享:MySQL数据库企业级应用实践
老程序员分享:MySQL数据库企业级应用实践

热门文章

最新文章