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.
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], ...;
ASCordena de forma crescente: do menor para o maior, de A a Z, da data mais antiga para a mais recente. É a ordem padrão.DESCordena 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,DESCde forma decrescente.- Com várias chaves de ordenação, cada chave seguinte ordena as linhas iguais na anterior.
ASCeDESCaplicam-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
NULLaparecem 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.