5在SELECT语句中使用函数
除了列名和运算符之外,表达式还可包括一个或多个函数。本章说明如何在SELECT语句 中使用函数来执行更复杂的数据库查询和数据处理。
有关下列SQL函数以及其它SQL函数的语法的信息,请参阅《GBase 8s SQL指南:语 法》中表达式段。
提示: 还可以使用您自己创建的函数。有关用户定义函数的信息,请参阅创建和使用SPL例 程和《GBase 8s用户定义的例程和数据类型开发者指南》。
5.1在SELECT语句中使用函数
可以在选择列表中使用任何基本类型的表达式(列、常量、函数、聚集函数和过程)或它 们的组合。
函数表达式使用对查询中的每一行进行求值的函数。所有函数表达式都需要参数。当在列 名用作参数的情况下使用这一组表达式时,这些表达式包含时间函数和长度函数。
5.1.1聚集函数
聚集函数对一组查询返回一个值。聚集函数取用依赖于SELECT语句的WHERE子句返 回的一组行的值。没有WHERE子句时,聚集函数取用依赖于FROM子句组成的所有行 的值。
不能将聚集函数用于包含下列数据类型的表达式中:
•不透明数据类型(支持不透明数据类型的用户定义的聚集函数除外)
聚集通常用于总结有关表中的行组的信息。此用法在编写高级SELECT语句中讨论。当将 聚集函数应用于整个表时,结果将包含总结所有选择的行的一行。
所有的GBase 8s数据库服务器都支持下列聚集函数。
AVG函数
下列查询计算stock表中所有行的平均值unit_price。
图:查询
SELECT AVG (unit_price) FROM stock;
图:查询结果
(avg)
$197.14
下列查询只计算stock表中manu_code为SHM的那些行的平均值unit_price。
图:查询
SELECT AVG (unit_price) FROM stock WHERE manu_code = 'SHM';
图:查询结果
(avg)
$204.93
COUNT函数
下列查询对stock表中的总行数进行计数和显示。
图:查询
SELECT COUNT(*) FROM stock;
图:查询结果
(count(*))
73
下列查询包含WHERE子句来对stock表中的特定行(在此示例中, 是manu_code为SHM的那些行)进行计数。
图:查询
SELECT COUNT (*) FROM stock WHERE manu_code = 'SHM';
图:查询结果
(count(*))
17
通过包含DISTINCT关键字(或它的同义词UNIQUE)和列名,可以计算stock表中不同 制造商代码的数目。
图:查询
SELECT COUNT (DISTINCT manu_code) FROM stock;
图:查询结果
(count)
9
MAX和MIN函数
可以在同一 SELECT语句中组合聚集函数。例如,可以同时在选择列表中包
括MAX和MIN函数。如下所示。
图:查询
SELECT MAX (ship_charge), MIN (ship_charge) FROM orders;
该查询查找并显示orders表中的最大和最小ship_charge。
图:查询结果
(max) (min)
$25.20 $5.00
RANGE函数
RANGE函数计算所选行的最大值与最小值之差。
只能将RANGE函数应用于数字列。下列查询查找stock表中商品的价格范围。
图:查询
SELECT RANGE(unit_price) FROM stock;
图:查询结果
(range)
955.50
对于其它聚集函数,当查询包括GROUP BY子句时,RANGE函数适用于组的行,如下所 示。
图:查询
SELECT RANGE(unit_price) FROM stock
GROUP BY manu_code;
图:查询结果
(range)
820.20
720.00
225.00
0.00
460.00
645.90
425.00
STDEV函数
STDEV函数计算所选行的标准偏差。它是VARIANCE函数的平方根。.
可将STDEV函数应用于数字列。下列查找入口的标准偏差:
SELECT STDEV(age) FROM u_pop WHERE age > 21;
对于其它聚集,当查询包括GROUP BY子句时,STDEV函数适用于组的行。如下所示:
SELECT STDEV(age) FROM u_pop
GROUP BY state
WHERE STDEV(age) > 21;
除非指定列中的每个值都是空值,否则会忽略空值。如果每个列值都是空值,那么STDEV函 数对该列返回空值。有关STDEV函数的更多信息,请参阅《GBase 8s SQL指南:语法》 中的表达式段。
SUM函数
下列查询计算1998年7月13日交付的所有订单的总ship_weight。
图查询
SELECT SUM (ship_weight) FROM orders
WHERE ship_date = '07/13/1998';
图: 查询结果
(sum)
130.5
VARIANCE 函数
VARIANCE函数返回值样本的方差作为所有选择行的方差的无偏估计。它计算以下值:
(SUM(Xi**2) - (SUM(Xi)**2)/N)/(N-1)
在此示例中,Xi是列中的每个值,N是列中值的总数。只能将VARIANCE函数应用于数 字列。以下查询查找入口的标准偏差:
SELECT VARIANCE(age) FROM u_pop WHERE age > 21;
对于其它聚集,当查询包括GROUP BY子句时,VARIANCE函数适用于组的行。如下所 示:
SELECT VARIANCE(age) FROM u_pop
GROUP BY birth
WHERE VARIANCE(age) > 21;
除非指定列中的每个值都是空值,否则会忽略空值。如果每个列值都是空值,那
么VARIANCE函数对该列返回空值。有关VARIANCE函数的更多信息,请参阅《GBase 8s SQL指南:语法》中的表达式段。
下列查询显示如何将函数应用于算术表达式并为其结果提供显示标签:
图:查询
SELECT MAX (res_dtime - call_dtime) maximum,
MIN (res_dtime - call_dtime) minimum, AVG (res_dtime - call_dtime) average FROM cust_calls;
该查询查找和显示收到和处理客户来电之间的最长、最短和平均时间(以日、小时和分钟 计)并相应地标记派生值。该查询结果显示这些时间量。
图:查询结果
maximum minimum average
5 20:55 0 00:01 1 02:56
5.1.2时间函数
可以在查询的Projection子句或 WHERE子句中使用时间函数DAY、MONTH、
WEEKDAY和YEAR。这些函数返回与用来调用函数的表达式或参数对应的值。还可以使 用CURRENT或SYSDATE函数返回具有当前日期和时间的值,或者使用EXTEND函数调 整 DATE 或 DATETIME 值。
DAY 和 CURRENT 函数
下列查询在两个expression列中对call_dtime和res_dtime列返回日期(一个月中的某一 天)。
图:查询
SELECT customer_num, DAY (call_dtime), DAY (res_dtime) FROM cust_calls;
图:查询结果
customer_num (expression) (expression)
106 |
12 |
12 |
110 |
7 |
7 |
119 |
1 |
2 |
121 |
10 |
10 |
127 |
31 |
|
116 |
28 |
28 |
116 |
21 |
27 |
下列查询使用DAY和CURRENT函数来将列值与当前日期(月中某日)进行比较。它只 选择值比当前日期早的那些行。在此示例中,CURRENT日是15。
图:查询
SELECT customer_num, DAY (call_dtime), DAY (res_dtime)
FROM cust_calls
WHERE DAY (call_dtime) < DAY (CURRENT);
图:查询结果
customejnum (expression) (expression) |
||
106 |
12 |
12 |
110 |
7 |
7 |
119 |
1 |
2 |
121 |
10 |
10 |
下列查询使用CURRENT函数来选择除今天打的电话之外的所有来电。
图:查询
SELECT customer_num, call_code, call_descr
FROM cust_calls
WHERE call_dtime < CURRENT YEAR TO DAY;
图:查询结果
customer_num 106
call_code D
call_descr Order was received, but two of the cans of ANZ tennis balls
within the case were empty
customer_num 110
call_code L
call_descr Order placed one month ago (6/7) not received.
customer_num 116
call_code I
call_descr Second complaint from this customer! Received two cases right-handed outfielder gloves (1 HRO) instead of one case lefties.
SYSDATE函数与CURRENT函数及其类似,但当未指定DATETIME限定符时,其返回 值的缺省精度是DATETIME YEAR TO FRACTION。),而不是CURRENT的缺省精度 DATETIME YEAR TO FRACTION^)。
MONTH函数
下列查询使用MONTH函数来抽取和显示在哪个月份接收和处理客户来电,并且它将对结 果列使用显式标签。但是,它不区分年份。
图查询
SELECT customer_num,
MONTH (call_dtime) call_month,
MONTH (res_dtime) res_month
FROM cust_calls;
图: 查询结果
customer_num call_month res_month
106 6 6
110 7 7
119 |
7 |
7 |
121 |
7 |
7 |
127 |
7 |
|
116 |
11 |
11 |
116 |
12 |