视图也是数据库的基本概念,几乎所有的数据库管理系统都引入了视图。在 SQL Server 中,视图是一种数据库对象。
使用视图有很多优点,主要表现在:
视图通常用来集中、简化和自定义每个用户对数据库的不同认识。通常在以下情况下使用视图:
在SQL Server 2012中,视图可以分为 标准视图、索引视图、分区视图和系统视图。
在这4种视图中,标准视图是最常用的,而且使用范围也最广。
在创建视图前应考虑如下准则:
在 SQL Server 中,创建标准视图就如同创建表。
使用创建视图向导创建视图是一种最直观、最方便快捷的方式。
展开COLLEGE
数据库,单击视图
选项,选择右键菜单新建视图
选项。在弹出的添加表
对话框,用户可以选择需要添加的表、视图、函数和同义词。
添加完毕,进入视图设计器
窗口。该窗口又分为多个子窗口。
通常,最上边部分是关系图子窗口,如同数据库的关系图,显示所有添加表的结构及它们之间的关系。
中间部分是条件子窗口,用户可以选择视图操作涉及的列的列名、别名、表名、顺序类型等。
下边部分是SQL语句子窗口,显示用户的设置相应的T-SQL语句代码。
当执行视图时,最下边的查询结果子窗口显示视图的查询结果。
例:
现在创建一个查询所有学生选修课程成绩信息的视图,包含Name
、CourseName
、Score
列。用户在关系图子窗口中选择
Student
表的Name
列、Course
表的CourseName
列、Mark
表的Score
列,被选中的列名左边显示对勾。
在关系图子窗口中选择操作的同时,视图设计器会自动在条件子窗口中设置对应的选择,SQL语句子窗口会自动生成对应的T-SQL语句。
当然用户也可以自行设置条件子窗口中的选项,可以选择排序类型等。
用户也可以在SQL语句子窗口中修改SQL语句子窗口中的T-SQL语句。
操作完毕,点击运行按钮,即可在查询结果子窗口看到视图的结果显示。
视图创建完毕,给视图命名View_Score
,并存盘退出。用户可以在视图
选项中查看该视图对象。
T-SQL提供了CREATE VIEW语句创建一个视图。其语法格式如下:
CREATE VIEW [ schema_name . ] view_name [ (column [ ,...n ] ) ]
[ WITH <view_attribute> [ ,...n ] ]
AS select_statement [ ; ]
[ WITH CHECK OPTION ]
CREATE VIEW语句语法说明:
schema_name
用于指定视图的所有者,包括数据库名、所有者名、视图名。view_name
用于指定视图的名字。column
用于指定视图中包括的基本表的列。WITH
用于指定视图的属性。ENCRYPTION
(存储视图语句时是否加密)、SCHEMABINDING
(是否显示视图关联)、VIEW_METADATA
(指定返回结果是否是元数据)。AS select_statement
就是用于创建视图的SELECT语句。例1:
在COLLEGE
数据库中创建视图,查询计算机学院学生们的选修课程成绩信息:USE COLLEGE GO CREATE VIEW VIEW_Score_COMPUTER(学号,姓名,学院名,课程名,分数) AS SELECT Student.StudentID,Student.Name,School.SchoolName,Course.CourseName,Mark.Score FROM Student,School,Course,Mark WHERE Student.StudentID=Mark.StudentID AND Course.CourseID=Mark.CourseID AND Student.SchoolID=School.SchoolID AND SchoolName='计算机学院' GO
例2:
在COLLEGE数据库中创建视图,查询所有选修有课程的学生们的总分和平均分:USE COLLEGE GO CREATE VIEW VIEW_Score_AVG_SUM(姓名,平均分,总分) AS SELECT Student.Name,AVG(Score),SUM(Score) FROM Student,Course,Mark WHERE Student.StudentID=Mark.StudentID AND Course.CourseID=Mark.CourseID GROUP BY Student.Name GO
视图创建完毕,就可以如同查询基本表一样查询视图了。
展开COLLEGE数据库的视图
选项,单击查询的视图,选择右键菜单编辑前200行
选项就可以查询视图,如图所示:
也可以执行T-SQL语句查询视图。
如果某个视图依赖于已删除的表(或视图),则当用户试图使用该视图时,数据库引擎将产生错误消息。如果创建了新表或视图(该表的结构与以前的基表没有不同之处)以替换删除的表或视图,则视图将再次可用。如果新表或视图的结构发生更改,则必须删除并重新创建该视图。
例:
查询VIEW_Score_COMPUTER
视图:USE COLLEGE GO SELECT * FROM VIEW_Score_COMPUTER WHERE 分数>=90 GO
只要满足下列条件,即可通过视图修改基本表的数据:
上述限制适用于视图的FROM
子句中的任何子查询,就像其应用于视图本身一样。能够修改表数据的视图称为可更新视图。
若要对 SQL Server 的视图进行表数据更新,可以在视图中直接操作,就像在基本表中操作一样。
即使是可更新视图,也不能随意更新数据,一定要符合更新规则,否则系统提示出错。
如果视图所依赖的基本表有多个时,不能向该视图添加数据,因为这将影响多个基本表。
修改数据时,若视图依赖于多个基本表,那么一次只能修改一个基本表中的数据。
删除数据时,若视图依赖于多个基本表,就不能通过视图删除数据。
就算更新时不会提示出错,也有可能会造成逻辑错误。
所以,如果用户一定要通过视图更新基本表数据,必须谨慎。
也可以通过执行T-SQL语句更新视图:
例1:
通过VIEW_Score_COMPUTER视图,修改刘雨航大学物理的分数。USE COLLEGE GO UPDATE VIEW_Score_COMPUTER SET 分数=分数+2 WHERE 姓名='刘雨航' AND 课程名='大学物理' GO
例2:
通过VIEW_Score_AVG_SUM视图,修改刘雨航的总分和平均分:USE COLLEGE GO UPDATE VIEW_Score_AVG_SUM SET 平均分=平均分+2 WHERE 姓名='刘雨航' GO
虽然视图和表从查询结果看差不多,但修改视图定义与修改基本表结构不一样。
修改视图定义是指修改视图的指定列的列名、别名、表名、是否输出、顺序类型等属性。
修改视图定义时,可以通过视图设计器
窗口修改。
单击要修改的视图,选择右键菜单设计
选项。进入视图设计器
窗口后修改。修改视图操作和创建视图操作相同。
也可以通过T-SQL语句修改视图定义,T-SQL提供了视图修改语句ALTER VIEW。其语法格式如下:
ALTER VIEW [ schema_name . ]view_name [ ( column [ ,...n ] ) ]
[ WITH <view_attribute> [ ,...n ] ]
AS select_statement [ ; ]
[ WITH CHECK OPTION ]
例:
修改VIEW_Score_COMPUTER
视图,不再是查询计算机学院的学生成绩信息,而是物理学院学生的成绩信息:USE COLLEGE GO ALTER VIEW VIEW_Score_COMPUTER(学号,姓名,学院名,课程名,分数) AS SELECT Student.StudentID,Student.Name,School.SchoolName,Course.CourseName,Mark.Score FROM Student,School,Course,Mark WHERE Student.StudentID=Mark.StudentID AND Course.CourseID=Mark.CourseID AND Student.SchoolID=School.SchoolID AND SchoolName='物理学院' GO
如果不需要视图,则可以将视图删除。单击要删除的视图,选择右键菜单删除
选项,即可删除视图。
也可以通过T-SQL语句删除视图。T-SQL提供了视图删除语句DROP VIEW
。其语法格式如下:
DROP VIEW view_name
例:
删除VIEW_Score_AVG_SUM视图:DROP VIEW VIEW_Score_AVG_SUM GO
删除视图不会影响基本表结构和数据,也不会影响对的表的其它操作。
SQL Server 的用户定义函数分为两种类型:标量值函数和表值函数。
标量值函数用RETURN
语句返回单个数据值,表值函数返回值为整个表。
创建用户定义函数,T-SQL提供了CREATE FUNCTION
语句创建。也可以在对象资源管理器窗口
中,选择相应的函数创建。选择创建后,打开一个查询编辑器
窗口,里面已经存在有一个函数模板程序,如图所示:
但最终还是要在查询编辑器
窗口中使用T-SQL语句来详细创建。
在 SQL Server 中,T-SQL提供了CREATE FUNCTION
语句创建标量值函数。其语法格式如下:
CREATE FUNCTION [ schema_name. ] function_name
( [ { @parameter_name [ AS ][ type_schema_name. ] parameter_data_type
[ = default ] [ READONLY ] }
[ ,...n ]
]
)
RETURNS return_data_type
[ WITH <function_option> [ ,...n ] ]
[ AS ]
BEGIN
function_body
RETURN scalar_expression
END
CREATE FUNCTION
语句创建标量值函数语法说明:
function_name
是所创建标量值函数的函数名。@parameter_name
是用户定义函数中的参数。可声明一个或多个参数。default
是参数的默认值。READONLY
指示不能在函数定义中更新或修改参数。如果参数类型为用户定义的表类型,则应指定READONLY
。RETURNS
是返回值的数据类型。AS
后面是函数主体语句。RETURN
是函数本身返回值。例1:
创建标量值函数FUN_SUM
,函数返回两个数的和:USE COLLEGE GO CREATE FUNCTION FUN_SUM (@i INT,@j INT) RETURNS INT AS BEGIN DECLARE @s INT SET @s=@i+@j RETURN @s END GO
用户可以在该数据库的
可编程性
选项的函数
子选项中的标量值函数
子选项中查看到。该函数名前系统自动加上dbo.
作为该函数名的前缀,即该函数的所有者是当前数据库。
调用
FUN_SUM
函数,求两个数的和:USE COLLEGE GO DECLARE @m INT DECLARE @n INT SET @m=10 SET @n=20 SELECT dbo.FUN_SUM(@m,@n) GO
例2:
创建标量值函数FUN_AVGScore
,代入某课程号,函数返回某门课程的平均分:USE COLLEGE GO CREATE FUNCTION FUN_AVGScore(@CID INT) RETURNS FLOAT AS BEGIN DECLARE @avgscore FLOAT SELECT @avgscore=AVG(Score) FROM Mark WHERE CourseID=@CID GROUP BY CourseID RETURN @avgscore END GO
创建完成后,调用该函数:
USE COLLEGE GO SELECT dbo.FUN_AVGScore(021) GO
在 SQL Server 中,T-SQL提供了CREATE FUNCTION
语句创建内嵌表值函数。其语法格式如下:
CREATE FUNCTION [ schema_name. ] function_name
( [ { @parameter_name [ AS ] [ type_schema_name. ] parameter_data_type
[ = default ] [ READONLY ] }
[ ,...n ]
]
)
RETURNS TABLE
[ WITH <function_option> [ ,...n ] ]
[ AS ]
RETURN [ ( ] select_stmt [ ) ]
CREATE FUNCTION
语句创建内嵌表值函数语法说明:
RETURNS
返回的数据类型是TABLE
类型。RETURN
后是SELECT
语句。select_stmt
定义内联表值函数返回值的单个SELECT
语句。TABLE
指定表值函数的返回值为表。只有常量和局部变量可以传递到表值函数。在内嵌表值函数中,TABLE
返回值是通过单个SELECT
语句定义的。内嵌函数没有关联的返回变量。例
创建内嵌表值函数,代入某图书类型号编号,函数返回该类图书信息。USE PUBLISH GO CREATE FUNCTION FUN_Book(@Bid INT) RETURNS TABLE AS RETURN ( SELECT BookID,BookName FROM Book WHERE TypeID=@Bid ) GO
创建完成后,调用该函数:
USE PUBLISH GO SELECT * FROM dbo.FUN_Book (1) GO
结果显示类型编号为“1”号的图书名称。
在SQL Server 2012中,T-SQL提供了CREATE FUNCTION
语句创建多语句表值函数。其语法格式如下:
CREATE FUNCTION [ schema_name. ] function_name
( [ { @parameter_name [ AS ] [ type_schema_name. ] parameter_data_type
[ = default ] [READONLY] }
[ ,...n ]
]
)
RETURNS @return_variable TABLE <table_type_definition>
[ WITH <function_option> [ ,...n ] ]
[ AS ]
BEGIN
function_body
RETURN
END
CREATE FUNCTION
语句创建多语句表值函数语法说明:
@return_variable
是TABLE
变量,用于存储和累积应作为函数值返回的行。只能将@return_variable
指定用于T-SQL函数。RETURN
后没有语句。例:
创建多语句表值函数:USE COLLEGE GO CREATE FUNCTION FUN_Sch(@schname NCHAR(20)) RETURNS @stuSch TABLE ( stuid INT PRIMARY KEY NOT NULL, stuName NCHAR(10) NOT NULL, stuSex NCHAR(2) NOT NULL ) AS BEGIN INSERT @stuSch SELECT StudentID,Name,Sex FROM Student WHERE SchoolID= ( SELECT SchoolID FROM School WHERE SchoolName=@schname ) RETURN END GO
调用该函数:
USE COLLEGE GO SELECT * FROM dbo.FUN_Sch('计算机学院') GO
结果显示计算机学院学生的信息。
与系统函数不同,用户定义函数可以随时修改和重命名。修改和重命名可以使用管理工具界面方式,也可使用命令行方式。
单击需要修改的用户定义函数,选择右键菜单重命名
选项,即可重命名函数。选择右键菜单修改
选项。即可进入查询编辑器
窗口修改函数
T-SQL提供了ALTER FUNCTION
语句修改用户定义函数。ALTER FUNCTION
语句的使用方法与CREATE FUNCTION
语句相似。
T-SQL还提供了sp_rename
系统存储过程重命名函数。例如重命名dbo.FUN_Sch
函数:
EXEC sp_rename 'dbo.FUN_Sch','dbo.FUN_Sch1'
与系统函数不同,用户定义函数还可以在不需要时删除。删除也可以使用管理工具界面方式和命令行方式。
单击需要删除的用户定义函数,选择右键菜单删除
选项即可。也可使用T-SQL提供的DROP FUNCTION
语句删除用户定义函数。例如删除dbo.FUN_Sch
函数:
DROP FUNCTION dbo.FUN_Sch