Menu

SQLite ORDER BY: ordenar ASC, DESC e múltiplas colunas

Entenda como o ORDER BY funciona no SQLite: ordenação crescente e decrescente, desempate por múltiplas colunas, posição dos NULLs e ordenação sem diferenciar maiúsculas.

Esta página tem editores executáveis — edite, execute e veja a saída na hora.

Sem ORDER BY, a ordem das linhas é indefinida

Um SELECT sem ORDER BY devolve as linhas na ordem que for mais conveniente para o SQLite. Em tabelas pequenas, o resultado costuma parecer a ordem de inserção, e é aí que muita gente cai na armadilha de confiar nisso. Não confie. Basta um índice entrar em ação, a tabela crescer ou o plano de execução mudar para essa ordem virar de cabeça para baixo sem aviso.

Se a ordem das linhas importa para você, deixe isso explícito:

ORDER BY name ordena em ordem crescente por padrão. O resultado volta como Ada, Boris, Chen, Rosa — em ordem alfabética, sempre, não importa como a tabela esteja armazenada em disco.

ASC e DESC no SQLite

ASC é crescente (do menor para o maior, de A a Z, do mais antigo para o mais recente). DESC é decrescente — o contrário. Como ASC é o padrão, na prática quase ninguém escreve:

Assim você obtém os cadastros mais recentes primeiro. Datas armazenadas como strings no formato ISO 8601 (YYYY-MM-DD) são ordenadas corretamente mesmo sendo texto — esse é um dos motivos pelos quais esse formato é o preferido para colunas de data no SQLite, que não tem um tipo dedicado para datas.

Ordenando por múltiplas colunas

Quando há empate na primeira coluna de ordenação, o SQLite usa a segunda coluna para desempatar. Basta listar as colunas separadas por vírgula, na ordem de prioridade:

As linhas ficam agrupadas primeiro por país (FR antes de US) e, dentro de cada país, ordenadas por nome. Cada coluna pode ter sua própria direção:

País em ordem crescente e, dentro de cada país, do mais recente para o mais antigo. O ASC e o DESC valem só para a coluna que está logo antes deles — não se propagam para as próximas.

Ordenando por expressões e aliases

O ORDER BY aceita qualquer expressão, não só nomes de colunas. Isso é bem útil quando você precisa ordenar por valores calculados:

O alias revenue definido na lista do SELECT pode ser usado tranquilamente no ORDER BY. Outra opção é repetir a expressão — ORDER BY price * quantity DESC — que o resultado é o mesmo.

Também dá pra ordenar pela posição da coluna, mas é um hábito que vale a pena evitar:

SELECT name, price FROM products ORDER BY 2 DESC;

2 significa a segunda coluna da lista do SELECT. Funciona, mas se alguém reorganizar as colunas depois, a ordenação muda de sentido sem avisar. Prefira ordenar pelo nome da coluna ou pelo alias.

Onde os NULLs aparecem

NULL é "desconhecido", e o SQLite precisa decidir onde colocar esses valores desconhecidos na ordenação. A regra padrão: NULL vem primeiro no ASC e por último no DESC.

Ada e Chen aparecem no topo, antes de qualquer data de verdade. Quase nunca é isso que você quer quando o objetivo é mostrar "mais recentes primeiro". Para resolver, use NULLS LAST:

Agora as datas reais vêm primeiro e os NULL ficam lá no fim. NULLS FIRST faz o contrário. Os dois fazem parte do SQL padrão e funcionam no SQLite a partir da versão 3.30.

Ordenação case insensitive no SQLite com COLLATE NOCASE

Por padrão, o SQLite compara texto de forma binária — ou seja, ordena pelos code points do Unicode. Na prática, isso faz com que letras maiúsculas venham antes das minúsculas, então 'Zoe' aparece antes de 'apple':

O resultado é Zoe, Boris, ada, apple (binary Unicode order) — primeiro as maiúsculas, depois as minúsculas. Para fazer uma ordenação case insensitive no SQLite, basta acoplar a collation NOCASE:

Agora o resultado vem como ada, apple, Boris, Zoe. Vale lembrar que o NOCASE só considera equivalentes as letras ASCII de A–Z e a–z — ele não normaliza acentos nem caracteres fora do ASCII. Para uma ordenação realmente internacionalizada, você precisaria de uma collation no nível da aplicação, mas, para o caso comum em inglês, o NOCASE resolve bem.

Ordenação aleatória

Às vezes a gente precisa das linhas em ordem aleatória — para escolher um item destacado do dia ou pegar uma amostra de linhas para teste. A função random() do SQLite devolve um inteiro aleatório; basta ordenar por ela:

Cada linha recebe um valor aleatório novo, e a ordenação embaralha tudo. Funciona bem em tabelas pequenas. Em tabelas grandes, ORDER BY random() fica lento — ele precisa calcular um valor aleatório para cada linha e ordenar o resultado inteiro. Quando você quer só uma linha aleatória de uma tabela enorme, abordagens mais espertas (como sortear um rowid aleatório, por exemplo) são bem mais rápidas.

Armadilhas comuns

Algumas coisas que costumam pegar a galera de surpresa:

  • Esquecer o ORDER BY e assumir uma ordem. Sem ele, a ordem é indefinida. Mesmo que pareça estável, não é.
  • Ordenar números armazenados como texto. '10' vem antes de '2' na ordem lexicográfica. Se a coluna deveria ser ordenada numericamente, guarde-a com afinidade numérica (ou faça um cast: ORDER BY CAST(value AS INTEGER)).
  • Misturar ASC e DESC entre colunas. Cada coluna tem sua própria direção. ORDER BY a, b DESC ordena a em ordem crescente e b em decrescente, e não as duas em decrescente.
  • Ordenar um conjunto enorme só para pegar as primeiras linhas. Combine o ORDER BY com LIMIT e crie um índice na coluna de ordenação — esse é o assunto da próxima página.

A seguir: LIMIT e OFFSET

O ORDER BY diz ao SQLite como organizar as linhas; já o LIMIT e o OFFSET dizem quantas retornar e a partir de onde começar. Juntos, eles formam a base da paginação e das consultas de "top N" — é o que vem na sequência.

Perguntas frequentes

Como ordenar os resultados no SQLite?

Adicione a cláusula ORDER BY no final do SELECT, indicando a coluna usada para ordenar. Por exemplo, SELECT * FROM users ORDER BY name; ordena de forma crescente. Para decrescente, use DESC: ORDER BY name DESC. Sem ORDER BY a ordem das linhas não é garantida — mesmo que o resultado pareça consistente, nunca confie nisso.

Como ordenar por várias colunas no SQLite?

Basta separar as colunas por vírgula: ORDER BY country, name. O SQLite ordena primeiro pela primeira coluna e, em caso de empate, usa a segunda como critério de desempate. Cada coluna pode ter sua própria direção: ORDER BY country ASC, signup_date DESC.

Como fazer uma ordenação case-insensitive no SQLite?

Use COLLATE NOCASE dentro do ORDER BY: ORDER BY name COLLATE NOCASE. Por padrão, o SQLite ordena texto usando collation binária, então Zoe aparece antes de apple. Com NOCASE, maiúsculas e minúsculas são tratadas como equivalentes na ordenação.

Onde aparecem os NULLs num resultado ordenado do SQLite?

Por padrão, os NULLs vêm primeiro na ordem crescente e por último na decrescente. Dá para mudar isso com NULLS FIRST ou NULLS LAST: ORDER BY signup_date DESC NULLS LAST deixa as datas reais no topo e empurra as que estão faltando para o final.

Coddy programming languages illustration

Aprenda a programar com o Coddy

COMEÇAR