As funções agregadas são compostas por MAX, MIN, AVG, SUM e COUNT e cada uma delas executa uma tarefa específica.
Visão geral
Funções agregadas são utilizadas a todo momento pelo desenvolvedor. Elas operam em um conjunto de linhas para fornecer um resultado por grupo, sendo esse conjunto de linhas uma tabela inteira ou a uma divisão em grupos.
Para este exemplo, considere a estrutura de tabelas abaixo, onde temos uma tabela chamada produto (Tabela 1), responsável por armazenar todos os produtos do estoque do cliente, a tabela categoria_produto (Tabela 2), responsável por armazenar todas as categorias existentes no banco de dados, e a tabela venda_produto (Tabela 3), que relaciona os produtos que foram vendidos.
id | nome | preco | Id_categoria |
1 | Bola | 35.00 | 1 |
2 | Patinete | 120.00 | 1 |
3 | Carrinho | 15.00 | 1 |
4 | Skate | 296.00 | 1 |
5 | Notebook | 3500.00 | 2 |
6 | Monitor LG 19 | 450.00 | 2 |
7 | O Diário de Anne Frank | 45.00 | 3 |
8 | O dia do Curinga | 65.00 | 3 |
9 | O mundo de Sofia | 48.00 | 3 |
10 | Através do Espelho | 38.00 | 3 |
id | nome |
1 | Infantil |
2 | Informatica |
3 | Educacional |
id | id_produto | valor | data |
1 | 1 | 35.00 | 2018-05-15 |
2 | 1 | 35.00 | 2018-06-15 |
3 | 1 | 35.00 | 2018-07-15 |
4 | 2 | 120.00 | 2018-07-15 |
5 | 2 | 120.00 | 2018-07-14 |
6 | 3 | 15.00 | 2018-07-15 |
7 | 7 | 45.00 | 2018-07-15 |
8 | 8 | 65.00 | 2018-07-15 |
9 | 8 | 65.00 | 2018-07-16 |
10 | 9 | 48.00 | 2018-07-16 |
11 | 5 | 3500.00 | 2018-07-16 |
12 | 5 | 3500.00 | 2018-07-16 |
13 | 6 | 450.00 | 2018-07-16 |
Suponhamos que seja necessário saber exatamente qual o maior preço entre todos os produtos cadastrados na tabela produto. Para isso, podemos utilizar a função MAX, conforme a query abaixo:
SELECT
MAX(preco) as MAIOR_PRECO
FROM
produto
Observe que, conforme código acima e ilustrado na Tabela 4, trouxemos o valor máximo da coluna preco através da função MAX.
MAIOR_PRECO |
3500.00 |
Sintaxe
SELECT
[ funcao-agregadora ]( [ coluna ] )
FROM
[ tabela1, tabela2, … | * ]
Na pratica
Exemplo 1
Aproveitando a mesma estrutura da tabela, podemos trazer o maior preço por categoria, conforme o trecho de código abaixo:
SELECT
C.nome as Categoria,
MAX(preco) as MAIOR_PRECO
FROM
Produto P, categoria_produto C
WHERE
P.id_categoria = C.id
GROUP BY
C.id
O resultado da query acima nos trás o preço maior por cada categoria cadastrada no banco de dados. Nas linhas 1 e 2 selecionamos o nome da categoria, nomeada como Categoria, e em seguida, na linha 3 selecionamos o maior valor da coluna preco, através da função MAX, nomeando a coluna como MAIOR_PRECO.
Nas linhas 4 e 5 informamos que a consulta irá se realizar nas tabelas Produto, nomeada de P, e categoria_produto, nomeada de C.
Em seguida, nas linhas 6 e 7 definimos que a consulta deve atender ao filtro de o id do produto ser o mesmo nas duas tabelas, realizando assim o vínculo entre elas.
Por fim, nas linhas 8 e 9 agrupamos o resultado pelo id da categoria.
O resultado pode ser visto na Tabela 5.
Categoria | MAIOR_PRECO |
infantil | 296.00 |
Informatica | 3500.00 |
Educacional | 65.00 |
Exemplo 2
Da mesma forma, podemos utilizar a função MIN, que é responsável por trazer o menor valor de uma coluna em uma determinada consulta.
SELECT
C.nome as Categoria,
MIN(preco) as MENOR_PRECO
FROM
Produto P, categoria_produto C
WHERE
P.id_categoria = C.id
GROUP BY
C.id
O resultado da query pode ser visto na Tabela 6.
Categoria | MENOR_PRECO |
infantil | 15.00 |
Informatica | 450.00 |
Educacional | 38.00 |
Exemplo 3
Outra função agregada seria COUNT, responsável por trazer o total de ocorrências da coluna informada.
Suponha que seja necessário saber exatamente qual a quantidade de produtos existentes no banco de dados. Para isso, podemos utilizar a função COUNT, conforme trecho de código abaixo:
SELECT
COUNT(id) as TOTAL
FROM
produto
Como podemos ver no trecho de código acima, e ilustrado na Tabela 7, conseguimos o total de produtos através da função COUNT.
TOTAL |
10 |
Exemplo 4
Podemos também pegar essa mesma consulta de total de produtos, porém dessa vez agrupados por categoria, ou seja, saberemos exatamente qual a quantidade total de produtos por categoria. Para isso, podemos executar a query abaixo:
SELECT
C.nome as Categoria,
COUNT(P.id) as TOTAL_PRODUTOS
FROM
Produto P, categoria_produto C
WHERE
P.id_categoria = C.id
GROUP BY
C.id
Como podemos ver no trecho de código acima e na Tabela 8, a query é capaz de trazer o total de produtos separados por categoria.
Categoria | TOTAL |
infantil | 4 |
Informatica | 2 |
Educacional | 4 |
Exemplo 5
Suponhamos agora que seja necessário saber exatamente quanto ganhamos com cada produto até o momento, ou seja, olharemos na tabela vendas_produto o valor total recebido com cada produto.
Para isso podemos utilizar o seguinte trecho de código:
SELECT
P.nome,
SUM(V.valor) as TOTAL_RECEBIDO
FROM
produto P, venda_produto V
WHERE P.id = V.id_produto
GROUP BY P.id
No trecho de código acima e ilustrado na Tabela 9, utilizamos a função SUM para somar os valores de venda de um determinado produto e retornar na consulta.
Na linha 3 utilizamos a função SUM na coluna valor da tabela venda produto e demos o nome de TOTAL_RECEBIDO.
Na linha 5 definimos que será feita a busca em duas tabelas, a tabela produto, nomeada de P, e na tabela venda_produto, nomeada de V.
Na linha 6 definimos que para essa soma acontecer, é necessário que o ID do produto seja o mesmo na tabela de venda_produto, assim, somaremos somente os valores de produtos iguais.
nome | TOTAL_RECEBIDO |
Bola | 105.00 |
Patinete | 240.00 |
Carrinho | 15.00 |
Notebook | 7000.00 |
Monitor LG 19 | 450.00 |
O Diário de Anne Frank | 45.00 |
O dia do Curinga | 130.00 |
O mundo de Sofia | 48.00 |
Exemplo 6
Outra função agregada seria a AVG que traz a média de valores de uma determinada coluna informada na consulta. Suponhamos que seja necessário agora saber a média de preço dos produtos cadastrados.
SELECT
AVG(preco) as PRECO_MEDIO
FROM
produto
No trecho de código acima, selecionamos a média de preço de todos os produtos cadastrados no banco de dados, nomeando a coluna da média como PRECO_MEDIO. O resultado pode ser visto na Tabela 10.
PRECO_MEDIO |
461.20 |
Exemplo 7
Agora um exemplo mais complexo, suponha que desejamos trazer a média de preço de todos os produtos, agrupados por categoria, trazendo também a quantidade de produtos em cada uma delas. Para isso temos o trecho de código abaixo:
SELECT
C.nome as Categoria,
COUNT(P.ID) as TOTAL_DE_PRODUTOS,
AVG(P.preco) as PRECO_MEDIO
FROM
produto P, categoria_produto C
WHERE
P.id_categoria = C.id
GROUP BY
C.id
No trecho de código acima, nas linhas 1 e 2 selecionamos o nome da categoria, nomeando a coluna de Categoria e, em seguida, na linha 3 selecionamos o total de ID de produtos através da função COUNT, nomeando a coluna de TOTAL_DE_PRODUTOS.
Na linha 4 selecionamos a média de valor da coluna preco da tabela produto, nomeando a coluna de PRECO_MEDIO e, em seguida, nas linhas 5 e 6 informamos que a consulta será feita na tabela produto, nomeada de P, e na tabela categoria_produto, nomeada de C.
Nas linhas 7 e 8 filramos a consulta a fim de trazer somente resultados onde o id de produto seja o mesmo nas duas tabelas, realizando assim o vínculo entre elas.
E por fim, nas linhas 9 e 10 agrupamos o resultado pelo id da categoria.
O resultado da query pode ser vista na Tabela 11.
Categoria | TOTAL_DE_PRODUTOS | PRECO_MEDIO |
infantil | 4 | 116.50 |
Informatica | 2 | 1975.00 |
Educacional | 4 | 49.00 |