聚集函数 从一套输入值里计算一个结果。 Table 9-37 显示了内建聚集函数。 聚集函数的特殊语法在 Section 4.2.7里解释。请参考 Part I 获取附加的介绍性信息。
Table 9-37. 聚集函数
函数 | 参数类型 | 返回类型 | 描述 |
---|
avg(expression) | 所有输入值的均值(算术平均) | smallint, int, bigint, real, double precision, numeric, 或 interval. | 对于任何整数类型输入,结果都是 numeric 类型。 对于任何浮点输入,结果都是 double precision 类型。 否则和输入数据类型相同。 | 所有输入值的平均(算术平均)。 |
bit_and(expression) | smallint, int, bigint, 或者 bit | 和参数数据类型相同 | 所有非空输入值的按位 AND (与),如果没有,则为空 |
bit_or(expression) | smallint, int, bigint, 或者 bit | 和参数数据类型相同 | 所有非空输入值的按位 OR (或),如果没有,则为空 |
bool_and(expression) | bool | bool | 如果所有输入值都是真,则为真,否则为假 |
bool_or(expression) | bool | bool | 如果至少有一个输入值为真,则为着,否则为假 |
count(*) | | bigint | 输入值的个数 |
count(expression) | 任意 | bigint | 计算那些 expression 非 NULL 的输入的个数。 |
every(expression) | bool | bool | 等效于 bool_and |
max(expression) | 任何数组,数值,字串或者日期/时间类型 | 与参数同类型 | 所有输入值中, expression 的最大值 |
min(expression) | 任何数组,数值,字串或者日期/时间类型 | 与参数同类型 | 所有输入值中, expression 的最小值 |
stddev(expression) | smallint, int, bigint, real, double precision, 或numeric. | 浮点数参数时是double precision, 否则 numeric。 | 输入值的标准采样偏差(sample standard deviation) |
sum(expression) | smallint, int, bigint, real, double precision,numeric, 或者 interval | 对 smallint 或 int输入 输出类型为 bigint。对于bigint输入输出类型为 numeric, 浮点数输入的结果是double precision。 否则和输入数据类型相同。 | 所有输入值的 expression 的总和 |
variance(expression) | smallint, integer, bigint, real, double precision, 或者 numeric. | 浮点数参数是 double precision, 否则是 numeric。 | 输出值的采样方差(标准采样偏差的平方)。 |
请注意除了 count 以外, 这些函数在没有选中行时返回 NULL。 尤其要指出的是对零输入行进行 sum 将返回 NULL, 而不是我们预期的零。 必要时可以用 coalesce 把 NULL 替换成零。
注意: 布尔聚集 bool_and 和 bool_or 对应标准的 SQL 聚集 every 和 any 或者 some。对于 any 和 some, 标准语法里面似乎有些内置的歧义:
SELECT b1 = ANY((SELECT b2 FROM t2 ...)) FROM t1 ...;
这里的 ANY 既可以被认为是引出一个子查询,也可以认为是一个聚集(如果查询表达式返回 1 行电话)。 因此标准的名字无法用于这些聚集。
注意: 习惯了其它 SQL 数据库管理系统的用户可能被用在全表计算的 count 的性能惊住了。 一个类似下面这样的查询:
SELECT count(*) FROM sometable;
将会被 PostgreSQL 用全表扫描执行。