数据库原理之视图

        视图是从一个或多个表中导出来的虚拟表。这是因为视图返回的结果集的一般格式和由列和行组成的表相似,并且在SQL语句中引用视图的方式也与引用表的方式相同。

一、视图概述

        视图是从一个或多个基本表或视图中导出的虚拟表,是从现有基表中抽取若干子集组成用户的专用表,这种构造方式必须使用SQL中的 SELECT 语句实现。在定义一个视图时,只是把其定义放在数据库中,并不直接存储视图对应的数据,知道用户使用视图时采取查找对应的数据。

        使用视图具有如下优点:

        1.1 简化对数据的操作。视图可以简化用户操作数据的方式。可将经常使用的链接、投影、联合查询的选择查询定义为视图,这样在每次执行相同查询时,不必重写这些复杂的语句,只要一条简单的查询视图语句即可。视图可向用户隐藏表与表之间复杂的连接操作。

        1.2 自定义数据。视图能够让不同的用户不同方式看到不同或相同的数据集,即使不同水平的用户共用同一数据库时也是如此。

        1.3 数据集中显示。 视图使用户着重于其感兴趣的某些特定数据或所负责的特定任务,可以提高数据操作效率,同时增强了数据的安全性,因为用户只能看到视图内定义的数据,而不是基本表中的数据。

        1.4 导入和导出数据。 可以用视图将视图导入和导出。

        1.5 合并分割数据。 在某些情况下,由于表中数据量太大,在表的设计过程中可能经常对表进行水平分割或垂直分割,这样表结构的变化会对应用程序造成不良影响。使用视图就可以重新保持原有的数据关系,从而使外模式保持不变,原有的应用程序仍可以通过视图来重载数据。

        1.6 安全机制。 视图可以作为一种安全机制。通过视图,用户只能查看和修改他们能看到的数据。其他数据库或表既不可见也不可访问。

二、视图的创建

        使用 CREATE VIEW 语句创建视图,语法格式如下:

create view <视图名> as <select语句>;
语法说明如下:
<视图名>:指定视图的名称。该名称在数据库中必须是唯一的,不能与其他表或视图同名。
<SELECT语句>:指定创建视图的 SELECT 语句,可用于查询多个基础表或源视图。

        对于创建视图的 SELECT 语句有如下限制:

  • 用户除了拥有 CREATE VIEW 权限外,还具有操作中涉及的基础表和其他视图的相关权限。
  • SELECT 语句不能引用系统或用户变量。
  • SELECT 语句不能包含 FROM 子句中的子查询。
  • SELECT 语句不能引用预处理语句参数。

        2.1 创建基于单表的视图

表明 tb_students_info
字段 id | name   | dept_id | age  | sex  | height | login_date

        在 tb_students_info 表上创建一个名为 view_students_info 的视图,输入的 SQL 语句和执行结果如下所示。

create view view_students_info as select * from tb_students_info;

        默认情况下,创建的视图和基本表的字段是一样的,也可以通过指定视图字段的名称来创建视图。

        在 tb_students_info 表上创建一个名为 v_students_info 的视图,输入的 SQL 语句和执行结果如下所示。

create view v_students_info (s_id,s_name,d_id,s_age,s_sex,s_height,s_date) 
as select id,name,dept_id,age,sex,height,login_date from tb_students;

        view_students_info 和 v_students_info 两个视图中的字段名称不同。在使用视图时,可能用户不需要了解基本表的结构,更接触不到实际表中的数据,从而保证了数据库的安全。

        2.2 基于多表创建视图

create view 视图名(视图字段,视图字段,...) as
select 字段,字段,... from 表1,表2 where 表1.字段=表2.字段;

 三、视图的使用

        视图的使用主要包括视图的检索,以及通过视图对基础表进行插入、修改、删除操作。视图的检索几乎没有限制,但是通过视图实现表的插入、修改、删除操作则有一定的限制条件。

        3.1 使用视图进行检索

        视图的查询总是转换成对他的基础表的等价查询。

        3.2 通过视图修改数据

        视图也可以使用 INSERT 命令插入行,当执行 INSERT 命令时,实际上是向视图所引用的基础表插入行。

        如果视图中有下面所述属性,则插更新、删除操作将失效。

  • 视图定义中的 FROM 子句包含两个或多个表,且 SELECT 选择列表表达式中的列包含来自多个表的列。
  • 视图的列是从集合函数派生的。
  • 视图中的 SELECT 语句包含 GROUP BY 子句或 DISTINCT 选项。
  • 视图的列时从常量或表达式派生的。

        视图使用 DELETE 命令进行删除。

delete from 视图名 where 字段=条件:

四、视图的修改

        视图被创建之后,由于某种原因(如基本表中的列发生了改变,或需要在视图中增/减若干列等),需要对视图进行修改。

alter view 视图名 as select语句 with check option;

五、视图的删除

        视图创建之后,可以随时删除。当某个视图被另一个视图引用,当删除这个视图后,如果调用另一个视图,则会出现错误提示。因此,通常基于数据定义视图,而不是基于视图来定义视图。

drop view 视图名:

        DROP VIEW 命令可以删除多个视图,各视图之间用逗号隔离,删除视图必须有 DORP 权限。

结束!

posted @ 2020-07-08 16:30  aaronthon  阅读(1554)  评论(0编辑  收藏  举报