函数--快速入门
在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