MySQL 视图

一. 视图概述

视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。
对其中所引用的基础表来说,视图的作用类似于筛选。定义视图的筛选可以来自当前或其它数据库的一个或多个表,或者其它视图。通过视图进行查询没有任何限制,通过它们进行数据修改时的限制也很少。
视图是存储在数据库中的查询的SQL 语句,它主要出于两种原因:安全原因, 视图可以隐藏一些数据,如:社会保险基金表,可以用视图只显示姓名,地址,而不显示社会保险号和工资数等,另一原因是可使复杂的查询易于理解和使用。这个视图就像一个“窗口”,从中只能看到你想看的数据列。这意味着你可以在这个视图上使用SELECT *,而你看到的将是你在视图定义里给出的那些数据列:

既然视图的定义是基于基本表的,哪为什么还要定义视图呢?这是因为合理地使用视图能够带来许多好处:

 

二.视图好处

1、方便操作,特别是查询操作,减少复杂的SQL语句,增强可读性;

视图机制使用户可以将注意力集中在所关心地数据上。如果这些数据不是直接来自基本表,则可以通过定义视图,使数据库看起来结构简单、清晰,并且可以简化用户的的数据查询操作。例如,那些定义了若干张表连接的视图,就将表与表之间的连接操作对用户隐藏起来了。换句话说,用户所作的只是对一个虚表的简单查询,而这个虚表是怎样得来的,用户无需了解。

如果要获取user的name和goods的name。就应该使用以下sql语句

select a.name as username, b.name as goodsname from user as a, goods as b, ug as c where a.id=c.userid and c.goodsid=b.id;

 

但有了视图就不一样了,创建视图other。

 create view other as select a.name as username, b.name as goodsname from user as a, goods as b, ug as c where a.id=c.userid and c.goodsid=b.id;

 

创建好视图后,就可以这样获取user的name和goods的name。

select * from other;

 

以上sql语句,就能获取user的name和goods的name了。尤其是当连接(left join等)多张表时(比如同时连接7张表),使用视图就能更简便。

 

2、 对数据库重构,却不影响程序的运行。

假如因为某种需求,需要将user拆分成表usera和表userb,该两张表的结构如下:

测试表:usera有id,name,age字段
测试表:userb有id,name,sex字段

删掉原user表,创建视图。以下sql语句创建视图:

create view user as select a.name,a.age,b.sex from usera as a, userb as b where a.name=b.name;

 


以上假设name都是唯一的。此时使用sql语句:select * from user;就不会报错什么的。这就实现了更改数据库结构,不更改脚本程序的功能了。

 

而且,如果系统中有一张旧的表,这张表由于设计的问题,即将被废弃。然而,很多应用都是基于这张表,不易修改。这时就可以建立一张视图,视图中的数据直接映射到新建的表。这样,就可以少做很多改动,也达到了升级数据表的目的。

 

3、提高了安全性能。可以对不同的用户,设定不同的视图。

一些数据表有着重要的信息。有些字段是保密的,不能让用户直接看到。这时就可以创建一个视图,在这张视图中只保留一部分字段。这样,用户就可以查询自己需要的字段,不能查看保密的字段。

例如:某用户只能获取user表的name和age数据,不能获取sex数据。则可以这样创建视图。示例如下:

create view other as select a.name, a.age from user as a;


这样的话,使用sql语句:select * from other; 最多就只能获取name和age的数据,其他的数据就获取不了了。

 

三、总结

视图不能提高查询速度,只能简化查询

 

posted @ 2017-08-29 11:38  半马  阅读(158)  评论(0编辑  收藏  举报