Mantenha o SQLtest vivo: Ajude a cobrir os custos do servidor de $100 deste mês para manter todas as lições e o playground SQL online. Apoie o projeto →
Código SQL copiado para a área de transferência

Lição 2.5 · Tempo de leitura: ~6 min

A cláusula SQL ORDER BY ordena as linhas do resultado de uma consulta por uma ou mais colunas ou expressões. Nesta lição, você vai aprender a ordenação crescente e decrescente, a ordenação por várias colunas, por expressões e por alias, e como os valores NULL são ordenados.

SQL ORDER BY: Ordenar os Resultados de uma Consulta

Uma tabela não tem uma ordem de linhas embutida. Sem ORDER BY, o banco de dados devolve as linhas na ordem que for mais rápida para ele, e essa ordem pode mudar de uma execução para outra. Sempre que a ordem importa — num relatório, numa lista de destaques ou num registro cronológico —, ela tem de ser pedida explicitamente.

SQL ORDER BY: ordenação crescente e decrescente, ordenação por várias colunas com empates resolvidos pela coluna seguinte, e onde ficam os valores NULL

A Cláusula ORDER BY

ORDER BY é escrita no fim de uma instrução SELECT e lista as chaves de ordenação.

Sintaxe Básica

SELECT column1, column2, ...
FROM table_name
ORDER BY column1 [ASC | DESC], column2 [ASC | DESC], ...;
  • ASC ordena de forma crescente: do menor para o maior, de A a Z, da data mais antiga para a mais recente. É a ordem padrão.
  • DESC ordena de forma decrescente.

Ordenar por Uma Coluna

SELECT first_name, last_name
FROM actor
ORDER BY last_name;

Resultado: todos os atores em ordem alfabética do sobrenome.

Para inverter a ordem, adicione DESC:

SELECT title, length
FROM film
ORDER BY length DESC;

Resultado: os filmes do mais longo para o mais curto.


Ordenar por Várias Colunas

Quando a primeira chave de ordenação tem valores iguais, o banco de dados usa a segunda chave para ordenar essas linhas, depois a terceira, e assim por diante:

SELECT first_name, last_name
FROM actor
ORDER BY last_name, first_name;

Resultado: atores ordenados pelo sobrenome; atores com o mesmo sobrenome são ordenados pelo nome.

Cada coluna tem a sua própria direção. ASC ou DESC aplica-se apenas à coluna que vem antes:

SELECT title, rating, length
FROM film
ORDER BY rating, length DESC;

Resultado: filmes agrupados por classificação; dentro de cada classificação, os mais longos vêm primeiro.


Ordenar por Expressões

Você pode ordenar por um valor calculado, não apenas por uma coluna armazenada. A expressão é avaliada para cada linha e as linhas são ordenadas pelo resultado:

SELECT title, rental_rate, rental_duration
FROM film
ORDER BY rental_rate * rental_duration DESC;

Resultado: filmes ordenados pelo custo do aluguel durante todo o período, os mais caros primeiro.

Uma comparação também pode ser uma chave de ordenação. Isso é útil para colocar certas linhas no topo:

SELECT title, rating
FROM film
ORDER BY rating = 'G' DESC, title;

Resultado: os filmes com classificação G no topo e depois todos os outros; cada grupo ordenado pelo título.

No MySQL e no MariaDB, uma comparação devolve 1 ou 0, por isso DESC coloca primeiro as linhas que correspondem. Nem todos os bancos de dados conseguem ordenar por uma comparação; a forma portável usa CASE, que você vai aprender na Lição 3.5.


Ordenar por Alias e por Posição da Coluna

ORDER BY é processado depois do SELECT, por isso pode usar os alias de colunas definidos ali:

SELECT title, rental_rate * rental_duration AS full_rental_cost
FROM film
ORDER BY full_rental_cost DESC;

Também é possível ordenar pela posição de uma coluna na lista do SELECT:

SELECT first_name, last_name
FROM actor
ORDER BY 2, 1;

Resultado: atores ordenados pela segunda coluna (last_name) e depois pela primeira (first_name).

Ordenar por posição é prático em consultas rápidas, mas deixa de funcionar silenciosamente quando alguém altera a lista de colunas. Em consultas guardadas, prefira nomes ou alias.


Ordenação e Valores NULL

NULL significa "sem valor", por isso o banco de dados precisa decidir onde colocar essas linhas. No MySQL, MariaDB e SQL Server, os valores NULL aparecem primeiro na ordem crescente e por último na decrescente. No PostgreSQL e no Oracle, é o contrário.

SELECT rental_id, rental_date, return_date
FROM rental
ORDER BY return_date
LIMIT 10;

Resultado: no MySQL, os aluguéis ainda não devolvidos (return_date é NULL) aparecem primeiro.


Principais conclusões:

  • Sem ORDER BY, a ordem das linhas num resultado não é garantida.
  • ASC (o padrão) ordena de forma crescente, DESC de forma decrescente.
  • Com várias chaves de ordenação, cada chave seguinte ordena as linhas iguais na anterior.
  • ASC e DESC aplicam-se a cada coluna separadamente.
  • É possível ordenar por expressões, alias e posições de colunas; nomes e alias são mais confiáveis do que posições.
  • Onde os valores NULL aparecem depende do banco de dados.

Perguntas Frequentes

Qual é a ordem de ordenação padrão em SQL?

Crescente (ASC). ORDER BY last_name e ORDER BY last_name ASC devolvem o mesmo resultado.

Como ordenar por várias colunas em direções diferentes?

Escreva a direção depois de cada coluna: ORDER BY rating ASC, length DESC. Uma direção aplica-se apenas à coluna que vem antes dela.

Posso usar um alias de coluna no ORDER BY?

Sim. ORDER BY é processado depois do SELECT, então os alias definidos na lista do SELECT estão disponíveis ali. É diferente do WHERE, onde não é possível usar alias.

Tente resolver as tarefas a seguir para reforcar o que voce aprendeu nesta licao.

  1. Lista de filmes ordenada
  2. Obtenha a lista ordenada de idiomas
  3. Obtenha a lista de clientes
  4. Exibir departamentos
  5. Obter lista de clientes únicos