视图(View)是指计算机数据库中一种常用的数据库对象,它由多个字段列和数据行构成。视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。视图具有简单性、安全性、逻辑独立性的基本特性。
不同的数据库中,视图的分类也不同,SQL server中视图一般可分为标准视图、索引视图、分区视图,在Oracle数据库中视图一般分为关系视图、内嵌视图、对象视图和物化视图。视图可以简化数据操作、共享所需数据等,但视图本身也存在一定的缺点,例如在复杂视图中,视图的数据来源很广泛,增加了管理复杂度;在执行视图查询时,执行效率比直接访问物理数据表要差等。
在具体操作上,用户可基于数据库管理系统对视图进行创建、查询、更新、删除等操作,还可以通过对视图的属性进行设置,优化视图的性能。在权限管理中,可以通过视图的对象权限和语句权限设置来进行权限管理。视图与数据表的差异在于视图没有实际的物理记录,仅作为数据的窗口,而表则是内容;此外视图的建立和删除只影响视图本身,不影响对应的基本表等。
概述
定义
视图(View)作为一个逻辑上的表存在,其数据来源于一个或多个真实表的查询,即视图所对应的数据不进行实际存储,数据库中只存储视图的定义,对视图的数据进行操作时,系统根据视图的定义去操作与视图相关联的基本表。视图一经定义,就可以像表一样被查询、修改、删除和更新。
作用
视图的主要作用包括四方面,其具体概述如下。
数据安全保护:视图的安全性表现在设计数据库应用系统时,对不同的用户定义不同的视图,使机密数据不出现在不应看到这些数据的用户视图上,保证了对机密数据的安全保护。
简化用户操作:视图不仅可以简化用户对数据的理解,也可以简化它们的操作,那些被经常使用的查询可以被定义为视图,从而使得用户不必为以后的操作每次指定全部的条件。
自定义访问:视图可以使不同用户通过不同途径看到相同的数据。它允许用户根据自己的需求自定义访问数据的方法。
逻辑数据独立性:视图可以使应用程序和数据库表在一定程度上独立。如果没有视图,应用一定是建立在表上的,有了视图之后,程序可以建立在视图之上,从而程序与数据库表被视图分割开。它的独立性分为物理独立性和逻辑独立性,物理独立性是指用户和用户程序不依赖于数据库的物理结构,逻辑独立性是指当数据库重构造时,如增加新的关系或对原有关系增加新的字段等,用户和用户程序不会受影响。
视图类型
视图的类型根据数据库不同其分类也存在一定的差异,例如在SQL server中一般分为标准视图、索引视图、分区视图以及关系视图。在Oracle数据库中视图一般分为关系视图、内嵌视图、对象视图和物化视图。
SQL server
SQL server中分为标准视图、索引视图、分区视图以及关系视图。
标准视图
标准视图是通常情况下的视图,它选取了来自一个或多个数据库中一个或多个表以及视图中的数据,在数据库中仅保存其定义,在使用视图时系统才会根据视图的定义生成记录。
索引视图
索引视图是被物理化的视图,它包含经过计算的物理数据。索引视图在数据库中不仅保存其定义,而且生成的记录也被保存,还可以创建唯一聚集索引。使用索引视图可以加快查询速度,从而提高查询性能。
分区视图
分区视图是将一个或多个数据库的一组表中的记录抽取并合并。通过使用分区视图可以连接一台或者多台服务器成员表中的分区数据,使得这些数据看起来就像来自同一个表一样。分区视图的作用是将大量的记录按地域分开存储,使得数据安全和处理性能得到提高。
系统视图
系统视图公开了目录元数据,用户可以使用系统视图与SQL Server实例或在该实例中定义对象有关的信息。SQL Server提供的公开元数据的系统视图集合包括目录视图、兼容性视图、信息架构视图、复制视图等。
Oracle
在Oracle数据库中视图分为关系视图、内嵌视图、对象视图和物化视图。
关系视图
关系视图又称普通视图、标准试图,在Oracle中视图是作为数据库对象存在的,因此,创建之后也可以通过工具或数据字典来查看视图的相关信息,其可以通过CREATE VIEW命令进行创建。
内嵌视图
内嵌视图是在使用SQL编写查询时,临时构建的一个嵌入式的视图。内嵌视图不属于任何用户,也不是对象,内嵌视图是子查询的一种,可以与数据表、视图一样作为查询语句的数据源存在,其不必使用CREATE VIEW命令进行创建。
对象视图
对象视图一般是在应用程序开发完成后,需要满足新的对象类型,利用Oracle数据库内置视图user_views可以获得对象视图相关信息。Oracle中的对象数据试剂仍以关系数据的形式存储,但是对象的特性,例如继承、封装等使得其处理形式更加灵活。
物化视图
物化视图不是传统意义上虚拟视图,是实体化视图,和表一样可以存储数据。查询数据,常用于数据库的容灾。主备数据库数据同步通过物化视图实现,主备数据库通过数据 link连接,在主备数据库物化视图进行数据复制。
创建视图
创建视图是指在已经存在的数据库上建立视图。视图可以建立在一张表中,也可以建立在多张表中。创建视图使用CREATE VIEW语句,前提是保证自己已被数据库所有者授予使用该语句的权限,并且有权操作视图所涉及的表或其他视图。
在不同的数据库管理系统中,其视图相关的语法也可能存在差异,后面以MySQL为例,创建视图的语法格式如下:
<视图名>:指定创建的视图名称。
修改视图
修改视图是指修改数据库中已存在的视图,当基本表的某些字段发生变化时,可以通过修改视图来保持与基本表的一致性。修改视图使用ALTER VIEW语句,语法格式如下:
<视图名>:指定要修改的视图名称。该名称在数据库中必须是唯一的,不能与其他表或视图同名;
删除视图
删除视图是指删除数据库中已存在的视图,删除视图时,只删除视图的定义,不会删除数据,也就是不会影响基本数据表。删除视图用DROP VIEW语句,语法格式如下:
<视图名>:指定要删除的视图名称;
查询视图
当创建一个视图后,可以使用SELECT语句对视图进行查询,就像查询数据表一样,这也是视图的最基本应用之一。DBMS(数据库管理系统)执行对视图的查询时,首先进行有效性检查,检查查询的表、视图等是否存在。如果存在,则从数据字典中取出视图的定义,把定义中的子查询和用户查询结合起来,转换成等价的对基本表的查询,然后再执行修正了的查询。查询user_views或dba_views表时,其语法格式如下:
更新视图
更新视图是指通过视图进行数据的插入、修改和删除操作。由于视图是不实际存储数据的虚表,因此对视图的更新最终都要转换为对基本表的更新。
插入数据
插入数据通过INSERT语句进行操作,对于建立在多张基表基础上的视图,一个插入操作只能作用于一个基表上。其语法格式如下:
修改数据
修改数据使用UPDATE语句进行视图更新,但当视图是基于多个表创建时,那么修改数据只能修改一个表中的数据。其语法格式如下:
删除数据
通过使用DELETE语句可以将视图中的数据删除。但如果一个视图建立在多张基表上时,不允许删除。其语法格式如下:
更新限制
视图通常包括单表视图、多表视图以及包含聚合函数的视图。在所有的视图中,只有包含主键列的单表视图是可更新视图,而其他不含主键列的视图、基于多表创建的视图,或者基于某列的聚合函数创建的视图都是不可更新的视图。对于不可更新的视图,可以为视图创建替代触发器,以达到通过视图来修改表数据的目的。
与数据表的区别
数据表是存储数据的实体,在数据库中,任何数据均必须在一个数据表中。视图与数据表的区别在于:
优缺点
优点
使用视图不仅可以保障数据安全性,而且提高查询数据的效率。
缺点
虽然使用视图有不少的优点,但也存在一定的缺点,其缺点包括:
优化视图
通过设置视图属性,可以优化视图性能,其具体方法如下:
控制递进式获取信息量的大小:通过使用和活动视图临时表的FetchSize属性,可以控制递增地从远程数据源所取的数据量数量。
控制备注字段的获取:通过数据库中延迟获取备注字段的功能,可以加速视图数据的检索。
设置最大下载记录数:通过设置属性可以控制打开视图时下载的数据量,可以通过函数指定从远程结果集合取入视图的最大行数。
优化过滤器和连接:评估连接和过滤器子句的顺序,可以优化视图或查询。
控制连接结果:如果连接的执行计划不符合指定要求,可强行使连接完全按缩写的执行,而不做处理器优化。
共享多个远程视图的连接:通过共享连接,可以使一个活动连接成为多个远程视图的信息通道,它可以减少在远程服务器上的连接数,对于根据连接数目进行收费的服务器系统,可以降低费用。
测试连接是否忙:当发生连接繁忙时,为了避免同一连接上开始另外一个取数据操作或发送更新信息,可以通过ConnectBusy属性来检验一个连接是否繁忙。
避免过度规范化:过度规范化是指用了大量的、小的、相互关联的表来定义数据库。在数据库对这些表中的数据进行处理时,必须执行大量的额外工作以组合相关的数据。这种额外处理可能降低数据库的性能。在这种情况下,适当降低数据库规范化程度以简化复杂处理可以提高性能。
索引优化:数据库优化时首先要对索引进行优化,由于索引的优化不需要对表结构进行任何改动,是最简单的一种,同时又不需要改动程序就可能大幅提升性能。
权限管理
在对数据库中视图的权限管理中,其主要是指对象权限和语句权限的设置,以SQL Server为例,对权限的管理包括授予权限、回收权限、拒绝权限三种,其中授予权限(GRANT)允许用户或角色具有某种权利;回收权限(DENY)是指删除以前数据库内的用户授予或拒绝的权限;拒绝权限(REVOKE)是指拒绝给当前数据内的安全账户授予权限并防止安全账户通过其组或角色成员继承权限。
对象权限
对象权限是授予数据库用户对数据库中的表、视图和存储过程等对象的操作权。
语句权限
语句权限授予用户执行相应的命令的能力,例如创建对象、删除对象和数据库备份等。
拒绝权限的代码格式如下:
不同数据库管理系统
MySQL视图
MySQL是一种开源代码的关系数据库管理系统,是由最常用的数据库管理语言SQL进行数据库管理,在内部提供了C、C++、Java等多种编程语言的编程接口,具有速度快、可靠性高和适应性强的优点。
在MySQL中,视图是从一个或多个表中导出的表,是虚拟存在的,可以通过该视图看到系统专门提供的数据,既方便了用户操作,又保障了数据库系统的安全。
在MySQL中可以使用CREATE VIEW语句创建视图,其语法格式如下:
PostgreSQL视图
PostgreSQL是一个开源的、社区驱动的对象关系型数据库管理系统,它不仅支持关系数据库的各种功能,而且还具备类、继承等对象数据库特征。其支持视图、事物、SQL查询、外键等多种数据库功能。PostgreSQL视图只建在表上,不能建在其他视图上,PostgreSQL视图永远是只读的,不能对基表进行数据修改。
在PostgreSQL中视图是通过SELECT规则来实现的,创建视图的命令如下:
Oracle视图
Oracle数据库系统是一款以分布式数据库为核心的软件产品,它是目前世界上使用非常广泛的数据库管理系统,作为一个通用的数据库系统,它具有完整的数据管理功能;作为一个关系数据库,它是一个具有完备关系的产品;作为分布式数据库系统,它实现了分布式处理功能。
Oracle数据库的视图原理与照相机取相框的原理相同,它是一种覆盖在一个或多个表上的虚框,用来变换用户在访问某一数据时所看到的图像,视图可以通过从一个较大的表中挑选栏目来创建,也可以用来限定从某一选择返回的数据的行数或类型。
Oracle视图中创建视图的命令如下:
应用实例
在实际应用中,视图的操作既可以通过数据库的窗口按钮来进行,也可以输入相关的指令来完成,下面以MySQL为例,举例介绍其增加、删除、修改视图的过程。
创建视图
当在数据库“EduSys”中,在表“Student”上创建一个名为“View Student”的视图,包括学生学号、姓名、出生日期等信息。输入的SQL如下:
语句执行结果为:
视图一旦创建完毕,就可以像普通数据表那样,用于执行数据操作。查看视图“View Student”的数据结果,输入的 SQL语句如下:
输出结果为:
查看视图
通过DESCRIBE语句查看视图“View_StuClass”的定义,输入SQL如下:
输出结果为:
使用SHOW CREATE VIEW语句可以查看视图的创建信息,语法格式如下:
修改视图
在数据库“EduSys”中,修改视图“View_Student_New”的定义,内容包括学生学号、姓名、性别、出生日期、地区等信息。输入的SQL语句如下:
语句执行结果为:
查看视图“View_Student_New”的结果,输入的SQL如下:
输出结果为:
删除视图
在数据库“EduSys”中,删除名为“View_Student_New”的视图,输入的SQL语句如下:
语句执行结果为:
使用SHOW CREATE VIEW命令查看视图“View_Student_New”的定义,输入的SQL如下:
语句执行结果为:
上述语句表示"View Student New"视图已不存在,删除成功。