Ao trabalhar com SQL, duas cláusulas frequentemente causam confusão para iniciantes e até mesmo usuários intermediários: ORDER BY e GROUP BY. À primeira vista, podem parecer semelhantes — ambas organizam resultados de consultas de alguma forma. No entanto, elas têm finalidades muito diferentes.
Neste artigo, vamos explicar o que cada cláusula faz, apresentar exemplos do nível iniciante ao avançado, destacar erros comuns, compartilhar dicas práticas e fornecer uma tabela de prática para fortalecer suas habilidades em SQL.
A cláusula ORDER BY é usada para ordenar os resultados de uma consulta. Ela não altera os dados em si — apenas organiza as linhas em uma ordem especificada.
SELECT coluna1, coluna2
FROM nome_tabela
ORDER BY coluna1 [ASC|DESC];
ASC
= Ordem ascendente (padrão).DESC
= Ordem descendente.SELECT nome, idade
FROM funcionarios
ORDER BY idade ASC;
Explicação: Recupera todos os nomes e idades dos funcionários, ordenados do mais jovem para o mais velho.
SELECT nome, departamento, salario
FROM funcionarios
ORDER BY departamento ASC, salario DESC;
Explicação: Ordena primeiro os departamentos em ordem alfabética. Dentro de cada departamento, ordena os salários do maior para o menor.
SELECT nome, salario,
RANK() OVER (ORDER BY salario DESC) AS ranking_salario
FROM funcionarios;
Explicação: Usa uma função de janela com ORDER BY
para ranquear os funcionários de acordo com o salário, do maior para o menor.
A cláusula GROUP BY é usada para agrupar dados que compartilham um valor em comum. Ela é geralmente usada em conjunto com funções de agregação como SUM()
, COUNT()
, AVG()
, MAX()
e MIN()
.
SELECT coluna1, função_agregada(coluna2)
FROM nome_tabela
GROUP BY coluna1;
SELECT departamento, COUNT(*) AS total_funcionarios
FROM funcionarios
GROUP BY departamento;
Explicação: Conta quantos funcionários existem em cada departamento.
SELECT departamento, AVG(salario) AS media_salarial
FROM funcionarios
GROUP BY departamento
ORDER BY media_salarial DESC;
Explicação: Agrupa os funcionários por departamento, calcula a média salarial e depois ordena os departamentos da maior para a menor média.
SELECT departamento, cargo, SUM(salario) AS total_salarios
FROM funcionarios
GROUP BY departamento, cargo
HAVING SUM(salario) > 50000
ORDER BY total_salarios DESC;
Explicação: Agrupa por departamento e cargo, calcula o total de salários por grupo, filtra os grupos com soma maior que 50.000 usando HAVING
, e ordena pelo total de salários.
Característica | ORDER BY | GROUP BY |
---|---|---|
Finalidade | Ordena linhas em uma ordem específica | Agrupa linhas em linhas resumidas |
Funciona com | Qualquer coluna (selecionada ou não) | Colunas no SELECT que não são agregadas |
Funções de agregação | Não são necessárias | Normalmente usadas (COUNT, SUM, AVG, etc.) |
Número de linhas | Mesmo número de linhas da consulta original | Menos linhas (resumidas) |
Exemplo de uso | Ordenar funcionários por salário | Contar funcionários por departamento |
SELECT departamento, nome
FROM funcionarios
GROUP BY departamento;
❌ Erro: nome
não está nem agrupado nem agregado.
✅ Correção:
SELECT departamento, COUNT(nome)
FROM funcionarios
GROUP BY departamento;
Esquecer o ORDER BY após o GROUP BY
O GROUP BY não garante ordem na saída. Sempre use ORDER BY
se quiser resultados em ordem específica.
✅ Exemplo:
SELECT departamento, AVG(salario) AS media_salarial
FROM funcionarios
GROUP BY departamento
ORDER BY media_salarial DESC;
ORDER BY
ordena linhas.GROUP BY
agrupa linhas.✅ Dica: Se você precisa de resumos, use GROUP BY
. Se precisa de ordenação, use ORDER BY
.
Usar alias de coluna incorretamente no GROUP BY
Alguns bancos de dados não permitem alias no GROUP BY
. Use sempre os nomes reais das colunas.
✅ Exemplo:
SELECT departamento AS depto, COUNT(*)
FROM funcionarios
GROUP BY departamento;
SELECT departamento, COUNT(*) AS total
FROM funcionarios
GROUP BY departamento
ORDER BY total DESC;
ORDER BY
) ou agrupar muitas colunas (GROUP BY
) pode ser lento. Utilize índices quando possível.ORDER BY
(como ORDER BY 2
) em código de produção. Prefira sempre os nomes das colunas para clareza.Vamos usar uma tabela simples chamada funcionarios:
id | nome | departamento | cargo | idade | salario |
---|---|---|---|---|---|
1 | Alice | TI | Desenvolvedor | 25 | 50000 |
2 | Bob | TI | Desenvolvedor | 30 | 60000 |
3 | Carlos | RH | Recrutador | 28 | 45000 |
4 | Diana | RH | Gerente | 40 | 70000 |
5 | Eduardo | Vendas | Executivo | 35 | 65000 |
SELECT nome, salario
FROM funcionarios
ORDER BY salario DESC;
SELECT departamento, COUNT(*) AS total_funcionarios
FROM funcionarios
GROUP BY departamento;
SELECT departamento, AVG(salario) AS media_salarial
FROM funcionarios
GROUP BY departamento
ORDER BY media_salarial DESC
LIMIT 1;
SELECT cargo, SUM(salario) AS total_salarios
FROM funcionarios
GROUP BY cargo
HAVING SUM(salario) > 100000;
Entender a diferença entre ORDER BY e GROUP BY é essencial para dominar SQL.
Quando usados corretamente, tornam-se ferramentas poderosas para análise de dados. Evite os erros comuns, pratique com as consultas acima e você rapidamente ganhará confiança no uso de ambas as cláusulas.