视图是从一个或多个表中导出来的虚拟表。这是因为视图返回的结果集的一般格式和由列和行组成的表相似,并且在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 权限。
结束!