-
1 视图
-
2 索引
视图
视图的引入
为什么需要视图呢?让我们来考虑这样两种比较典型的情形:
1、多类用户均可访问的一张表存储了大量数据。每一类用户只对表中的一部分数据感兴趣,或者说只应该看到表中的一部分数据。比如对于学生表Students(id,name,...,dept),我们有这样的想法:各系的用户只能看到自己所在系的数据:
select * from Students where dept='计科系' //计科系用户可以看到的本系的数据
select * from Students where dept='电子系' //电子系用户可以看到的本系的数据
........
select * from Students where dept='机械系' //机械系用户可以看到的本系的数据
但实际的情况是,如果谁都可以直接访问Students这张表的话,那么以上出于安全性的考虑就很难实现。因为只需要修改一下查询条件就可以看到其他系的数据了。在这种情况下,表中所有的数据均暴露给了全部用户,不管这个用户该看到,还是不该看到!
2、用户需要的数据分散在不同的表中,需要通过频繁的多表连接来获取这些数据。对于用户来讲,这是一件很麻烦的事情。这种情况带来的问题就是用户使用数据很不方便。
因此,主要基于以上原因,提出了视图技术。通过视图更加直接地给用户提供他所真正需要的数据,保障数据的安全性和使用的方便性。
什么是视图
这里以第1种情况为例来说明:假设现在计科系的用户希望查询计科系的某些学生信息,那么整个学生表对于该用户而言,存在着不安全和不方便的情况。因为用户可能不该看某些数据,或者根本不想看自己不关心的数据。
如果我们不将整表直接呈现给用户,而是在之前执行一遍下述SQL语句:
select * from Students where dept='计科系'
将这条语句的执行结果呈现给用户,则数据会变得更加安全,因为我们将计科系以外的数据隐藏了起来;同时数据也变得更加利于使用,因为计科系的数据显然比全部数据要少得多。
所以,数据库将这样的SQL语句存储下来,当用户需要这些数据的时候,便将这条SQL拿出来执行一遍即可,那么这就是视图的由来。说的简单一点,视图就是存储在数据库中的SQL查询语句。
视图的特点
让我们先来理清几个概念:
1、基表(基本表):数据库中实际存在的表。
2、虚表
用户之所以可以看到视图中的数据,是因为我们提前执行了视图定义中的SQL查询语句,所以视图中的数据归根到底是从基表中导出来的部分数据。但是对于用户来说,他可能没有注意到这点,因为他们操作视图和操作基表的体验是一样的,所以对于用户来讲,视图也是表;但我们知道视图并不是真实存在的表,因此视图被称作虚表。
对于视图,我们需要理解和掌握以下的要点:
1、视图可以从基表中导出,也可以从其它视图导出;但归根到底,视图不能脱离基表而存在。
2、视图仅仅存储视图定义语句,并不会存储实际数据。因为视图就是从基表中导出的,所以相同的数据在基表中早已存在,没必要重复存储。
3、由于所有对基表的数据更新都限定在一张表中完成 ,因此对视图数据的更新也自然地受到了限制。当我们对视图中的数据进行更新时,必须要保证所更新的列在视图中存在,且均分布在同一张基表中。
SQL创建视图
CREATE VIEW 创建一个虚拟表,该表以另一种方式表示一个或多个表中的数据。
语法:
CREATE VIEW [ < database_name > .] [ < owner > .]
view_name [ ( column [ ,...n ] ) ] AS select_statement [ WITH CHECK OPTION ]
【例1】请创建视图wd_view,其中包括职工姓名、出生日期、参工日期和工作部门。
create view wd_view
as
select w.id wid,w.name,birthday,joinday,departID did,d.name depart
from workers w,depart d where w.departID=d.id
【例2】请基于视图wd_view创建视图wd_market,其中包括市场部的职工信息。
create view wd_market
as
select * from wd_view
where depart=‘市场部’ with check option
提醒:这里这条SQL语句加了选项:with check option,作用是当用户对本视图中的数据进行更新时,都必须强制确保数据满足where后面的条件,即不管是新增、修改数据都必须保证员工所在部门是市场部。
【例3】检索视图wd_view中所有姓孙的职工。
select * from wd_view where name like '孙%'
提醒:使用视图来检索数据,可以像对表一样。
SQL修改视图
语法:
ALTER VIEW [ < database_name > .] [ < owner > .]
view_name [ ( column [ ,...n ] ) ] AS select_statement [ WITH CHECK OPTION ]
修改视图和创建视图比较类似,不再赘述。
SQL删除视图
语法:
DROP VIEW [ < database_name > .] [ < owner > .] view_name
【例4】使用SQL删除视图wd_view。
use Factory
go
if exists(select table_name from information_schema.views where table_name='wd_view')
drop view wd_view
go
说明:
1、use Factory是用于指定目标数据库;
2、select table_name from information_schema.views where table_name='wd_view'是用于查询目标视图是否已经存在;其中information_schema.view是存储视图信息的系统表。

