É comum que uma aplicação necessite de informações resumidas. Obter a menor/maior venda do dia é apenas um exemplo dessa situação. A linguagem SQL contém funções nativas para esse fim, que podem ser usadas para agregar um conjunto de valores em um único resultado.
Neste documento apresentaremos as principais funções de agregação da linguagem SQL.
Sintaxe
Uma função de agregação processa um conjunto de valores contidos em uma única coluna de uma tabela e retorna um único valor como resultado. Sua sintaxe é semelhante aquela encontrada em muitas linguagens de programação. Contudo, o parâmetro informado é sempre a coluna cujos valores desejamos processar.
Vemos a seguir um exemplo da sintaxe dessa cláusula.
nome-da-funcao(coluna)
Podemos informar na listagem de colunas do comando SELECT uma ou mais funções de agregação, de acordo com a necessidade:
SELECT
[função(ões) de agregação/coluna(s)]
FROM
[tabela(s)]
Tabelas de exemplo
Para acompanhar os exemplos apresentados nessa documentação, considere a Tabela 1.
MAX
A função MAX analisa um conjunto de valores e retorna o maior entre eles. No exemplo abaixo utilizamos essa função para encontrar o preço de venda mais alto:
SELECT
max(precovenda)
FROM
produtos
Ao final da execução desse comando será retornado o valor 14.00, como mostra a Figura 1.
MIN
MIN analisa um grupo de valores e retorna o menor entre eles. A seguir utilizamos essa função para conhecer o preço de venda mais baixo:
SELECT
min(precovenda)
FROM
produtos
Como retorno para esse comando, obteremos o valor 1.00 conforme mostra a Figura 2.
SUM
A função SUM realiza a soma dos valores em uma única coluna e retorna esse resultado. Para somar todos os preços de venda dos produtos de uma categoria, podemos utilizar essa função informando a coluna PrecoVenda, como exemplificado a seguir:
SELECT
sum(precovenda)
FROM
produtos
WHERE
categoria = 1
Ao final da execução desse comando, teremos o valor 6.65, como mostra a Figura 3.
AVG
Com a função AVG podemos calcular a média aritmética dos valores em uma única coluna. Usamos essa função no exemplo a seguir, tomando como parâmetro a coluna PrecoVenda da tabela produtos.
SELECT
avg(precovenda)
FROM
produtos
Ao final da execução desse comando teremos o valor aproximado 5.41, com mostra a Figura 4.
COUNT
A função COUNT retorna o total de linhas selecionadas. Ela pode receber por parâmetro o nome da coluna ou um asterisco. Por padrão, quando informado o nome de uma coluna, valores do tipo null são ignorados, mas quando informado * todas as linhas serão contabilizadas.
Para sabermos o total de produtos em uma categoria, podemos escrever uma consulta como esta:
SELECT
count(precovenda)
FROM
produtos
WHERE
categoria = 1
GROUP BY
Ao utilizar a cláusula GROUP BY dividimos os registros que serão agregados em grupos de valores. Essa mudança faz com que tenhamos mais de uma linha como resultado, pois o processamento será realizado uma vez sobre cada um desses grupos.
Para sabermos o produto com maior valor de venda de cada categoria, podemos escrever uma consulta como esta:
SELECT
categoria,
max(precovenda)
FROM
produtos
GROUP BY categoria
Considerando a tabela de produtos, quando essa consulta for executada os dados serão divididos em dois grupos, um para cada categoria, como podemos observar nas Figuras 5 e 6.
Logo após, a função MAX será aplicada uma vez para cada um desses grupos, fazendo com que tenhamos como resultado os seguintes valores apresentados na Figura 7.
Note que o primeiro registro se refere aos produtos com categoria 1, sendo o segundo o valor máximo dentre os preços de venda dos produtos de categoria 2.
HAVING
Podemos usar a cláusula HAVING em conjunto com GROUP BY para filtrar os resultado que serão submetidos a agregação.
Vemos um exemplo desse filtro na consulta abaixo, que lista o maior preço de venda de cada categoria, incluindo apenas os produtos com preço de venda maior que 10:
SELECT
categoria,
max(precovenda)
FROM
produtos
GROUP BY categoria
HAVING max(precovenda) > 10
Ao final dessa consulta obtemos os valores apresentados na Figura 8.
ALIAS
A fim de facilitar a compreensão do SQL, podemos utilizar a palavra-chave as para criar um apelido para uma coluna. Uma vez que as funções de agregação são retornadas como tal, também podemos fazer uso desse recurso como exemplificado a seguir:
SELECT
categoria,
max(precovenda) as maximo_preco_venda
FROM
produtos
GROUP BY categoria
HAVING max(precovenda) > 10
Ao final da execução desse código teremos a coluna maximo_preco_venda contendo o maior preço de venda, como mostra a Figura 9.
Exemplo prático
No exemplo a seguir listamos as categorias que contém produtos cujas médias dos preços de custo exceda 2. Para isso agrupamos as categorias com a cláusula GROUP BY e filtramos os totais maiores que 2 com HAVING:
SELECT
categoria,
avg(precocusto) as media_preco_custo
FROM
produtos
GROUP BY categoria
HAVING avg(precocusto) > 2
Uma vez que apenas a categoria 2 possui registro que atendem ao filtro estabelecido, receberemos um único registro como resposta, que pode ser observado na Figura 10.