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:
| id | title | author | year | rating |
|---|
| 1 | War and Peace | Leo Tolstoy | 1869 | 4.8 |
| 2 | The Master and Margarita | Mikhail Bulgakov | 1967 | 4.9 |
| 3 | And Quiet Flows the Don | Mikhail Sholokhov | 1940 | 4.7 |
| 4 | Crime and Punishment | Fyodor Dostoevsky | 1866 | 4.8 |
Consulta — ordenar por ano de publicação (crescente):
SELECT title, year FROM books ORDER BY year;
Resultado:
| title | year |
|---|
| Crime and Punishment | 1866 |
| War and Peace | 1869 |
| And Quiet Flows the Don | 1940 |
| The Master and Margarita | 1967 |
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:
- O banco de dados ordena primeiro por
year DESC (o mais novo no topo).
- Dentro das linhas que compartilham o mesmo ano, ordena por
rating DESC.
- 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:
| id | name | department | salary |
|---|
| 1 | Anna | IT | 4000 |
| 2 | Boris | Sales | 2700 |
| 3 | Vera | IT | 5000 |
| 4 | Grisha | HR | 2300 |
| 5 | Denis | IT | 4000 |
| 6 | Elena | Sales | 3200 |
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:
| name | department | salary |
|---|
| Grisha | HR | 2300 |
| Vera | IT | 5000 |
| Anna | IT | 4000 |
| Denis | IT | 4000 |
| Elena | Sales | 3200 |
| Boris | Sales | 2700 |
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:
| id | customer | amount | status | created_at |
|---|
| 1 | Anna | 500 | paid | 2024-03-10 |
| 2 | Boris | 1500 | paid | 2024-03-15 |
| 3 | Vera | 200 | cancelled | 2024-03-12 |
| 4 | Grisha | 3000 | paid | 2024-03-08 |
| 5 | Denis | 800 | pending | 2024-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:
| id | customer | status | amount | created_at |
|---|
| 2 | Boris | paid | 1500 | 2024-03-15 |
| 1 | Anna | paid | 500 | 2024-03-10 |
| 4 | Grisha | paid | 3000 | 2024-03-08 |
| 5 | Denis | pending | 800 | 2024-03-15 |
| 3 | Vera | cancelled | 200 | 2024-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 SELECT — 1 é 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:
- Liste os livros da maior avaliação para a menor.
- Ordene por autor (alfabético), e depois dentro de um autor por ano (do mais antigo ao mais novo).
- 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.
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. ComORDER 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 titlesignifica "organize-os em ordem alfabética por título".ORDER BY year DESCsignifica "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:
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:Consulta — ordenar por ano de publicação (crescente):
SELECT title, year FROM books ORDER BY year;Resultado:
O mais antigo no topo. Mude para
DESCe 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:
year DESC(o mais novo no topo).rating DESC.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: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:
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 BYaceita 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);LOWERdeixa 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 DESCcoloca as mais curtidas no topo, depoisLIMIT 3mantém as três primeiras. SemORDER BY,LIMIT 3retorna 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:ASC— os NULL no final;DESC— no começo.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: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:
CASEé a forma de expressar uma ordem personalizada para uma coluna de texto. Em ordem alfabética,cancelledviria antes depaid— 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 BYsempre 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 SELECT —1é a primeira coluna,2a segunda. Funciona, mas se lê mal. Use nomes.5. ORDER BY e UNION. Quando você faz
UNIONde 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
VARCHARarmazena números ("10", "2", "100"), a ordenação é alfabética, não numérica: "10", "100", "2". Resolva com uma conversãoORDER BY CAST(col AS INTEGER), ou armazene os números como números desde o início.Resumo rápido
ORDER BYordena o resultado da consulta.ASC(padrão) é crescente,DESCé decrescente.ORDER BY, não apenas os nomes de coluna.ORDER BY, nenhuma ordem é garantida.LIMITele dá o top-N.Experimente você mesmo
Sobre a tabela
books: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.