As funções de agregação retornam um valor único como resultado de um conjunto de valores de entrada. A Tabela 9-45 mostra as funções de agregação nativas. 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-45. 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: 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()
ecount()
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()
ecount()
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()
emax()
. 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.