第五章 视图的创建和使用
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第五章视图的创建和使用
5.1 视图概述
5.1.1 视图的基本概念
⏹视图是数据库中一个“不可见的表”,视图是一种基于表的关于数据库数据的查询,其内容由
查询的结果来定义。
⏹对于数据库用户来说,视图似乎是一个真实的表,它具有一组命名的数据列和行。但是,与
真实的表不同,在视图中没有存储任何数据,仅仅是一种较简单的访问数据库里其他表中数据的方式,因此称它为“虚表”。而数据的物理存储位置仍然在表中,这些表称作视图的基表。
⏹一个视图可以派生于一个或多个基表,也可以从其他视图中派生。视图只能建立在当前正在
使用的数据库中。
⏹视图被引用时,其数据是动态生成的。
⏹视图是一种SQL查询,在数据库中存储的是视图的定义,而不是查询的数据。
5.1.2 视图的用途
⏹视点集中:视图集中即是使用户只关心它感兴趣的某些特定数据和他们所负责的特定任务。
这样通过只允许用户看到视图中所定义的数据而不是视图引用表中的数据而提高了数据的安全性。
⏹简化操作:视图大大简化了用户对数据的操作。因为在定义视图时,若视图本身就是一个复
杂查询的结果集,这样在每一次执行相同的查询时,不必重新写这些复杂的查询语句,只要一条简单的查询视图语句即可。可见视图向用户隐藏了表与表之间的复杂的连接操作。
⏹定制数据:视图能够实现让不同的用户以不同的方式看到不同或相同的数据集。因此,当有
许多不同水平的用户共用同一数据库时,这显得极为重要。
⏹合并分割数据:在有些情况下,由于表中数据量太大,故在表的设计时常将表进行水平分割
或垂直分割,但表的结构的变化却对应用程序产生不良的影响。如果使用视图就可以重新保持原有的结构关系,从而使外模式保持不变,原有的应用程序仍可以通过视图来重载数据。
⏹安全性:视图可以作为一种安全机制。通过视图用户只能查看和修改他们所能看到的数据。
其它数据库或表既不可见也不可以访问。如果某一用户想要访问视图的结果集,必须授予其访问权限。视图所引用表的访问权限与视图权限的设置互不影响。
5.1.3 视图的缺点
⏹性能:对试图的查询,SQL Server必须转化成对基本表的查询,这时因为视图本身并不存储数据,其
中的数据来自它所引用的基表。如果这个视图是由一个复杂的多表查询所构成,那么,即使是对视图的一个简单查询,SQL也将把它变成一个复杂的结合体,这需要花费一定的时间。
⏹修改的限制:对视图进行修改,SQL必须把它转化为对与视图引用基表对应的数据修改。对于简单视
图来说,这是很方便的,但是,对于比较复杂的视图,可能是不可修改的。
5.2 创建视图
5.2.1 使用企业管理器创建视图
【案例5.1】在StudentInfo数据库中,创建一个名为asp_scores的视图,用于检索电子商务概论的成绩。
1)打开“StudentInfo”数据库的节点,右击“视图”节点。
2)选择“操作”,“新建视图”命令。
3)在视图设计器窗口中,单击工具栏上的“添加表”按钮。
4)在“表”、“视图”或“函数选项卡中,选择要添加到新视图中的表、视图或返回表的用户定义函数,并单击“添加”按钮,使之出现在关系图窗格中,然后单击“关闭”按钮。
5)若要使某列出现在视图的结果集内,请在关系图窗格中选取表列名称左边的复选框,或者在网格窗格中单击“列”单元格,然后从列表中选择在视图中引用的列。在本案例中,选择了Scores.StudentNo、Students.StudentName、Courses.CourseName以及Scores.Score列。
6)如果需要,请在网格窗体中单击“别名”单元个,并为列指明别名。
7)若要在视图中引用某列,但又不想让它出现在视图的结果集内,应在网格中清除“输入”列的复选框。
8)若要按某个列分组,请在网格窗格中单击该列,然后单击工具栏上“分组”按钮。设置分组后,在关系图窗格中相应列的右边会出现一个括号图标。
9)在准则列中,输入提取行时所使用的过滤条件,由此生成一个WHERE子句。如果已经指定按某个列分组,则生成一个HA VING子句。在某个列上设有过滤条件时,在关系表窗格中该列的右边会出现一个漏斗图标。
10)在“或”列中,输入提取行时所用的附加过滤条件,并用逻辑运算符OR连接到先前的条件表达式上。
11)若要设置视图的其他属性,请单击工具栏上的“属性”按钮,并加以设置。
12)当预览结果合乎需要时,单击工具栏上“保存”按钮。
5.2.2 使用CREATE VIEW语句创建视图
语法格式:
CREA TE VIEW <视图名> [(<列名>[,…, n])]
[WITH ENCRYPTION]
AS
SELECT 语句
[ WITH CHECK OPTION]
在上述语法中,SELECT语句不能引用临时表或表变量,页不能包含ORDER BY、COMPUTE BY子句或INTO 关键字。
WITH ENCRYPTION 表示SQL Server加密包含CREA TE VIEW语句文本的系统表列,使用该子句可以防止讲视图作为SQL Server复制的一部分发布。
WITH CHECK OPTION表示强制视图上执行的所有数据修改语句都必须符合由SELECT语句设置的准则。
在CREA TE VIEW语句中,列名用于指定视图中使用的列名称。只有在下列情况下,才有必要在CREA TE VIEW语句中指定列名。
1)某个列时来自于一个算术表达式、内置函数或常量。
2)由于在SELECT语句中连接了多个表、致使多个列具有相同的名称。
3)要给某个列指定一个不通榆基础表的列名。
别名也可以在SELECT语句中指定。
【案例5.2】在StudentInfo数据库中创建一个视图,用于检索0401班SQL SERVER2000数据库应用的成绩。
【方法要点】在视图定义中包含一个比较复杂的查询语句,然后通过视图检索数据。
代码如下:
USE StudentInfo
GO
CREA TE VIEW [0401class_database_scores] AS
SELECT sc.StudentNo AS 学号,StudentName AS 姓名,CourseName AS 课程,
Score AS 成绩
FROM Scores AS sc INNER JOIN Students AS st ON sc.StudentNo=st.StudentNo
INNER JOIN Courses AS co ON sc.CourseNo=co.CourseNo WHERE CourseName=‟ SQL SERVER2000数据库应用‟ AND Class=‟0401‟
GO
SELECT * FROM [0401class_database_scores]
GO
【案例5.3】在Nothwind数据库中创建一个视图,用于检索雇员信息,并使用中文列名来代基础表中的英文。
【方法要点】在试图定义中为列指定别名时,别名应放在视图后面的括号中。
代码如下:
USE Nothwind
GO
CREA TE VIEW employee_info ( 雇员编号、姓名、头衔、出生日期)
AS
SELECT EmployeeID, FirstName+SPACE(1)+LastName, Title, BirthDate
FROM Employee
GO
SELECT * FROM employee_info
GO
【案例5.4】在Nothwind数据库中创建一个名为employee_info_encryption的视图,要求试图定义进行加密处理。
【方法要点】欲对视图文本进行加密,在CREA TE VIEW语句中使用WITH ENCRYPTION子句即可。
代码如下:
USE Nothwind
GO
CREA TE VIEW employee_info_encryption (雇员编号、姓名、头衔、出生日期)
WITH ENCRYPTION
AS
SELECT EmployeeID, FirstName+SPACE(1)+LastName, Title, BirthDate
FROM Employee
GO