ORDER BY: ordenando resultados

1. Introdução ao ORDER BY

A cláusula ORDER BY é um dos recursos mais fundamentais e utilizados em SQL. Ela permite que você organize os resultados de uma consulta em uma sequência específica, seja crescente, decrescente ou uma combinação de critérios. Sem o ORDER BY, o banco de dados retorna os registros em uma ordem imprevisível, geralmente baseada na forma como foram armazenados fisicamente.

A sintaxe básica é extremamente simples:

SELECT coluna1, coluna2
FROM tabela
ORDER BY coluna1;

Por padrão, quando você não especifica a direção da ordenação, o SQL assume ordem ascendente (ASC). Isso significa que números serão ordenados do menor para o maior, textos em ordem alfabética (A a Z) e datas da mais antiga para a mais recente.

2. Ordenação Ascendente e Descendente

Embora o padrão seja ascendente, você pode explicitamente controlar a direção da ordenação usando ASC (ascendente) ou DESC (descendente).

Exemplo com números:

-- Ordenação ascendente (menor para maior)
SELECT nome, salario
FROM funcionarios
ORDER BY salario ASC;

-- Ordenação descendente (maior para menor)
SELECT nome, salario
FROM funcionarios
ORDER BY salario DESC;

Exemplo com datas:

-- Funcionários mais recentes primeiro
SELECT nome, data_contratacao
FROM funcionarios
ORDER BY data_contratacao DESC;

Exemplo com textos:

-- Clientes em ordem alfabética reversa
SELECT nome, cidade
FROM clientes
ORDER BY nome DESC;

Vale notar que a ordenação de textos pode ser influenciada pelo collation (configuração de ordenação) do banco de dados, que define regras como diferenciação entre maiúsculas e minúsculas e tratamento de acentos.

3. Ordenação por Múltiplas Colunas

Uma das capacidades mais poderosas do ORDER BY é permitir a ordenação por múltiplas colunas. A prioridade é determinada pela ordem em que as colunas são listadas: a primeira coluna tem maior prioridade, a segunda é usada apenas quando há empates na primeira, e assim por diante.

-- Ordenar por departamento (ascendente) e depois por salário (descendente)
SELECT nome, departamento, salario
FROM funcionarios
ORDER BY departamento ASC, salario DESC;

Neste exemplo, os funcionários são agrupados por departamento em ordem alfabética. Dentro de cada departamento, eles são ordenados do maior salário para o menor.

Você pode misturar direções diferentes para cada coluna:

SELECT nome, data_contratacao, salario
FROM funcionarios
ORDER BY data_contratacao DESC, salario ASC;

Aqui, primeiro ordenamos por data de contratação (mais recentes primeiro) e, para funcionários contratados na mesma data, ordenamos por salário (do menor para o maior).

4. Ordenação com Expressões e Funções

O ORDER BY não se limita a colunas simples. Você pode usar expressões aritméticas, funções e até aliases para criar critérios de ordenação mais sofisticados.

Ordenação por expressão aritmética:

-- Ordenar produtos pelo valor total em estoque
SELECT nome, preco, quantidade, (preco * quantidade) AS valor_total
FROM produtos
ORDER BY preco * quantidade DESC;

Ordenação por função:

-- Ordenar clientes pelo tamanho do nome
SELECT nome, cidade
FROM clientes
ORDER BY LENGTH(nome) DESC;

Ordenação por alias de coluna:

-- Usando alias para simplificar a ordenação
SELECT nome, salario - 2000 AS salario_liquido
FROM funcionarios
ORDER BY salario_liquido DESC;

É importante lembrar que a ordem de avaliação das cláusulas SQL faz com que o alias já esteja disponível para o ORDER BY, pois esta é a última cláusula processada (antes do LIMIT).

5. Ordenação com Valores Nulos

O tratamento de valores NULL na ordenação pode ser uma fonte de surpresas. Por padrão, diferentes bancos de dados tratam os nulos de maneiras distintas:

  • MySQL, SQL Server e SQLite: NULL é considerado menor que qualquer valor não nulo, aparecendo primeiro na ordenação ascendente.
  • PostgreSQL e Oracle: NULL é considerado maior que qualquer valor não nulo, aparecendo por último na ordenação ascendente.

Para ter controle explícito sobre onde os nulos aparecem, você pode usar as cláusulas NULLS FIRST e NULLS LAST (suportadas por PostgreSQL, Oracle e DB2):

-- Nulos aparecem por último (compatível com PostgreSQL/Oracle)
SELECT nome, email
FROM clientes
ORDER BY email ASC NULLS LAST;

-- Nulos aparecem primeiro
SELECT nome, email
FROM clientes
ORDER BY email DESC NULLS FIRST;

No MySQL, uma abordagem alternativa para controlar a posição dos nulos é usar uma expressão:

-- Simular NULLS LAST no MySQL
SELECT nome, email
FROM clientes
ORDER BY email IS NULL ASC, email ASC;

6. Cuidados e Boas Práticas

Impacto no desempenho: A ordenação pode ser uma operação custosa, especialmente em tabelas grandes. Quando o banco precisa ordenar os resultados, ele geralmente cria uma tabela temporária ou realiza uma operação de arquivo de ordenação (sort) em memória ou disco.

Índices e ORDER BY: Se a coluna usada no ORDER BY tiver um índice, o banco pode evitar a ordenação explícita, percorrendo o índice já na ordem desejada. Para ordenações por múltiplas colunas, um índice composto na mesma ordem pode trazer benefícios significativos.

-- Índice que pode otimizar esta consulta
CREATE INDEX idx_departamento_salario
ON funcionarios(departamento, salario DESC);

Evite ordenação desnecessária: Em muitos casos, a ordenação pode ser feita na camada de aplicação, onde há mais recursos de memória disponíveis. Para grandes volumes de dados, considere se a ordenação é realmente necessária no banco.

Ordenação em banco vs. aplicação: Ordenar no banco é geralmente mais eficiente quando você precisa apenas dos primeiros N registros (usando LIMIT). Para conjuntos de dados menores que serão exibidos em uma interface com paginação, a ordenação na aplicação pode ser mais flexível.

7. Exemplos Práticos e Casos de Uso

Relatório de vendas (mais recentes primeiro):

SELECT data_venda, cliente, valor_total
FROM vendas
ORDER BY data_venda DESC, valor_total DESC;

Lista de clientes em ordem alfabética:

SELECT nome, cidade, telefone
FROM clientes
ORDER BY nome ASC;

Ranking de alunos (maiores notas primeiro):

SELECT nome, turma, nota_final
FROM alunos
ORDER BY nota_final DESC, nome ASC;

Top 5 produtos mais vendidos (combinando ORDER BY e LIMIT):

SELECT produto_id, SUM(quantidade) AS total_vendido
FROM itens_venda
GROUP BY produto_id
ORDER BY total_vendido DESC
LIMIT 5;

Relatório gerencial com ordenação complexa:

SELECT 
    departamento,
    nome,
    salario,
    CASE 
        WHEN salario > 10000 THEN 'Senior'
        WHEN salario > 5000 THEN 'Pleno'
        ELSE 'Junior'
    END AS nivel
FROM funcionarios
ORDER BY 
    departamento ASC,
    nivel DESC,
    salario DESC;

Neste último exemplo, ordenamos primeiro por departamento, depois pelo nível hierárquico (do mais alto para o mais baixo) e, dentro do mesmo nível, pelo maior salário primeiro.


O ORDER BY é uma ferramenta indispensável no dia a dia de qualquer profissional que trabalha com SQL. Dominar suas nuances — desde a sintaxe básica até o controle de nulos e otimização com índices — permite criar consultas mais eficientes e relatórios mais precisos. Lembre-se sempre de avaliar o custo da ordenação em relação ao volume de dados e considerar alternativas como índices ou ordenação na aplicação quando apropriado.

Referências