Um agregado por grupo
Quase nunca queremos um único número para a tabela inteira, mas sim um por
categoria, por cliente, por mês.... É para isso que serve o GROUP BY: divide
as linhas em grupos conforme os valores de uma coluna e aplica a função
agregada a cada grupo separadamente.
SELECT categoria, AVG(preco) AS preco_medio
FROM produtos
GROUP BY categoria;
Isso retorna uma linha por cada categoria distinta, com o preço médio dos produtos dessa categoria.
O que pode ir no SELECT
Esta é a regra de ouro: quando há GROUP BY, no SELECT só podem
aparecer:
- As colunas pelas quais você agrupa (as que estão no
GROUP BY). - Funções agregadas (
COUNT,SUM,AVG...).
Colocar uma coluna "normal" que não esteja no GROUP BY não faz sentido: o
grupo tem muitas linhas e esse campo pode ter valores diferentes em cada uma.
-- Produtos e estoque total por categoria, do maior ao menor estoque
SELECT categoria, SUM(estoque) AS estoque_total
FROM produtos
GROUP BY categoria
ORDER BY estoque_total DESC;
ORDER BYé aplicado depois de agrupar, então você pode ordenar pelo próprio agregado (pelo seu alias ou repetindo a função).