当前位置:文档之家› 第五章 视图的创建和使用

第五章 视图的创建和使用

第五章视图的创建和使用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]ASSELECT 语句[ 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 StudentInfoGOCREA TE VIEW [0401class_database_scores] ASSELECT sc.StudentNo AS 学号,StudentName AS 姓名,CourseName AS 课程,Score AS 成绩FROM Scores AS sc INNER JOIN Students AS st ON sc.StudentNo=st.StudentNoINNER JOIN Courses AS co ON sc.CourseNo=co.CourseNo WHERE CourseName=‟ SQL SERVER2000数据库应用‟ AND Class=‟0401‟GOSELECT * FROM [0401class_database_scores]GO【案例5.3】在Nothwind数据库中创建一个视图,用于检索雇员信息,并使用中文列名来代基础表中的英文。

【方法要点】在试图定义中为列指定别名时,别名应放在视图后面的括号中。

代码如下:USE NothwindGOCREA TE VIEW employee_info ( 雇员编号、姓名、头衔、出生日期)ASSELECT EmployeeID, FirstName+SPACE(1)+LastName, Title, BirthDateFROM EmployeeGOSELECT * FROM employee_infoGO【案例5.4】在Nothwind数据库中创建一个名为employee_info_encryption的视图,要求试图定义进行加密处理。

【方法要点】欲对视图文本进行加密,在CREA TE VIEW语句中使用WITH ENCRYPTION子句即可。

代码如下:USE NothwindGOCREA TE VIEW employee_info_encryption (雇员编号、姓名、头衔、出生日期)WITH ENCRYPTIONASSELECT EmployeeID, FirstName+SPACE(1)+LastName, Title, BirthDateFROM EmployeeGOEXEC sp_helptext …employee_info_encryption‟GO运行5.4之后得到的结果时“对象备注已加密”。

在数据库创建一个视图后,该视图的定义将在系统表syscomments中。

有多种方法可以查看视图定义的文本内容,可以直接打开系统表syscomments来查看,也可以通过执行系统存储过程sp_helptext来查看。

如果不象用户查看视图定义的文本,则需要对存储在系统表syscomments中的视图定义进行加密处理,这个任务就是通过上例中的WITH ENCRYPTION子句来实现的。

5.3 管理视图5.3.1 修改视图1、使用企业管理器修改视图步骤:1)在目标数据库下右击“视图”节点。

2)在详细信息窗格中单击要修改的视图,然后选择“操作”,“设计视图”命令,随即就会弹出视图设计窗口。

3)若要在视图定义中添加引用表或视图,请单击视图设计工具栏上的“添加表”按钮,然后在“表”、“视图”或函数选项卡中双击要添加的表、视图或返回表的用户自定义函数。

4)若要从视图定义中删除某个引用表或视图或返回表的用户自定义函数,请用鼠标右击要删除的对象并选择“删除”命令,或直接按下DELETE键。

5)若要在试图定义中添加引用列,请在网格中单击某个空白的“列”单元格,然后从列表中选择所需列。

6)对于每个引用列,通过选中或取消“输出”列中的复选框来控制该列是否在结果集内显示出来。

7)若要对结果集进行分组,请单击工具栏上的“分组”按钮。

8)若要在某个列上设置过滤条件,请在相应的“准则”单元格中输入所需要的运算符和表达式,此时会生成WHERE子句。

若已经在该列上设置了分组,则会生成HA VING子句。

9)若要在某个列上设置过滤条件,请在“或”列中直接输入所需的条件表达式。

10)若要设置视图对象的其他属性,请单击工具栏上的“属性”按钮,然后在“属性”对话框中设置相关选项。

11)若要预览视图的结果集,请单击工具栏上的“运行”按钮。

12)当完成对视图定义所做的修改后,请单击工具栏上的“保存”按钮,以保存作出的修改。

2、使用ALTER VIEW语句修改视图格式:ALTER VIEW <视图名> [( <列名> [,….n])][WITH ENCRYPTION]ASSELECT 语句[WITH CHECK OPTION]在上述语法中,<视图名>指定要修改的视图,列名列表用于指定在视图中使用的列名称,WITH ENCRYPTION子句用于指定对视图定义进行加密处理,SELECT 语句用于定义创建视图时所用到的选择查询,WITH CHECK OPTION子句强制通过视图插入或修改时的数据满足WHERE子句所指定的选择条件。

相关主题