-
SQL Server 2008教程之常用函数
常用函数
SQL Server 2008为Transact-SQL语言提供了大量功能强大的系统函数,利用该函数不需要写很多代码就能够完成很多任务。在SQL Server 2008中,函数主要用来获得有关信息,进行算术计算、统计分析、实现数据类型转换等操作。本节将介绍常用的聚合、数学、字符串、日期和时间函数,以及如何自定义函数等。4.4.1 聚合函数
聚合函数常用于GROUP BY子句,用于聚合分组的数据。所有聚合函数均为确定性函数,也就是说只要使用一组特定输入值调用聚合函数,该函数总是返回同类型的值。例如,计算一组整数型数值的总和或者平均值,结果将同样会返回整数型的数值。该函数在和GROUP BY子句一起使用时显示出其强大功能,但聚合函数的使用也不是只限于分组查询。如果查询语句中使用了聚合函数,而没有用GROUP BY子句,则聚合函数是用于聚合整个结果集(匹配WHERE子句的所有行)。例如,不使用GROUP BY子句,SELECT列表中AVG只能和SUM对应,但不能对应特定列。
SQL Server 2008中提供了大量的聚合函数,表4-8中列出了一些常用聚合函数。
表4-8 聚合函数
函数名称 | 含义 |
AVG | 返回组中各值的平均值,如果为空将被忽略 |
CHECKSUM | 用于生成哈希索引,返回按照表的某一行或一组表达式计算出来的校验和值 |
CHECKSUM_AGG | 返回组中各值的校验和,如果为空将被忽略 |
COUNT | 返回组中项值的数量,如果为空也将计数 |
COUNT_BIG | 返回组中项值的数量。与COUNT函数唯一的差别是他们的返回值。COUNT_BIG始终返回bigint数据类型值。COUNT始终返回int数据类型值 |
GROUPING | 当行由CUBE或ROLLUP运算符添加时,该函数将导致附加列的输出值为1;当行不由CUBE或ROLLUP运算符添加时,将导致附加列的输出值为0 |
MAX | 返回组中值列表的最大值 |
MIN | 返回组中值列表的最小值 |
SUM | 返回组中各值的总和 |
STDEV | 返回指定表达式中所有值的标准偏差 |
STDEVP | 返回指定表达式中所有值的总体标准偏差 |
VAR | 返回指定表达式中所有值的方差 |
VARP | 返回指定表达式中所有值的总体方差 |
在SQL Server 2008提供的所有聚合函数中,除了COUNT函数以外,聚合函数都会忽略空值。 |
下面通过示例演示下聚合函数的具体应用。例如,下面的语句按【体育场管理系统】数据库中【管理员信息】表的“管理员名称”进行分组,并统计该管理员负责场馆的个数,并且统计该管理员负责的场馆的平均单价,具体代码如下所示:
SELECT B.管理员名称,COUNT(A.管理员编号) AS
管理员负责场馆数,AVG(A.单位价格) AS 平均价格
FROM 场馆信息 A ,管理员信息 B
WHERE A.管理员编号=B.管理员编号
AND B.管理员名称='李玺'
GROUP BY B.管理员名称
执行上述语句,可以查询出管理员姓名为“李玺”所负责的场馆个数及平均单价,如图4-9所示。管理员负责场馆数,AVG(A.单位价格) AS 平均价格
FROM 场馆信息 A ,管理员信息 B
WHERE A.管理员编号=B.管理员编号
AND B.管理员名称='李玺'
GROUP BY B.管理员名称
图4-9 使用聚合函数
4.4.2 数学函数
数学函数用于对数字表达式进行数学运算并返回运算结果。在SQL Server 2008中,数学函数可以对系统提供的数字数据进行运算:decimal、integer、float、real、money、smallmoney、smallint 和 tinyint。默认情况下,对float数据类型数据的内置运算的精度为六个小数位数。SQL Server提供了20多个用于处理整数与浮点值的数学函数。下面表4-9列出了部分常用的数学函数。表4-9 数学函数
函数 | 描述 |
ABS | 返回数值表达式的绝对值 |
EXP | 返回指定表达式以e为底的指数 |
CEILING | 返回大于或等于数值表达式的最小整数 |
FLOOR | 返回小于或等于数值表达式的最大整 |
LN | 返回数值表达式的自然对数 |
LOG | 返回数值表达式以10为底的对 |
POWER | 返回对数值表达式进行幂运算的结果 |
ROUND | 返回舍入到指定长度或精度的数值表达式 |
SIGN | 返回数值表达式的正号(+)、负号(-)或零(0) |
SQUARE | 返回数值表达式的平方 |
SQRT | 返回数值表达式的平方根 |
SELECT
ROUND(12345.34567,2) 精确小数点后2位,
ROUND(12345.34567,-2) 精确小数点前2位
GO
执行上述代码,结果如图5-6所示。ROUND(12345.34567,2) 精确小数点后2位,
ROUND(12345.34567,-2) 精确小数点前2位
GO
图4-10 使用ROUND函数
数学函数(例如 ABS、CEILING、DEGREES、FLOOR、POWER、RADIANS 和 SIGN)返回与输入值具有相同数据类型的值。三角函数和其他函数(包括 EXP、LOG、LOG10、SQUARE 和 SQRT)将输入值转换为 float 并返回 float 值。 |
4.4.3 字符串函数
字符串函数用于计算、格式化和处理字符串参数,或将对象转换为字符串。与数学函数一样,SQL Server 2008为了方便用户进行字符型数据的各种操作和运算提供了功能全面的字符串函数。字符串函数也是经常使用的一种函数,常见的字符串函数如表4-10所示。表4-10 字符串函数
字符串函数 | 描述 |
ASCII | ASCII函数,返回字符表达式中最左侧的字符的ASCII代码值 |
CHAR | ASCII代码转换函数,返回指定ASCII代码的字符 |
LEFT | 左子串函数,返回字符串中从左边开始指定个数的字符 |
LEN | 字符串函数,返回指定字符串表达式的字符(而不是字节)数,其中不包含尾随空格 |
LOWER | 小写字母函数,将大写字符数据转换为小写字符数据后返回字符表达式 |
LTRIM | 删除前导空格字符串,返回删除了前导空格之后的字符表达式 |
REPLACE | 替换函数,用第三个表达式替换第一个字符串表达式中出现的所有第二个指定字符串表达式的匹配项 |
REPLICATE | 复制函数,以指定的次数重复字符表达式 |
RIGHT | 右子串函数,返回字符串中从右边开始指定个数的字符 |
RTRIM | 删除尾随空格函数,删除所有尾随空格后返回一个字符串 |
SPACE | 空格函数,返回由重复的空格组成的字符串 |
STR | 数字向字符转换函数,返回由数字数据转换来的字符数据 |
SUBSTRING | 子串函数,返回字符表达式、二进制表达式、文本表达式或图像表达式的一部分 |
UPPER | 大写函数,返回小写字符数据转换为大写的字符表达式 |
SELECT RIGHT(客户编号,2) '客户编号',客户名称,ASCII(性别) '性别',LEN(客户名称) '长度'
,'属于'+SPACE(1)+LTRIM(所在公司) '公司'
FROM 客户信息
WHERE SUBSTRING(客户名称,1,1)='王'
在上述语句中同时使用了RIGHT、ASCII、LEN、SPACE、LTRIM和SUBSTRING共6个字符串函数,返回姓氏为“王”的所有客户信息,其执行结果如图5-7所示。,'属于'+SPACE(1)+LTRIM(所在公司) '公司'
FROM 客户信息
WHERE SUBSTRING(客户名称,1,1)='王'
图4-11 使用字符串函数
4.4.4 日期和时间函数
SQL Server 2008提供了9个日期和时间处理函数。其中的一些函数接受datepart变元,这个变元指定函数处理日期与时间所使用的时间粒度。表5-11列出了datepart变元的可能设置。表4-11 SQL Server datepart常量
常量 | 含义 | 常量 | 含义 |
yy或yyyy | 年 | dy或y | 年日期(1到366) |
qq或q | 季 | dd或d | 日 |
mm或m | 月 | Hh | 时 |
wk或ww | 周 | mi或n | 分 |
dw或w | 周日期 | ss或s | 秒 |
ms | 毫秒 |
表4-12 日期和时间函数
日期函数 | 描述 |
DATEADD | 返回给指定日期加上一个时间间隔后的新datetime值。 |
DATEDIFF | 返回跨两个指定日期的日期边界数和时间边界数。 |
DATENAME | 返回表示指定日期的指定日期部分的字符串。 |
DATEPART | 返回表示指定日期的指定日期部分的整数。 |
DAY | 返回一个整数,表示指定日期的天DATEPART部分。 |
GETDATE | 以datetime值的SQL Server 2008标准内部格式返回当前系统日期和时间。 |
GETUTCDATE | 返回表示当前的UTC时间(通用协调时间或格林尼治标准时间)的datetime值。当前的UTC时间得自当前的本地时间和运行Microsoft SQL Server 2008实例的计算机操作系统中的时区设置。 |
MONTH | 返回表示指定日期的“月”部分的整数。 |
YEAR | 返回表示指定日期的年份的整数。 |
为了有助于读者更好的掌握日期和时间函数的用法,下面举出DATEPART()和DATEDIFF()函数的应用实例,具体代码及执行结果如图5-8所示。
图4-12 使用日期函数
4.4.5 自定义函数
除了使用系统函数外,用户还可以创建自定义函数,以实现更独特的功能。自定义函数可以接受零个或多个输入参数,其返回值可以是一个数值,也可以是一个表,但是自定义函数不支持输出参数。在SQL Server 2008中,使用CREATE FUNCTION语句来创建自定义函数,根据函数返回值形式的不同,可以创建三类自定义函数,分别是标量值自定义函数、内联表值自定义函数和多语句表值自定义函数。1.标量值函数
标量值自定义函数返回一个确定类型的标量值,其返回的值类型为除text、ntext、image、cursor、timestamp和table类型外的其他数据类型。也就是说,标量值自定义函数返回的是一个数值。
标量值自定义函数的语法结构如下所示:
CREATE FUNCTION function_name
([{@parameter_name scalar_ parameter_data_type [ = default ]}[,…n]])
RETURNS scalar_return_data_type
[WITH ENCRYPTION]
[AS]
BEGIN
function_body
RETURN scalar_expression
END
语法中各参数含义如下:([{@parameter_name scalar_ parameter_data_type [ = default ]}[,…n]])
RETURNS scalar_return_data_type
[WITH ENCRYPTION]
[AS]
BEGIN
function_body
RETURN scalar_expression
END
l function_name 自定义函数的名称;
l @parameter_name 输入参数名;
l scalar_ para meter_data_type 输入参数的数据类型;
l RETURNS scalar_return_data_type 该子句定义了函数返回值的数据类型,该数据类型不能是text、ntext、image、cursor、timestamp和table类型;
l WITH 该子句指出了创建函数的选项。如果指定了ENCRYPTION参数,则创建的函数是被加密的,函数定义的文本将以不可读的形式存储在syscomments表中,任何人都不能查看该函数的定义,包括函数的创建者和系统管理员;
l BEGIN…END 该语句块内定义了函数体(function_body),以及包含RETURN语句,用于返回值。
了解了语法格式及参数含义之后,下面来创建一个标量值函数,他使用一个整形参数指定订单号,返回该订单的客户的姓名。
CREATE FUNCTION GetName4(@id INT)
RETURNS varchar(50)
AS
BEGIN
DECLARE @Name varchar(50)
SELECT @Name=(SELECT B.客户名称
FROM 场馆预订信息 A INNER JOIN 客户信息B
ON A.场馆编号=B.客户编号
WHERE 订单号=@id
)
RETURN @Name
END
执行上述语句后在【教务管理系统】数据库中创建一个名称为GetName的标量值函数,在查询中调用该函数,具体的代码及结果如图5-10所示。RETURNS varchar(50)
AS
BEGIN
DECLARE @Name varchar(50)
SELECT @Name=(SELECT B.客户名称
FROM 场馆预订信息 A INNER JOIN 客户信息B
ON A.场馆编号=B.客户编号
WHERE 订单号=@id
)
RETURN @Name
END
图4-13 使用自定义标量值函数
2.内联表值函数
内联表值函数以表的形式返回一个返回值,即他返回的是一个表。内联表值自定义函数没有由BEGIN…END语句块中包含的函数体,而是直接使用RETURN子句,其中包含的SELECT语句将数据从数据库中筛选出来形成一个表。使用内联表值自定义函数可以提供参数化的视图功能。
内联表值自定义函数的语法结构如下所示:
CREATE FUNCTION function_name
([{@parameter_name scalar_ parameter_data_type [ = default ]}[,…n]])
RETURNS TABLE
[WITH ENCRYPTION]
[AS]
RETURN (select_statement)
该语法结构中各参数的含义与标量值函数语法机构中参数含义相似。([{@parameter_name scalar_ parameter_data_type [ = default ]}[,…n]])
RETURNS TABLE
[WITH ENCRYPTION]
[AS]
RETURN (select_statement)
例如创建一个内联表值函数来返回一个管理员负责的所有场馆信息,代码如下所示:
CREATE FUNCTION GetPalaestra(@Pid INT)
RETURNS TABLE
AS
RETURN
(
SELECT A.场馆名称,A.座位,A.状态,B.管理员名称
FROM 场馆信息A INNER JOIN 管理员信息B
ON A.管理员编号=B.管理员编号
WHERE B.管理员编号=@Pid
)
这里创建的函数名称为GetPalaestra,他的字符串参数@Pid指定要查询的班级编号,RETURNS TABLE指定这是一个内联表值函数。创建完成后,使用SELECT语句来查看管理员编号为102所负责的所有场馆信息,如图5-11所示。RETURNS TABLE
AS
RETURN
(
SELECT A.场馆名称,A.座位,A.状态,B.管理员名称
FROM 场馆信息A INNER JOIN 管理员信息B
ON A.管理员编号=B.管理员编号
WHERE B.管理员编号=@Pid
)
图4-14 使用内联表值函数
3.多语句表值函数
多语句表值自定义函数可以看作标量型和内联表值型函数的结合体。该类函数的返回值是一个表,但他和标量值自定义函数一样,有一个用BEGIN…END语句块中包含起来的函数体,返回值的表中的数据是由函数体中的语句插入的。由此可见,他可以进行多次查询,对数据进行多次筛选与合并,弥补了内联表值自定义函数的不足。
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式