SQLORDER BYtutorialbeginner

O que é ORDER BY no SQL? Ordenar os resultados de uma consulta para iniciantes

ORDER BY ordena o resultado de uma consulta SQL. Cobrimos ASC e DESC, a ordenação por várias colunas, os NULL na ordenação e o clássico ORDER BY + LIMIT para o top-N. Muitos exemplos e três exercícios.

7 min de leituraSQL · ORDER BY · tutorial · beginner

ORDER BY é o comando do SQL para ordenar os resultados de uma consulta. Sem ele, o banco de dados retorna as linhas na ordem que bem entender — o que parece um caos para o usuário. Com ORDER BY, você diz explicitamente: "ordene por esta coluna de baixo para cima" (ou ao contrário).

Analogia: imagine uma pilha de livros sobre a sua mesa, jogados de qualquer jeito. ORDER BY title significa "organize-os em ordem alfabética por título". ORDER BY year DESC significa "os mais novos primeiro, os mais antigos por último".

Por que ORDER BY importa

Sem ordenação, o SQL não dá nenhuma garantia sobre a ordem das linhas. A mesma consulta executada duas vezes seguidas pode retornar as linhas em ordens diferentes. Então, se a ordem importa no seu resultado (top 10 de vendas, notícias por data, placares) — ORDER BY é obrigatório.

Cenários típicos:

  • Listas na interface: mostrar produtos do mais barato ao mais caro
  • Rankings: top 10 de usuários por pontos
  • Linhas do tempo: publicações da mais nova à mais antiga
  • Buscas alfabéticas: lista de cidades de A a Z

Sintaxe básica

SELECT *
FROM table_name
ORDER BY column_name [ASC | DESC];
  • ASC — crescente (de baixo para cima). É o valor padrão — você pode omiti-lo.
  • DESC — decrescente (de cima para baixo).

Exemplo: uma tabela de livros de uma biblioteca.

SELECT title, year
FROM books
ORDER BY year DESC;

Isto lista os livros do mais novo ao mais antigo.

Exemplo: uma biblioteca

Tabela books:

idtitleauthoryearrating
1War and PeaceLeo Tolstoy18694.8
2The Master and MargaritaMikhail Bulgakov19674.9
3And Quiet Flows the DonMikhail Sholokhov19404.7
4Crime and PunishmentFyodor Dostoevsky18664.8

Consulta — ordenar por ano de publicação (crescente):

SELECT title, year FROM books ORDER BY year;

Resultado:

titleyear
Crime and Punishment1866
War and Peace1869
And Quiet Flows the Don1940
The Master and Margarita1967

O mais antigo no topo. Mude para DESC e a ordem se inverte — o mais novo primeiro.

Ordenar por várias colunas

Muitas vezes uma coluna só não basta. O mesmo ano de publicação, e então você desempata pela avaliação. Basta listá-las com vírgulas:

SELECT title, year, rating
FROM books
ORDER BY year DESC, rating DESC;

Como funciona:

  1. O banco de dados ordena primeiro por year DESC (o mais novo no topo).
  2. Dentro das linhas que compartilham o mesmo ano, ordena por rating DESC.
  3. Se houvesse um terceiro campo, ele desempataria dentro das combinações idênticas de ano + avaliação.

Isso se chama "ordenação multinível". Muito comum: "primeiro por data, depois por prioridade dentro de uma data", "primeiro por status, depois por valor dentro de um status".

Exemplo multinível. Tabela employees:

idnamedepartmentsalary
1AnnaIT4000
2BorisSales2700
3VeraIT5000
4GrishaHR2300
5DenisIT4000
6ElenaSales3200

Consulta: primeiro por departamento (alfabético), depois dentro do departamento por salário (de cima para baixo).

SELECT name, department, salary
FROM employees
ORDER BY department ASC, salary DESC;

Resultado:

namedepartmentsalary
GrishaHR2300
VeraIT5000
AnnaIT4000
DenisIT4000
ElenaSales3200
BorisSales2700

Departamentos em ordem alfabética: HR → IT → Sales. Dentro de IT — Vera (5000), depois Anna e Denis (ambos 4000, ordem indefinida entre eles), e assim por diante.

Quer uma ordem determinística entre Anna e Denis? Adicione um terceiro nível, por exemplo por nome: ORDER BY department ASC, salary DESC, name ASC.

Ordenar por uma expressão

ORDER BY aceita não apenas nomes de coluna, mas também expressões:

SELECT title, likes, views
FROM posts
ORDER BY likes::float / views DESC;

Isto ordena as publicações por "taxa de engajamento" — as curtidas divididas pelas visualizações. A tabela não tem essa coluna, mas o banco de dados a calcula na hora.

Outro padrão comum — usar funções:

SELECT name FROM users ORDER BY LOWER(name);

LOWER deixa o nome em minúsculas para uma ordenação que ignora maiúsculas.

Top-N: ORDER BY + LIMIT

A combinação clássica. Para obter "as 3 publicações com mais curtidas", você ordena primeiro e depois trunca:

SELECT title, likes
FROM posts
ORDER BY likes DESC
LIMIT 3;

Primeiro ORDER BY likes DESC coloca as mais curtidas no topo, depois LIMIT 3 mantém as três primeiras. Sem ORDER BY, LIMIT 3 retorna três linhas arbitrárias — um bug clássico de iniciante.

NULL na ordenação

Se uma coluna tem valores NULL, os bancos de dados divergem sobre onde colocá-los:

  • PostgreSQL: ASC — os NULL no final; DESC — no começo.
  • MySQL: ASC — os NULL no começo; DESC — no final.

Se você precisa ser explícito, o PostgreSQL tem NULLS FIRST / NULLS LAST:

SELECT title, published_at
FROM posts
ORDER BY published_at DESC NULLS LAST;

Isto dá: as publicações recentes primeiro, os rascunhos (sem data de publicação) bem no final. O MySQL não tem essa sintaxe — você precisa simulá-la com uma expressão: ORDER BY published_at IS NULL, published_at DESC.

Exemplo maior: antes e depois

Tabela orders:

idcustomeramountstatuscreated_at
1Anna500paid2024-03-10
2Boris1500paid2024-03-15
3Vera200cancelled2024-03-12
4Grisha3000paid2024-03-08
5Denis800pending2024-03-15

Objetivo: "primeiro os pagos, depois os pendentes, depois os cancelados. Dentro de cada grupo, os mais novos no topo; os empates são desfeitos pelo maior valor primeiro".

SELECT id, customer, status, amount, created_at
FROM orders
ORDER BY
  CASE status
    WHEN 'paid'      THEN 1
    WHEN 'pending'   THEN 2
    WHEN 'cancelled' THEN 3
  END,
  created_at DESC,
  amount DESC;

Resultado:

idcustomerstatusamountcreated_at
2Borispaid15002024-03-15
1Annapaid5002024-03-10
4Grishapaid30002024-03-08
5Denispending8002024-03-15
3Veracancelled2002024-03-12

CASE é a forma de expressar uma ordem personalizada para uma coluna de texto. Em ordem alfabética, cancelled viria antes de paid — mas o que nos importa é o significado, não o alfabeto.

Erros comuns de iniciante

1. Esquecer que, sem ORDER BY, a ordem não é garantida. As pessoas presumem que "o banco de dados mantém a ordem de inserção". Não mantém — a ordem pode ser qualquer uma e pode mudar entre execuções. Precisa de uma ordem? Escreva ORDER BY.

2. ORDER BY antes de FROM. A ordem das cláusulas é fixa: SELECT … FROM … WHERE … GROUP BY … HAVING … ORDER BY … LIMIT. ORDER BY sempre fica quase no final.

3. Ordenar por uma coluna que não está no SELECT. A maioria dos bancos de dados permite isso — você pode ordenar por qualquer coluna da tabela mesmo que ela não esteja na saída. Exceção: quando você faz SELECT DISTINCT, ordenar por uma coluna que não está na saída dá erro, porque o DISTINCT descarta os dados necessários para ordenar.

4. ORDER BY 1, 2. Você pode ordenar pelo número ordinal da coluna no SELECT1 é a primeira coluna, 2 a segunda. Funciona, mas se lê mal. Use nomes.

5. ORDER BY e UNION. Quando você faz UNION de duas consultas, ORDER BY é escrito uma única vez bem no final e se aplica ao resultado combinado. Você não pode colocá-lo dentro das partes individuais do UNION.

6. Números como strings. Se uma coluna VARCHAR armazena números ("10", "2", "100"), a ordenação é alfabética, não numérica: "10", "100", "2". Resolva com uma conversão ORDER BY CAST(col AS INTEGER), ou armazene os números como números desde o início.

Resumo rápido

  • ORDER BY ordena o resultado da consulta.
  • ASC (padrão) é crescente, DESC é decrescente.
  • Ordene por várias colunas com vírgulas — ordenação multinível.
  • Expressões e funções são válidas em ORDER BY, não apenas os nomes de coluna.
  • Sem ORDER BY, nenhuma ordem é garantida.
  • Combinado com LIMIT ele dá o top-N.
  • Cuidado com os NULL — os bancos de dados os posicionam de forma diferente.

Experimente você mesmo

Sobre a tabela books:

  1. Liste os livros da maior avaliação para a menor.
  2. Ordene por autor (alfabético), e depois dentro de um autor por ano (do mais antigo ao mais novo).
  3. Top 3 de livros por avaliação (combinação ORDER BY + LIMIT).

Escreva primeiro as consultas por conta própria. A ordenação é uma das operações mais intuitivas do SQL — você vai pegar rápido.

Pratique com exercícios reais

Resolva exercícios no treinador de SQL com correção instantânea e dicas.

Abrir o treinador