As funções de agregação retornam um único valor como resultado de um conjunto de valores de entrada. A Tabela 9-39 mostra as funções de agregação internas. As considerações especiais sobre a sintaxe das funções de agregação são explicadas na Seção 4.2.7. Consulte a Seção 2.7 para obter informações introdutórias adicionais.
Tabela 9-39. Funções de agregação
Deve ser observado que, com exceção do count, estas funções retornam o valor nulo quando nenhuma linha for selecionada. Em particular, sum de nenhuma linha retorna nulo, e não zero como poderia ser esperado. A função coalesce pode ser utilizada para substituir nulo por zero quando for necessário.
Nota: As agregações booleanas bool_and e bool_or correspondem às agregações do padrão SQL every e any ou some. Para any e some parece haver uma ambigüidade na sintaxe do padrão:
SELECT b1 = ANY((SELECT b2 FROM t2 ...)) FROM t1 ...;Neste caso ANY pode ser considerada tanto como levando a uma subconsulta quanto a uma agregação, se a expressão de seleção retornar 1 linha. Portanto, não pode ser dado o nome padrão a estas agregações.
Nota: Os usuários acostumados a trabalhar com outros sistemas gerenciadores de banco de dados SQL podem ficar surpresos com as características de desempenho de certas funções de agregação do PostgreSQL, quando a agregação é aplicada a toda a tabela (em outras palavras, não é especificada nenhuma cláusula WHERE). Em particular, uma consulta como
SELECT min(col) FROM alguma_tabela;será executada pelo PostgreSQL usando a varredura seqüencial de toda a tabela. Outros sistemas de banco de dados podem otimizar as consultas deste tipo utilizando um índice na coluna, caso esteja disponível. De maneira semelhante, as funções de agregação max() e count() sempre requerem que seja aplicada uma varredura seqüencial em toda a tabela no PostgreSQL.
O PostgreSQL não pode implementar facilmente esta otimização, porque também permite consultas em agregações definidas pelo usuário. Uma vez que min(), max() e count() são definidas usando uma API genérica para funções de agregação, não há dispositivo para executar casos especiais destas funções sob certas circunstâncias.
Felizmente existe um recurso simples para contornar os problemas com min() e max(). A consulta mostrada abaixo é equivalente à consulta acima, exceto que tira vantagem de um índice B-tree, caso algum esteja presente na coluna em questão.
SELECT col FROM alguma_tabela ORDER BY col ASC LIMIT 1;Pode ser utilizada Uma consulta semelhante (obtida trocando DESC por ASC na consulta acima) no lugar de max()).
Infelizmente, não existe uma consulta trivial semelhante que possa ser utilizada para melhorar o desempenho do count() aplicado a toda a tabela.