↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
测试与开发版本: 19 / devel
不受支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1
历史版本PostgreSQL 8.0 已于 2010 年 10 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本。

9.15. 聚合函数 #

聚合函数从一组输入值计算单个结果。表 9.37展示了内置的聚合函数。 聚合函数的特殊语法注意事项在第 4.2.7 节中说明。更多入门信息请参见第 2.7 节。

表 9.37. 聚合函数

Function Argument Type(s) Return Type 描述
avg(expression) smallint, integer, bigint, real, double precision, numeric, or interval 整数类型参数为numeric,浮点参数为double precision,否则与参数数据类型相同 所有输入值的平均值(算术平均)
bit_and(expression) smallint、integer、bigint 或 bit 与参数数据类型相同 所有非空输入值的按位与;没有非空输入时为 null
bit_or(expression) smallint、integer、bigint 或 bit 与参数数据类型相同 所有非空输入值的按位或;没有非空输入时为 null
bool_and(expression) bool bool 所有输入值都为真时返回真,否则返回假
bool_or(expression) bool bool 至少一个输入值为真时返回真,否则返回假
count(*)   bigint number of input values
count(expression) 任意 bigint expression 的值不为 null 的输入值数量
every(expression) bool bool 等价于 bool_and
max(expression) any numeric, string, or date/time type same as argument type 所有输入值中expression的最大值
min(expression) any numeric, string, or date/time type same as argument type 所有输入值中expression的最小值
stddev(expression) smallint, integer, bigint, real, double precision, or numeric 浮点参数为double precision,否则为numeric 输入值的样本标准差
sum(expression) smallint, integer, bigint, real, double precision, numeric, or interval smallint或integer参数为bigint,bigint参数为numeric,浮点参数为double precision,否则与参数数据类型相同 所有输入值中expression的总和
variance(expression) smallint, integer, bigint, real, double precision, or numeric 浮点参数为double precision,否则为numeric 输入值的样本方差(样本标准差的平方)

需要注意,除了count之外,这些函数在没有选中任何行时都会返回空值。特别地,sum在没有输入行时返回空值,而不是预期中的零。必要时,可以用coalesce函数把空值替换成零。

注意

布尔聚合bool_and和bool_or对应于标准 SQL 聚合every和any或some。至于any和some,标准语法似乎存在歧义:

SELECT b1 = ANY((SELECT b2 FROM t2 ...)) FROM t1 ...;

此处的ANY既可以被视为引入一个子查询,也可以在该子查询返回一行布尔值时被视为聚合函数。因此,不能将标准名称用于这些聚合。

注意

习惯于其他 SQL 数据库管理系统的用户,在聚合应用于整个表(换句话说,没有指定WHERE子句)时,可能会对PostgreSQL中某些聚合函数的性能特征感到惊讶。特别是,像下面这样的查询

SELECT min(col) FROM sometable;

将被PostgreSQL以顺序扫描整个表的方式执行。其他数据库系统可能会优化这种形式的查询,使其使用该列上的索引(如果有的话)。类似地,聚合函数max()和count()在PostgreSQL中应用于整个表时,也总是需要顺序扫描。

PostgreSQL无法轻易实现这种优化,因为它还允许用户定义的聚合查询。由于min()、max()和count()是用聚合函数的通用 API 定义的,因此没有为在某些情况下特殊处理这些函数的执行提供机制。

幸运的是,对于min()和max(),有一个简单的变通方法。下面显示的查询与上面的查询等价,只是当相关列上存在 B-tree 索引时,它可以利用该索引。

SELECT col FROM sometable ORDER BY col ASC LIMIT 1;

把上面查询中的ASC替换为DESC所得到的类似查询,可以用来代替max()。

遗憾的是,没有类似的简单查询可以用来提高count()应用于整个表时的性能。

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。