GBase 8s SQL 指南:教程———5在SELECT语句中使用函数

5SELECT语句中使用函数

除了列名和运算符之外,表达式还可包括一个或多个函数。本章说明如何在SELECT语句 中使用函数来执行更复杂的数据库查询和数据处理。

有关下列SQL函数以及其它SQL函数的语法的信息,请参阅《GBase 8s SQL指南:语 法》中表达式段。

提示: 还可以使用您自己创建的函数。有关用户定义函数的信息,请参阅创建和使用SPL例 程和《GBase 8s用户定义的例程和数据类型开发者指南》。

5.1SELECT语句中使用函数

可以在选择列表中使用任何基本类型的表达式(列、常量、函数、聚集函数和过程)或它 们的组合。

函数表达式使用对查询中的每一行进行求值的函数。所有函数表达式都需要参数。当在列 名用作参数的情况下使用这一组表达式时,这些表达式包含时间函数和长度函数。

5.1.1聚集函数

聚集函数对一组查询返回一个值。聚集函数取用依赖于SELECT语句的WHERE子句返 回的一组行的值。没有WHERE子句时,聚集函数取用依赖于FROM子句组成的所有行 的值。

不能将聚集函数用于包含下列数据类型的表达式中:

  • TEXT
  • BYTE
  • CLOB
  • BLOB
  • 集合数据类型(LISTMULTISETSET
  • ROW 类型

不透明数据类型(支持不透明数据类型的用户定义的聚集函数除外)

聚集通常用于总结有关表中的行组的信息。此用法在编写高级SELECT语句中讨论。当将 聚集函数应用于整个表时,结果将包含总结所有选择的行的一行。

所有的GBase 8s数据库服务器都支持下列聚集函数。

AVG函数

下列查询计算stock表中所有行的平均值unit_price

图:查询

SELECT AVG (unit_price) FROM stock;

图:查询结果

(avg)

$197.14

下列查询只计算stock表中manu_codeSHM的那些行的平均值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_codeSHM的那些行)进行计数。

图:查询

SELECT COUNT (*) FROM stock WHERE manu_code = 'SHM';

图:查询结果

(count(*))

17

通过包含DISTINCT关键字(或它的同义词UNIQUE)和列名,可以计算stock表中不同 制造商代码的数目。

图:查询

SELECT COUNT (DISTINCT manu_code) FROM stock;

图:查询结果

(count)

9

MAXMIN函数

可以在同一 SELECT语句中组合聚集函数。例如,可以同时在选择列表中包

MAXMIN函数。如下所示。

图:查询

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

595.50

720.00

225.00

632.50

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函数

下列查询计算1998713日交付的所有订单的总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子句中使用时间函数DAYMONTH

WEEKDAYYEAR。这些函数返回与用来调用函数的表达式或参数对应的值。还可以使 用CURRENTSYSDATE函数返回具有当前日期和时间的值,或者使用EXTEND函数调 整 DATE DATETIME 值。

DAY  CURRENT 函数

下列查询在两个expression列中对call_dtimeres_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

下列查询使用DAYCURRENT函数来将列值与当前日期(月中某日)进行比较。它只 选择值比当前日期早的那些行。在此示例中,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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值