第七 视图及其用途

  视图是从一个或几个基本表导出来的表,它实际上是一个查询结果。它就像一个透镜,我们可以从不同的角度不同的镜片对实物(基本表)进行透视,从而让我们看到我们想看到的部分与效果。

7.1视图的概述

7.1.1视图的概述

视图由视图名和视图定义组成。

视图是一个虚拟表,并不表示任何物理数据,只是用来查看数据的窗口而已,它是从一个或几个表导出来的表,它实际上是一个查询结果。


7.1.2使用视图的优点与缺点
1.使用视图的优点
(1)数据保密。
(2)简化查询操作。
(3)保证数据的逻辑独立性.

2.使用视图的缺点

   当更新视图的数据时,实际上是对基本表的数据进行更新。然而,某些视图是不能更新数据的。

7.2视图的创建

1.创建视图

创建视图基本语法:
CREATE VIEW view_name
[WITH ENCRYPTION]
AS
Select_statement

其中:WITH ENCRYPTION子句对视图进行加密。

例1 在book1中创建名为v_book1的视图。在视图中查看book1表中“出版社”=“长安”的书的信息。

use book
go
create view v_book1
as
select *
from book1
where 出版社='中国长安'

通过查询语句来检查视图的创建结果
use book
select *
from v_book1

例2 视图中只显示book2的“书名”与“定价”
use book
go
create view v_book2
as
select 书名,定价
from book2

例3,多个基本表连接组成查询的视图
use book
go
create view v_book1_t
as
select book1.书名,book1.定价,teacher.作者姓名
from book1,teacher
where book1.编号=teacher

查看视图内容结果:
use book
select *
from v_book1_t

例3 基本表的统计汇总
use book
go
create view v_bookbycbs
as
select 出版社,count(*) 出版总数 #出版总数为列名,count(*)出来的数据为它的数据#
from book1
group by 出版社

查看视图内容结果:
use book
select *
from v_bookbycbs

创建视图注意:
(1)不能将规则或者DEFAULT定义关联于视图。
(2)定义视图的查询中不能含有ORDER BY,COMPURER,COMPUTER BY子句和into关键字.


7.3视图的修改和删除

7.3.1 视图的修改
语法格式:

ALTER VIEW view_name
[WITH ENCRYPTION]
AS
Select_statement


例7 修改视图v_bookbycbs,使其能对“出社版社”分类汇总,对出社版出书本数计数,对每个出版社出书求和.
use book
go
alter view v_bookbvcbs
with encryption
as
select 出版社,count(*) 出版总数,sum(定价) 出版总价
from book1
group by 出版社


查看视图修改后查询的结果:
use book
select *
from v_bookbycbs

7.3.2视图的删除
例8 删除视图v_book1

use book
go
drop view v_book1

7.4重命名视图及显示视图的信息
 

7.4.1重命名视图

例10 将视图v_book1_t重新命名为v_book1_tea
 用SQL界面操作

7.4.2显示视图的信息

1.使用sp_helptext查看定义信息
 
例11 通过执行系统存储过程sp_helptext来查看视图v_book1_t的定义信息
use book
go
EXEC sp_helptext 'v_book1_t'

查看已加密的视图
use book
go
exec sp_helptext 'v_bookbycbs'

2.使用sp_depends获得视图对象的参照对象和字段

例12 查看v_bookbycbs的参照对象和字段
use book
go
exec sp_depends 'v_bookbycbs'


7.5视图的应用

1.通过视图查询数据

例13 查找视图v_book1_t中定价是59.8元的书名和作者姓名。
use book
go
select 书名,作者姓名
from v_book1_t
where 定价=59.8

此查询的执行过程是系统首先在数据字典中找到v_book1_t的定义,然后把此定义和用户的查询结合起来,转换成等价的对基本表book1的查询,这转换过程称为“视图消解“(view Resolution)

相当于执行以下查询命令:

use book
go
select 书名,作者姓名
from book1
where 定价=59.8 and book1.编号=teacher.编号

----------v_book1_t的内容,参考-----------------
use book
go
create view v_book1_t
as
select book1.书名,book1.定价,teacher.作者姓名
from book1,teacher
where book1.编号=teacher
-------------------------------------------------

2.通过视图更新数据

  通过视图“插入(INSERT),删除(DELETE)和修改(UPDATE)数据。对视图的更新操作也是通过消解转换为对表的更新操作。
  要防止用户通过视图对数据库修改,则对视图定义时要加上WITH CHECK OPTION子句。

1)插入(insert)

例14 向视图v_book2中插入一本书('硬件测试',50)

use book
go
insert into v_book2
values('硬件测试',50)


-------------v_book2的内容,供参考---------------
use book
go
create view v_book2
as
select 书名,定价
from book2
-------------------------------------------------
系统在执行语句时,首先从数据字典中找到视图v_book2的定义,然后把此定义和插入操作结合起来,转换成等价的对基本表book2的插入。

这个视图中只定义了 “书名”与“定价”,再结合insert ,就得到相当在“书名”与“定价”中插入“硬件测试”,50

验证是否更改成功
use book
go
select *
from book2
where 书名='硬件测试'

2>修改(UPDATE)和删除(DELETE)

跟以上操作雷同

注:在关系数据库中,并不是所有视图都是可更新的,因为有些视图的更新不能唯一的转换成对应表的更新。

例如,向视图v_book1_t中插入一条记录('硬件测试',50,'周奇奇')
use book
go
insert into v_book1_t
values('硬件测试',50,'周奇奇')


----------v_book1_t的内容,参考-----------------
use book
go
create view v_book1_t
as
select book1.书名,book1.定价,teacher.作者姓名
from book1,teacher
where book1.编号=teacher
-------------------------------------------------
其中,“硬件测试"和“50'是由book1表中对“书名”和“定价”得来的。而“周奇奇”是由teacher表中“作者姓名”得来的。这个SQL语句对视图的插入是无法转换成对book1表和teacher表的更新的,所以视图v_book_t是不可以插入更新的。