数据库原理及 MySQL 应用 | 视图
视图是关系数据库系统提供给用户以多种角度观察数据库中数据的重要机制,透过视图用户可以看到数据表中看书需要的内容。
视图(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 不存在,则系统忽略此操作。
版权声明: 本文为 InfoQ 作者【TiAmo】的原创文章。
原文链接:【http://xie.infoq.cn/article/46a3f31dd66781c2c45cfeb0c】。文章转载请联系作者。
评论