您的位置:首页 > 其它

函数--快速入门

2012-04-13 18:19 155 查看
在SQL Server查询、报表和许多T-SQL语句中常使用函数来返息,这与函数在其他编程语言中使用的函数相似。函数返回类型可以是用于 表达式的值或表格。SQL Server 2005中提供的函数可分为三类:内置 函数、标量函数、表值函数。本章将对常用函数做详细介绍。

10.1 内置函数

SQL Server提供了内置函数帮助用户执行各种操作。内置函数不能修改,可以在T-SQL语句中使用。 内置函数包括:聚合函数、配置函数、加密函数、游标函数、时间和日期函数、数学函数、元数据函数、排名函数、行集函数、安全函数、字符串函数、系统函数、系统统计函数、文本和图像函数等。

10.1.1聚合函数

聚合函数用于对一组值执行计算,并返回单个值。

聚合函数可以在SELECT语句的选择列表(子查询或外部查询)、GROUP BY子句、COMPUTE BY 子句、HAVING子句中作为表达式使用。

聚合函数包括:AVG()、COUNT()、MAX()、MIN()、SUM()、CHECKSUM()、CHECKSUM_AGG()、STDEV()、STDEVP()、COUNT_BIG()、VAR()、GROUPING()、VARP()。

(1)AVG([ALL|DISTINCT]expression):返回组中值的平均值。

参数描述:

ALL:对所有的值进行函数运算,默认值为ALL。

DISTINCT:指定AVG()函数返回唯一非空值的数量。

expression:待求平均值的表达式。

【例10.1】统计学生平均成绩。

use student

select 课程注册.学号,

学生.姓名,

avg(成绩) as 平均成绩

from 学生,课程注册

where 学生.学号=课程注册.学号

group by 课程注册.学号,学生.姓名

10.1.2 配置函数

SELECT @@VERSION AS 'SQL Server Version'

10.1.3日期和时间函数

GETDATE( ): 返回当前系统日期和时间。

例:select getdate() 结果:2008-07-20 13:55:37

10.1.4.数学函数

(1)ABS(x):返回给定数字表达式的绝对值。

【例10.10】SELECT ABS(-12)。结果:12。

10.1.5元数据函数

(1)COL_LENGTH(table,column):返回列的长度,且以字节为单位。

参数描述:table为表名;column为列名。

【例10.19】返回Student数据库中专业表专业名称列的长度。

USE student

SELECT COL_LENGTH('专业','专业名称')

结果:20。

10.1.6字符串函数

1)ASCII(str): 返回字符表达式最左端字符的 ASCII 代码值。

参数描述 str: char 或 varchar的表达式

10.1.7系统函数

【例10.23】selcet cast(123 as char(1))。结果:将数字数据123转换成长度为1B的字符型数据。

10.1.8排名函数

【例10.24】按入学日期将学生纪录进行排序。

代码如下:

USE student

GO

SELECT RANK() OVER (ORDER BY 入学时间) AS 入学先后,

姓名,性别,入学时间

FROM 学生

执行后结果如图10-5所示,请注意“入学先后”列左侧的列,序号依次往下加1,但“入学先后”列的值却不是连续的,RANK()函数使入学时间相同的排序后的序号相同,下一个的序号将与“入学先后”列左侧的列序号一致。这说明了RANK()函数并不总返回连续整数的原因。

10.2 用户定义函数

1.用户定义函数分类

SQL Server 2005中用户定义函数可分为标量

函数和表值函数两类,其中,表值函数可再

分为内联表值函数和多语句表值函数。

10.3标量函数

标量函数返回在RETURNS子句中定义的单个数据值。函数返回类型

是除text、next、image、cursor和timestamp外的任何数据类型。

1.标量函数的创建

语法格式如下:

CREATE FUNCTION[schema_name.]function_name

([{@parameter_name[AS][type_schema_name.]parameter_data_type

[=default]}

[,…n]

]

)

RETURNS return_data_type

[WITH <function_option> [,…n]]

[AS]

BEGIN

【例10.29】定义标量函数STUDENT_PASS(),统计学生考试是否合格的信息。

(1)创建新标量函数,输入如下代码,执行后结果如图10-9所示。

USE student

GO

CREATE FUNCTION student_pass_info(@grade tinyint)

RETURNS char(8)

BEGIN

DECLARE @info char(8)

IF @grade>=60 SET @info='通过'

ELSE SET @info='不合格'

RETURN @info

END

GO

(2)在查询分析器中输入以下代码,执行后结果如图10-10所示。

USE student

GO

SELECT 课程注册.学号,学生.姓名,课程.课程名,dbo.student_pass_info(成绩)AS 是否通过

FROM 学生,课程注册,课程

WHERE 课程注册.课程号=课程.课程号AND 课程注册.学号=学生.学号

GO

10.4 表值函数

用户定义表值函数可分为内联表值函数和多语句表值函数

函数返回table数据类型。

1.创建内联表值函数

对于内联表值函数,没有函数主体,表是单个SELECT语句的结果集。语法格式如下:

CREATE FUNCTION[schema_name.]function_name

([{@parameter_name[AS][type_schema_name.]parameter_data_type

[=default]}

[,…n]

]

)

RETURNS TABLE

[WITH <function_option> [,…n]]

[AS]

RETURN[()select_stmt[]]

[;]

【例10.30】定义内联表值函数TEACHER_COURSE(),函数根据参数返回教师开课的信息。

操作步骤如下:

(1)新建表值函数,代码如下所示,执行后结果如图10-11所示。

USE student

GO

CREATE FUNCTION TEACHER_COURSE(@teacher_id char(12))

RETURNS TABLE

AS

RETURN (SELECT DISTINCT 教师.教师编号,教师.姓名,系部.系部名称,课程.课程名,专业.专业名称

FROM 教师,系部,课程,教师任课,专业

WHERE 教师.教师编号=@teacher_id AND 教师.系部代码=系部.系部代码

AND 教师任课.教师编号=教师.教师编号 and 课程.课程号=教师任课.课程号 AND 教师任课.专业代码=专业.专业代码)

GO

(2)在查询分析器中输入并执行以下代码,得到如图10-12所示结果

USE student

GO

SELECT * FROM TEACHER_COURSE('100000000002')

GO

2 .创建多语句表值函数

对于多语句表值函数,在 BEGIN...END 块中定义的函数

主体包含 TRANSACT-SQL 语句,这些语句可生成行并将行插

入将返回的表中。

语法格式如下:

CREATE FUNCTION[schema_name.]function_name

([{@parameter_name[AS][type_schema_name.]parameter_data_type

[=default]}

[,…n]

])RETURNS @return_variable TABLE <table_type_definition>

[WITH <function_option>[,…n]]

[AS]

BEGIN

function_body

RETURN

END

[;]

【例10.31】根据学生学号统计学生所取得学分信息,结果将未取得的学分信息筛去

操作步骤如下:

(1)创建多语句表值函数,输入以下代码,执行后得到如图10-13所示结果。

USE student

GO

CREATE FUNCTION STUDENT_CREDIT(@student_id as char(12))

RETURNS @credit TABLE

(

学号 char(12),

姓名 char(8),

课程名称 char(20) ,

学分 smallint)

AS

BEGIN

INSERT @credit

SELECT 课程注册.学号,学生.姓名,课程.课程名,课程.学分 FROM 课程,课程注册,学生
WHERE 学生.学号=课程注册.学号 AND 课程注册.成绩>=60 AND 课程注册.课程号=课程.课程号 AND 课程注册.学号=@student_id

RETURN

END

(2)在查询分析器中再输入以下代码,使用该函数,得到如图10-14所示结果。
USE student
GO
SELECT * FROM dbo.STUDENT_CREDIT('010102002001')
GO
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: