在查询中使用函数
函数经常和查询表达式结合使用来修改列值。这只需将列名作为参数传递给函数即可,随后函数将引用插入到SELECT查询的列的列表中,如下所示:
SELECT Title, NationalIDNumber, YEAR(BirthDate) AS BirthYear FROM HumanResources.Employee 在这个例子中,BirthDate列的值被作为参数传递给YEAR()函数。函数的结果是别名为BirthYear的列。 嵌套函数
我们需要的功能常常不能仅由一个函数来实现。根据设计,函数应尽量简单,用于提供特定的功能。如果一个函数要执行许多不同的操作,就变得复杂和难以使用。因此,每个函数通常仅执行一个操作,要实现所有的功能,可以将一个函数的返回值传递给另一个函数,这称为嵌套函数调用。
以下是一个简单的例子:GETDATE()函数的作用是返回当前的日期与时间,但不能返回经过格式化的数据,因为这是CONVERT()函数的功能。要想同时使用这两个函数,可以把GETDATE()函数的输出作为CONVERT()函数的输入参数。 SELECT CONVERT(Varchar(20), GETDATE(), 101) 聚合函数
报表的典型用途是从全部数据中提取出代表一种趋势的值或者汇总值,这就是聚合的意义。聚合函数回答数据使用者的如下问题:
上个月鸡雏的总销售量是多少?
19~24岁之间的巴西男性在食品调味品上的平均支出是多少? 上季度所有订单中从订购到运输的最长时间是多少? 收发室里仍在工作的最老的员工是谁?
聚合函数应用特定的聚合操作并返回一个标量值(单一值)。返回的数据类型对应于该列或者传递到函数中的值。聚合经常和分组、累积以及透视等表运算一起使用,生成数据分析结果。第7章将详细介绍这个主题,这里仅讨论简单SELECT查询中的一些常用函数。
聚合函数不仅可用在SELECT查询中,还可以和标量输入值一起使用。那么,这样做的意义是什么呢?在下列代码中,将值15传递给下列聚合函数,每个函数的返回值都相同: SELECT AVG(15) SELECT SUM(15) SELECT MIN(15) SELECT MAX(15) 它们都返回15。虽然,对同一个值求平均、求和、求最小值、求最大值,所得的结果还是那个值。如果对一个值计数,又会产生什么结果呢?
SELECT COUNT(15)
得到的值是1,因为函数只计数了一个值。
现在做一些有意义的事。聚合函数只有在处理结果集合中的一组数据时才有意义。每个函数都处理某列的非空值。除非使用分组操作(详见第7章),否则不能在同一个SELECT语句中既返回聚合的值,又返回常规的列值。 AVG()函数
AVG()函数用于返回一组数值中所有非空数值的平均值。例如,表6-2包含了体操成绩。 表 6-2 体操运动员 Sara Cassie Delaney Sammi Erika Sara Cassie Delaney Sammi Erika 对这些数据执行以下查询: SELECT AVG(Score) 结果是8.965。
如果有三个女孩没有完成一些项目,在表中没有记录成绩,则可用NULL来表示(见表6-3)。
项 目 跳马 跳马 跳马 跳马 跳马 平衡木 平衡木 平衡木 平衡木 平衡木 成 绩 9.25 8.75 9.25 8.05 8.60 9.70 9.00 9.25 8.95 8.85 表 6-3 体操运动员 Sara Cassie Delaney Sammi Erika Sara Cassie Delaney Sammi Erika 脚本:
create table #GymEvent(Player varchar(10),[Subject] nvarchar(5),Score decimal(4,2)) go insert into #GymEvent values('Sara','跳马',9.25) insert into #GymEvent values('Cassie','跳马',8.75) insert into #GymEvent values('Delaney','跳马',NULL) insert into #GymEvent values('Sammi','跳马',8.05) insert into #GymEvent values('Erika','跳马',8.60) insert into #GymEvent values('Sara','平衡木',9.70) insert into #GymEvent values('Cassie','平衡木',NULL) insert into #GymEvent values('Delaney','平衡木',9.25) insert into #GymEvent values('Sammi','平衡木',NULL) 项 目 跳马 跳马 跳马 跳马 跳马 平衡木 平衡木 平衡木 平衡木 平衡木 成 绩 9.25 8.75 NULL 8.05 8.60 9.70 NULL 9.25 NULL 8.85 insert into #GymEvent values('Erika','平衡木',8.85) go drop table #GymEvent 在这种情况下,计算平均值时只考虑实际的数值,NULL不参与运算,结果是8.921429。 但是,如果把缺少的成绩也算在内,即用数值0代替NULL,则会严重影响最终成绩(6.245),她们能不能进入国家级的比赛就难说了。 COUNT()函数
COUNT()函数用于返回一个列内所有非空值的个数,这是一个整型值。比如,在上一个例子中,体操数据被保存在#GymEvent表中,要确定Sammi参加的项目数,则可以执行下列查询:
SELECT COUNT(Score) FROM #GymEvent WHERE Player='Sammi' 结果是1,因为Sammi只参加了跳马比赛,她的平衡木成绩是NULL。 如果需要确定表中的行数,无论这些行是不是NULL值,都可以使用以下语法: SELECT COUNT (*) FROM #GymEvent 以Sammi为例,COUNT(*)查询如下所示:
SELECT COUNT(*) FROM #GymEvent WHERE Player='Sammi' 由于COUNT(*)函数会忽略NULL值,所以这个查询的结果是2。 MIN()与MAX()函数
MIN()函数用于返回一个列范围内的最小非空值;MAX()函数用于返回最大值。这两个函数可以用于大多数的数据类型,返回的值根据对不同数据类型的排序规则而定。为了说明这两个函数,假设有一个表包含了两列值,一列是整型值,另一列是字符型值,如表6-4所示。
表 6-4
IntegerColumn(int类型) 2 4 12 19 脚本:
create table #Temp(IntegerColumn int,VarCharColumn varchar(10)) 2 4 12 19 VarCharColumn(varChar类型)