9.15. 聚合函数 #
聚合函数从一组输入值计算单个结果。表 9.43展示了内置的聚合函数。聚合函数的特殊语法注意事项在第 4.2.7 节中说明。更多入门信息请参见第 2.7 节。
表 9.43. 聚合函数
应当注意,除了 count 之外,这些函数在没有选中任何行时都返回空值。特别地,没有行时 sum 返回空值,而不是人们可能预期的零。必要时可以使用 coalesce
函数把空值替换为零。
注意
习惯于其他 SQL 数据库管理系统的用户可能会对
PostgreSQL 中某些聚合函数在聚合应用于整个表(换句话说,没有指定
WHERE 子句)时的性能特征感到惊讶。特别地,像
SELECT min(col) FROM sometable;
这样的查询会被 PostgreSQL 用整个表的顺序扫描来执行。其他数据库系统可能会把这种形式的查询优化为使用该列上的索引(如果可用的话)。类似地,在
PostgreSQL 中,聚合函数
max() 和 count()
应用于整个表时也总是需要顺序扫描。
PostgreSQL无法轻易实现这种优化,因为它还允许用户定义的聚合查询。由于min()、max()和count()是用聚合函数的通用 API 定义的,因此没有为在某些情况下特殊处理这些函数的执行提供机制。
幸运的是,min() 和
max() 有一个简单的变通方法。下面显示的查询与上面的查询等价,只是如果所讨论的列上存在 B-tree 索引,它可以利用该索引。
SELECT col FROM sometable ORDER BY col ASC LIMIT 1;
类似的查询(把上面查询中的 ASC
替换为 DESC)可以用于代替
max())。
遗憾的是,没有类似的简单查询可以用来提高count()应用于整个表时的性能。