您的位置:首页 > 数据库

SQL视图

2015-06-28 15:47 387 查看
视图:

一、视图的概念

视图是一个虚表;数据库中只存放视图的定义;视图对应的数据仍存放在原来的表中;随着表中数据的变化,视图的数据随之改变。

对视图的查询与基本表一样;对视图的更新将受到一定的限制。

二、视图分类

1.行列子集视图:从单个基本表导出,保留基本表的码,但去掉其它的某些列和部分行的视图。

2.表达式视图:带虚拟列的视图。

3.分组视图:子查询目标表带有组函数或子查询带有GROUP
BY子句的视图。

三、定义与修改视图

建立视图,其一般格式为:

CREATE
VIEW <视图名>[(<列名>[,<列名>]...)]
AS <子查询>[WITH
CHECK OPTION]

其中子查询可以是任意复杂的SELECT语句,但通常不允许含有ORDER
BY子句和DISTINCT短语。

WITH
CHECK OPTION表示对视图进行UPDATE、INSERT和DELETE操作时要保证更新、插入或删除的行满足视图定义中的谓词条件(即子查询中的条件表达式)。

如果CREATE
VIEW语句仅指定了视图名,省略了组成视图的各个属性列名,则隐含该视图由子查询中SELECT子句目标列中的诸字段组成。

在下列三种情况下必须明确指定组成视图的所有列名:

其中某个目标列不是单纯的属性名,而是集函数或列表达式;

多表连接时选出了几个同名列作为视图的字段;

需要在视图中为某个列启用新的更合适的名字; 

需要说明的是,组成视图的属性列名必须依照上面的原则,或者全部省略或者全部指定,没有第三种选择。

例: 建立电商系学生的视图 --- 行列子集视图

create view ec_student 

as select
sno , sname , age
from student where dept
= 'ec';

例: 建立电商学生的视图,并要求进行修改和插入操作时仍须保证该视图只有电商系的学生

create
view ec_student as
select sno,sname, age
from student where sdept='ec'
with check
option

insert
into ec_student (sno,sname,age,dept)
values ('2001','Rain Man',
20
, 'ec')

insert
into ec_student (sno,sname,age,dept)
values ('2001','Rain Man',
20
, '会计') /*
插入失败*/

视图不仅可以建立在单个基本表上,也可以建立在多个基本表上或者已定义好的视图。

例:建立电商系选修了号课程的学生的视图

create
view ec_s1(xh,xm,cj)

as

select student.sno,sname,score
from student,sc

where dept='ec'
and student.sno=sc.sno
and sc.cno='001'

带表达式的视图:

例:定义一个反映学生出生年份的视图

CREATE
VIEW BT_S(sno,sname,csnf)

as

select sno,sname,2005-age
from student

分组视图:带有集函数和GROUP
BY子句的查询

例:
将学生的学号及他的平均成绩定义为一个视图

CREATE
VIEW S_G(sno,avgscore)

AS

SELECT sno,
AVG(score)
FROM sc GROUP
BY sno

三、删除视图

DROP
VIEW <视图名>

一个视图被删除后,由此视图导出的其他视图也将失效,用户应该使用DROP
VIEW语句将他们一一删除。
四、关于更新的限制

并非所有的视图都可更新,有些视图的更新不能唯一地有意义地转换成对相应基本表的更新。

1、若视图是由两个以上基本表导出的,则此视图不允许更新。

2、若视图的字段来自字段表达式或常数,则不允许对此视图执行INSERT和UPDATE操作,但允许执行DELETE操作。

3、若视图的字段来自集函数,则此视图不允许更新。

4、若视图定义中含有GROUP
BY子句,则此视图不允许更新。

5、若视图定义中含有DISTINCT短语,则此视图不允许更新。
五、视图的作用

1、视图能够简化用户的操作

2、视图使用户能以多种角度看待同一数据

3、视图对重构数据库提供了一定程度的逻辑独立性

4、视图能够对机密数据提供安全保护
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: