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.