【数据库原理与SQL Server应用】Part08——视图和用户定义函数

【数据库原理与应用】Part08——视图和用户定义函数

  • 一、视图
    • 1.1 视图概述
      • 1.1.1 视图的优点
      • 1.1.2 视图的使用范围
    • 1.2 视图的类型
    • 1.3 创建视图准则
    • 1.4 创建视图
      • 1.4.1 管理工具界面方式创建视图
      • 1.4.2 命令行方式创建视图
    • 1.5 查询视图
    • 1.6 可更新视图
    • 1.7 修改视图定义
    • 1.8 删除视图
  • 二、用户定义函数
    • 2.1 标量值函数
    • 2.2 内嵌表值函数
    • 2.3 多语句表值函数
    • 2.4 修改和重命名用户定义函数
      • 2.4.1 管理工具界面方式
      • 2.4.2 命令行方式
    • 2.5 删除用户定义函数

一、视图

视图也是数据库的基本概念,几乎所有的数据库管理系统都引入了视图。在 SQL Server 中,视图是一种数据库对象。

1.1 视图概述

1.1.1 视图的优点

使用视图有很多优点,主要表现在:

  1. 为用户集中数据,简化用户的数据查询和处理。视图可以使用户只关心他感兴趣的某些特定数据,使得分散在多个表中的数据,通过视图定义在一起。
  2. 简化操作,屏蔽了数据库的复杂性。
  3. 重新定制数据,使得数据 便于共享
  4. 合并分割数据,有利于数据输出到应用程序中。
  5. 简化了用户权限的管理,增加了安全性。

1.1.2 视图的使用范围

视图通常用来集中、简化和自定义每个用户对数据库的不同认识。通常在以下情况下使用视图:

  1. 着重于特定数据。
    视图使用户能够着重于他们感兴趣的特定数据和所负责的特定任务。不必要的数据或敏感数据可以不出现在视图中。
  2. 简化数据操作。
    视图可以简化用户处理数据的方式。可以将常用连接、投影、UNION查询和SELECT查询定义为视图,用户不必在每次对该数据执行附加操作时指定所有条件和条件限定。
  3. 自定义数据。
    视图允许用户以不同方式查看数据,即使在他们同时使用相同的数据时也是如此。
  4. 数据的导入与导出。
    可使用视图将数据导出到其他应用程序。
  5. 跨服务器组合分区数据库。

1.2 视图的类型

在SQL Server 2012中,视图可以分为 标准视图、索引视图、分区视图和系统视图

  1. 标准视图
    标准视图组合了一个或多个表中的数据, 用户可以使用标准视图对数据库进行查询、修改、删除等基本操作 ,是用户使用频率最高的一种视图。标准视图可以获得使用视图的大多数优点。
  2. 索引视图
    索引视图是被具体化了的视图,即它已经过计算并存储。可以为视图创建索引,即对视图创建一个唯一的聚集索引。索引视图可以显著提高某些类型查询的性能。索引视图尤其适于聚合许多行的查询。但它们不太适于经常更新的基本数据集。
  3. 分区视图
    分区视图在一台或多台服务器间水平连接一组成员表中的分区数据。这样,数据看上去如同来自于一个表。连接同一个SQL Server实例中的成员表的视图是一个本地分区视图。如果视图在服务器间连接表中的数据,则它是分布式分区视图。
  4. 系统视图
    系统视图公开了目录元数据。用户可以使用系统视图返回与SQL Server实例或在该实例中定义的对象有关的信息。SQL Server提供的公开元数据的系统视图集合包括目录视图、兼容性视图、信息架构视图、兼容性视图、复制视图等。

在这4种视图中,标准视图是最常用的,而且使用范围也最广

1.3 创建视图准则

在创建视图前应考虑如下准则:

  1. 只能在当前数据库中创建视图。但是,如果使用分布式查询定义视图,则新视图所引用的表和视图可以存在于其他数据库,甚至其他服务器中。
  2. 视图名称必须遵循标识符的规则,且在每个数据库中都必须惟一。此外,该名称不得与该当前数据库中任何表的名称相同。
  3. 用户可以对其他视图创建视图。SQL Server 2012允许嵌套视图。但嵌套不得超过32层。根据视图的复杂性及可用内存,视图嵌套的实际限制可能低于该值。
  4. 不能将规则或默认约束与视图相关联。
  5. 不能将AFTER触发器与视图相关联,只有INSTEAD OF触发器可以与之相关联。
  6. 定义视图的查询不能包含COMPUTE子句、COMPUTE BY子句或INTO关键字。
  7. 定义视图的查询不能包含ORDER BY子句,除非在SELECT语句的选择列表中还有一个TOP子句。
  8. 定义视图的查询不能包含指定查询提示的OPTION子句。
  9. 定义视图的查询不能包含TABLESAMPLE子句。
  10. 不能为视图定义全文索引定义。
  11. 不能创建临时视图,也不能对临时表创建视图。
  12. 不能删除参与到使用SCHEMABINDING子句创建的视图中的视图、表或函数,除非该视图已被删除或更改而不再具有架构绑定。另外,如果对参与具有架构绑定的视图的表执行ALTER TABLE语句,而这些语句又会影响该视图的定义,则这些语句将会失败。
  13. 下列情况下必须指定视图中每列的名称:
    ① 视图中的任何列都是从算术表达式、内置函数或常量派生而来。
    ② 视图中有两列或多列源应具有相同名称。
    ③ 希望为视图中的列指定一个与其源列不同的名称。

1.4 创建视图

在 SQL Server 中,创建标准视图就如同创建表

1.4.1 管理工具界面方式创建视图

使用创建视图向导创建视图是一种最直观、最方便快捷的方式。

展开COLLEGE数据库,单击视图选项,选择右键菜单新建视图选项。在弹出的添加表对话框,用户可以选择需要添加的表、视图、函数和同义词。
【数据库原理与SQL Server应用】Part08——视图和用户定义函数_第1张图片

【数据库原理与SQL Server应用】Part08——视图和用户定义函数_第2张图片
添加完毕,进入视图设计器窗口。该窗口又分为多个子窗口。
通常,最上边部分是关系图子窗口,如同数据库的关系图,显示所有添加表的结构及它们之间的关系。
中间部分是条件子窗口,用户可以选择视图操作涉及的列的列名、别名、表名、顺序类型等。
下边部分是SQL语句子窗口,显示用户的设置相应的T-SQL语句代码。
当执行视图时,最下边的查询结果子窗口显示视图的查询结果。
【数据库原理与SQL Server应用】Part08——视图和用户定义函数_第3张图片

例:
现在创建一个查询所有学生选修课程成绩信息的视图,包含NameCourseNameScore列。

用户在关系图子窗口中选择Student表的Name列、Course表的CourseName列、Mark表的Score列,被选中的列名左边显示对勾。
在关系图子窗口中选择操作的同时,视图设计器会自动在条件子窗口中设置对应的选择,SQL语句子窗口会自动生成对应的T-SQL语句。
当然用户也可以自行设置条件子窗口中的选项,可以选择排序类型等。
用户也可以在SQL语句子窗口中修改SQL语句子窗口中的T-SQL语句。
操作完毕,点击运行按钮,即可在查询结果子窗口看到视图的结果显示。
视图创建完毕,给视图命名View_Score,并存盘退出。用户可以在视图选项中查看该视图对象。
【数据库原理与SQL Server应用】Part08——视图和用户定义函数_第4张图片

【数据库原理与SQL Server应用】Part08——视图和用户定义函数_第5张图片

1.4.2 命令行方式创建视图

T-SQL提供了CREATE VIEW语句创建一个视图。其语法格式如下:

CREATE VIEW [ schema_name . ] view_name [ (column [ ,...n ] ) ]
[ WITH <view_attribute> [ ,...n ] ]
AS select_statement [ ; ]
[ WITH CHECK OPTION ]

CREATE VIEW语句语法说明:

  1. schema_name用于指定视图的所有者,包括数据库名、所有者名、视图名。
  2. view_name用于指定视图的名字。
  3. column用于指定视图中包括的基本表的列。
  4. WITH 用于指定视图的属性。
    视图属性包括ENCRYPTION(存储视图语句时是否加密)、SCHEMABINDING(是否显示视图关联)、VIEW_METADATA(指定返回结果是否是元数据)。
  5. 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

1.5 查询视图

视图创建完毕,就可以如同查询基本表一样查询视图了。
展开COLLEGE数据库的视图选项,单击查询的视图,选择右键菜单编辑前200行选项就可以查询视图,如图所示:
【数据库原理与SQL Server应用】Part08——视图和用户定义函数_第6张图片

也可以执行T-SQL语句查询视图
如果某个视图依赖于已删除的表(或视图),则当用户试图使用该视图时,数据库引擎将产生错误消息。如果创建了新表或视图(该表的结构与以前的基表没有不同之处)以替换删除的表或视图,则视图将再次可用。如果新表或视图的结构发生更改,则必须删除并重新创建该视图。

例:
查询VIEW_Score_COMPUTER视图:

USE COLLEGE
GO
SELECT *
FROM VIEW_Score_COMPUTER
WHERE 分数>=90
GO

【数据库原理与SQL Server应用】Part08——视图和用户定义函数_第7张图片

1.6 可更新视图

只要满足下列条件,即可通过视图修改基本表的数据:

  1. 任何修改(包括UPDATE、INSERT和DELETE语句)都只能引用一个基本表的列。
  2. 在视图中修改的列必须直接引用表列中的基础数据。 它们不能通过其他方式派生,例如通过聚合函数(AVG、COUNT、SUM、MIN、MAX、GROUPING等)计算,不能通过表达式并使用列计算出其他列。使用集合运算符(UNION、UNION ALL、CROSSJOIN、EXCEPT和INTERSECT)形成的列得出的计算结果不可更新。
  3. 被修改的列不受GROUP BY、TOP、HAVING或DISTINCT子句的影响。

上述限制适用于视图的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

1.7 修改视图定义

虽然视图和表从查询结果看差不多,但修改视图定义与修改基本表结构不一样
修改视图定义是指修改视图的指定列的列名、别名、表名、是否输出、顺序类型等属性。
修改视图定义时,可以通过视图设计器窗口修改。
单击要修改的视图,选择右键菜单设计选项。进入视图设计器窗口后修改。修改视图操作和创建视图操作相同。

也可以通过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

1.8 删除视图

如果不需要视图,则可以将视图删除。单击要删除的视图,选择右键菜单删除选项,即可删除视图。
也可以通过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语句创建。也可以在对象资源管理器窗口中,选择相应的函数创建。选择创建后,打开一个查询编辑器窗口,里面已经存在有一个函数模板程序,如图所示:
【数据库原理与SQL Server应用】Part08——视图和用户定义函数_第8张图片

【数据库原理与SQL Server应用】Part08——视图和用户定义函数_第9张图片
但最终还是要在查询编辑器窗口中使用T-SQL语句来详细创建。

2.1 标量值函数

在 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语句创建标量值函数语法说明:

  1. function_name是所创建标量值函数的函数名。
  2. @parameter_name是用户定义函数中的参数。可声明一个或多个参数。
  3. default是参数的默认值。
  4. READONLY指示不能在函数定义中更新或修改参数。如果参数类型为用户定义的表类型,则应指定READONLY
  5. RETURNS是返回值的数据类型。
  6. AS后面是函数主体语句。
  7. 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

2.2 内嵌表值函数

在 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语句创建内嵌表值函数语法说明:

  1. RETURNS返回的数据类型是TABLE类型。
  2. RETURN后是SELECT语句。select_stmt定义内联表值函数返回值的单个SELECT语句。
  3. 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”号的图书名称。

2.3 多语句表值函数

在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语句创建多语句表值函数语法说明:

  1. @return_variableTABLE变量,用于存储和累积应作为函数值返回的行。只能将@return_variable指定用于T-SQL函数。
  2. 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

结果显示计算机学院学生的信息。

2.4 修改和重命名用户定义函数

与系统函数不同,用户定义函数可以随时修改和重命名。修改和重命名可以使用管理工具界面方式,也可使用命令行方式。

2.4.1 管理工具界面方式

单击需要修改的用户定义函数,选择右键菜单重命名选项,即可重命名函数。选择右键菜单修改选项。即可进入查询编辑器窗口修改函数

【数据库原理与SQL Server应用】Part08——视图和用户定义函数_第10张图片
【数据库原理与SQL Server应用】Part08——视图和用户定义函数_第11张图片

2.4.2 命令行方式

T-SQL提供了ALTER FUNCTION语句修改用户定义函数。ALTER FUNCTION语句的使用方法与CREATE FUNCTION语句相似。
T-SQL还提供了sp_rename系统存储过程重命名函数。例如重命名dbo.FUN_Sch函数:
EXEC sp_rename 'dbo.FUN_Sch','dbo.FUN_Sch1'

2.5 删除用户定义函数

与系统函数不同,用户定义函数还可以在不需要时删除。删除也可以使用管理工具界面方式和命令行方式。
单击需要删除的用户定义函数,选择右键菜单删除选项即可。也可使用T-SQL提供的DROP FUNCTION语句删除用户定义函数。例如删除dbo.FUN_Sch函数:
DROP FUNCTION dbo.FUN_Sch

你可能感兴趣的:(数据库,数据库,sql,服务器)