SQL Server(五)-视图

  与表一样,视图也是由字段和记录组成的,只是这些字段和记录来源于其他被引用的表或视图,所以视图并不是真实存在的,而是一张虚拟的表,视图中的数据并不是存在于视图中的,而是存在于被引用的数据表当中的。当被引用的数据表中的记录内容改变时,视图中的记录内容也会随之改变。
● 创建与使用视图
● 查看、修改与删除视图
● 通过视图操作数据表


1、 视图基础
  视图由一个预定义的查询(SELECT语句)组成,可以像基本表一样用于SELECT语句中。如果视图满足一定条件,还可以用在INSERT、UPDATE和DELETE语句中。
【例1】查询“邓小平理论”考试成绩大于等于90的学生的学号、姓名、所属院系和考试成绩。
分析:“邓小平理论”是course表中“课程名称”(cname)字段的值,考试成绩是score表中“考试成绩”(exam)字段的值,而学号、姓名和院系是stu_info表中存放的数据。因此要想得到本例要求的结果,则必须对course、score和stu_info三个表进行连接查询。

SELECT st.sno, st.sname , st.depart,s.exam
FROM  stu_info st,course c,score s
WHERE  c.cname ='邓小平理论'
AND s.exam >=90
AND st.sno =s.sno
AND c.cno = s.cno

视图里存放了SELECT语句而并非是查询结果。每次在SQL语句中使用视图,其实就是在执行视图内存放的SELECT语句,因此通过视图总能够得到最新的数据。
【例2】定义一个视图vwA,将上例的SELECT语句存放到该视图内。

CREATE VIEW  vwA
AS
SELECT st.sno,st.sname ,st.depart,s.exam
FROM  stu_info st,course c,score s
WHERE  c.cname = '邓小平理论'
AND s.exam >= 90
AND st.sno = s.sno
AND c.cno = s.cno

运行上面的语句,并在左侧【对象资源管理器】的目录树中展开【test】|【视图】,就会看到dbo.vwA视图已经被成功创建
【例3】在视图vwA上运行一个简单查询。

SELECT  *
FROM  vwA

注意:调用视图要考虑效率的损耗。例如,执行SELECT * FROM vw1时,实际上执行了两个SELECT语句。一个是该语句本身,另外一个是视图中存放的复杂连接的SELECT语句。
2、 视图的创建
(1) 在SSMS中创建视图(略)
(2) 使用CREATE VIEW语句创建视图

 

CREATE VIEW  视图名称 [(字段1,字段2…)]
AS
SELECT查询语句
[WITH CHECK OPTION]


其中,必须提供视图名称,视图名称后的[(字段1,字段2…)]为可选项,如果不提供字段名,则隐含视图由SELECT子句中列出的各字段组成。但在下列三种情况下必须明确指定组成视图的所有字段名。
SELECT子句中的某个列不是单纯的字段,而是集合函数或表达式。
● 多表连接时选出了几个同名字段,作为视图的字段。
● 需要在视图中为某个字段设置更合适的新名字。

注意:如果提供视图的字段名,则必须全部提供,不能只提供一部分。

【例5】创建视图vw_ boy,它用于将表stu_info中全部男生的信息显示出来。并使用视图vw_boy查询国际交流学院的男生。

CREATE VIEW  vw_boy
AS
SELECT  *
FROM  stu_info
WHERE  sex = '男'

下面的语句用来显示国际交流学院的男生。

SELECT  *
FROM  vw_boy
WHERE  depart='国际交流学院'

(3) 用别名命名视图字段
【例6】创建视图vw_ boy1,用于将表stu_info中全部男生的信息显示出来,并给相应字段设置中文别名。
 

CREATE VIEW  vw_boy1(学号,姓名,性别,出生日期,电子信箱,手机号码,所属院系)
AS
SELECT  *
FROM  stu_info
WHERE  sex='男'

(4) 创建视图时的注意事项
在用CREATE VIEW创建视图时,SELECT子句里不能包括以下内容:
COMPUTE、COMPUTE BY子句
● ORDER BY子句,除非在SELECT子句里有TOP关键字
● OPTION子句
● INTO关键字
● 临时表或表变量

【例7】创建视图vw_ boy2,用于将表stu_info中全部男生的信息显示出来,并根据出生日期升序排序。
 

CREATE VIEW  vw_boy2
AS
SELECT  *
FROM  stu_info
WHERE  sex='男'
ORDER BY birth


消息 1033,级别 15,状态 1,过程vw_boy2,第 6 行
除非另外还指定了TOP或FOR XML,否则,ORDER BY子句在视图、内联函数、派生表、子查询和公用表表达式中无效。
所以上述代码出现了错误。要想完成本例要求,应该使用下面的代码。

CREATE VIEW  vw_boy2
AS
SELECT  *
FROM  stu_info
WHERE  sex='男'
GO
SELECT *
FROM vw_boy2
ORDER BY birth
GO

(5) 创建加密视图
在SQL Server 2008中每个数据库的系统视图里都有一个名为“INFORMATION_SCHEMA.VIEWS”的视图,该视图里记录了该数据库中所有视图的信息,使用如下查询语句可以查看该视图内容。

SELECT *
FROM INFORMATION_SCHEMA.VIEWS

从查询结果中可以轻松地看到每个视图的定义语句,有时这会给用户带来不安全因素。如果不想让别人看到视图里的内容,可以使用with encryption参数为视图加密。
【例8】创建加密视图vw_girl,用于显示表stu_info中全部女生的信息,之后查看INFORMATION_SCHEMA.VIEWS的内容。
 

CREATE VIEW  vw_girl
WITH ENCRYPTION
AS
SELECT  *
FROM  stu_info
WHERE  sex='女'
GO
SELECT *
FROM INFORMATION_SCHEMA.VIEWS
GO

结果为vw_girl视图的定义为“NULL”,这样就可避免vw_girl视图的定义语句被其他人看到。

3 、操作视图
(1) 用ALTER VIEW修改视图
使用SQL语句的ALTER VIEW可以修改视图,其语法格式如下所示。

ALTER VIEW  视图名称 [(字段1,字段2…)]
AS
SELECT查询语句
[WITH CHECK OPTION]

【例11】修改视图vwA,使其能够查询“邓小平理论”考试成绩大于等于95的学生的学号、姓名、所属院系和考试成绩。
 

ALTER VIEW  vwA
AS
SELECT st.sno, st.sname , st.depart,s.exam
FROM  stu_info st,course c,score s
WHERE  c.cname = '邓小平理论'
AND s.exam >= 95
AND st.sno = s.sno
AND c.cno = s.cno
GO
SELECT *
FROM vwA
GO

所谓操作视图数据,其实是通过视图在操作其基表的数据而已

(2) 使用INSERT语句插入数据
【例12】通过vw_boy视图向stu_info表插入学生信息。


INSERT INTO vw_boy
VALUES ('0018','蒋十九','男','1988-05-29',NULL,NULL,'计算机系')
GO
SELECT *
FROM vw_boy
GO

(3 )使用UPDATE语句更新数据
在视图上使用UPDATE语句也可以更新基表的数据。并不是所有视图都能够更新数据,以下几种视图不能用于更新。
表值函数返回的结果只有在某些情况下才能更新。
● 如果查询或视图所包括的列来自多个表或视图,则不能更新这些查询或视图。
● 不能更新使用GROUP BY或DISTINCT子句的查询或视图。
● 不能更新存储过程返回的结果。

【例13】通过视图vw_boy将学生“周伦杰”的院系更新为“外语系”。
 

UPDATE  vw_boy
SET     depart='外语系'
WHERE  sname='周伦杰'
GO
SELECT  *
FROM   vw_boy
GO

(4) 使用DELETE语句删除数据

DELETE FROM  vw_boy
WHERE      sname = '张三'

(5)使用DROP VIEW语句删除视图

DROP VIEW  视图名称

猜你喜欢

转载自blog.csdn.net/qq_37503890/article/details/88606663
今日推荐