Ordenação por várias colunas e posicionamento de NULL
Misture ASC e DESC e entenda como NULLS FIRST e NULLS LAST diferem entre bancos de dados.
Ordenação por várias colunas e posicionamento de NULL é uma aula grátis de Coding Interview Prep no CoddyKit. Esta é a aula 1 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Coding Interview Prep, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Coding Interview Prep inclui 4 aulas no total.
Por que a ordenação aparece em entrevistas
Os entrevistadores recorrem cedo a ORDER BY porque isso revela se você entende que um conjunto de resultados SQL é não ordenado por padrão. Sem uma ordenação explícita, o banco de dados pode retornar as linhas em qualquer ordem.
Uma pergunta inicial comum é: "Como você garante que as linhas retornem em uma ordem específica?" A única resposta correta é uma cláusula ORDER BY explícita. Confiar na ordem de inserção, na ordem da chave primária ou na ordem do índice é um erro clássico de iniciantes.
Nesta lição, você dominará as ordenações por várias colunas e a questão complicada de onde os valores NULL ficam.
Noções básicas de ASC e DESC
ORDER BY ordena em ordem crescente (ASC) por padrão. Você só precisa de DESC para inverter a ordem. A direção se aplica por coluna, não à cláusula inteira.
Dica para entrevistas: diga que ASC é o padrão implícito, portanto você não precisa escrevê-lo. Muitos candidatos pensam, incorretamente, que um DESC inverte todas as colunas.
SELECT name, hire_date
FROM employees
ORDER BY hire_date DESC;Ordenação por várias colunas
Liste várias colunas separadas por vírgulas. O SQL ordena pela primeira coluna, depois resolve os empates com a segunda e assim por diante. Pense nisso como uma cadeia de desempate.
O exemplo ordena por departamento em ordem alfabética e, dentro de cada departamento, por salário do maior para o menor.
- Ordenação principal:
departmentem ordem crescente - Desempate:
salaryem ordem decrescente
SELECT department, name, salary
FROM employees
ORDER BY department ASC, salary DESC;Combinando ASC e DESC
Uma armadilha frequente em entrevistas: cada coluna tem sua própria direção. Escrever ORDER BY a, b DESC ordena a em ordem crescente e b em ordem decrescente, não ambas em ordem decrescente.
Se quiser ambas em ordem decrescente, você precisa escrever ORDER BY a DESC, b DESC. Seja explícito quando a pergunta combinar direções.
SELECT region, sales_year, revenue
FROM sales
ORDER BY region ASC, sales_year DESC;Onde ficam os NULL?
Este é o ponto central da lição. NULL significa desconhecido, portanto o padrão não impõe uma posição, e os bancos de dados divergem quanto ao padrão:
- PostgreSQL & Oracle: NULLs ficam por último em
ASCe em primeiro emDESC. - MySQL & SQL Server: NULLs ficam em primeiro em
ASCe por último emDESC(tratados como o menor valor).
Os entrevistadores adoram perguntar: "Onde os NULL aparecem nesta ordenação?" A resposta honesta é: depende do mecanismo, a menos que você controle isso explicitamente.
Controlando explicitamente a posição de NULL
Para tornar a posição determinística independentemente dos padrões do mecanismo, use NULLS FIRST ou NULLS LAST. PostgreSQL, Oracle e SQLite oferecem suporte direto a isso.
A consulta abaixo força as datas de contratação desconhecidas para o final, embora a coluna esteja em ordem crescente.
SELECT name, hire_date
FROM employees
ORDER BY hire_date ASC NULLS LAST;Emulando NULLS LAST no MySQL
MySQL não oferece suporte à palavra-chave NULLS LAST. A alternativa portável é uma chave de ordenação inicial que indica se o valor é NULL.
A expressão hire_date IS NULL retorna 0 para datas reais e 1 para NULLs. Ordená-la em ordem crescente empurra os NULLs para o final; depois, a segunda chave ordena as datas reais.
SELECT name, hire_date
FROM employees
ORDER BY (hire_date IS NULL) ASC, hire_date ASC;Emulando NULLS FIRST no SQL Server
O SQL Server também não oferece NULLS FIRST/LAST. Use uma expressão CASE como chave de ordenação inicial. Aqui, os NULL recebem classificação 0, portanto aparecem primeiro.
Vale a pena memorizar este padrão: uma coluna sinalizadora calculada, colocada antes da coluna de ordenação real, oferece controle total sobre a posição de NULL em qualquer dialeto.
SELECT name, hire_date
FROM employees
ORDER BY CASE WHEN hire_date IS NULL THEN 0 ELSE 1 END,
hire_date ASC;Exemplo resolvido: tabela de classificação
Suponha que você esteja criando uma tabela de classificação: a maior pontuação vem primeiro e, em caso de empate, o jogador que se cadastrou primeiro fica em posição superior. Jogadores que nunca pontuaram (pontuação NULL) ficam no final.
A ordenação precisa de três chaves: uma sinalização de NULL, a pontuação em ordem decrescente e a data de cadastro em ordem crescente como desempate.
SELECT player, score, signup_date
FROM players
ORDER BY (score IS NULL) ASC,
score DESC,
signup_date ASC;Ressalva sobre a estabilidade da ordenação
Outra pergunta favorita: "Se duas linhas forem iguais em todas as chaves de ORDER BY, em que ordem elas retornarão?"
Resposta: indefinida. As ordenações SQL não têm estabilidade garantida, portanto linhas iguais podem aparecer em qualquer ordem relativa, e essa ordem pode mudar entre execuções ou depois de uma alteração no índice.
A solução é adicionar um desempate totalmente único, geralmente uma chave primária, para que o resultado seja reproduzível.
SELECT id, name, salary
FROM employees
ORDER BY salary DESC, id ASC;Observação de desempenho sobre ordenação
Ordenar pode ser caro. Se ORDER BY corresponder a um índice existente com a mesma ordem e as mesmas direções das colunas, o mecanismo poderá ler as linhas já ordenadas e ignorar uma etapa de ordenação separada.
Direções incompatíveis (por exemplo, o índice é todo crescente, mas você ordena uma coluna em ordem decrescente) geralmente impedem isso, forçando uma ordenação em memória ou em disco. Mencionar essa relação entre a ordem do índice e o custo da ordenação demonstra maturidade ao entrevistador.
Verificação rápida
Teste seu domínio das regras de direção para várias colunas.
Recapitulação
Principais conclusões sobre ordenação por várias colunas e posição de NULL:
- Os conjuntos de resultados não têm ordem, a menos que você adicione
ORDER BY. - A direção é por coluna;
ASCé o padrão. - A posição de NULL varia conforme o mecanismo: por último em ASC no PostgreSQL/Oracle, em primeiro em ASC no MySQL/SQL Server.
- Use
NULLS FIRST/LASTonde houver suporte ou, nos demais casos, uma sinalização inicial comIS NULL/CASE. - Adicione um desempate único (como a chave primária) para obter uma ordem reproduzível.
Perguntas Frequentes
A aula “Ordenação por várias colunas e posicionamento de NULL” é grátis?
Sim — o texto completo de “Ordenação por várias colunas e posicionamento de NULL” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Coding Interview Prep, atualize para CoddyKit PRO. O curso de Coding Interview Prep inclui 4 aulas no total.
O que vou aprender em “Ordenação por várias colunas e posicionamento de NULL”?
Misture ASC e DESC e entenda como NULLS FIRST e NULLS LAST diferem entre bancos de dados. Você pratica Coding Interview Prep com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar Coding Interview Prep?
Nenhuma experiência prévia é necessária. Coding Interview Prep no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 1 de 4.
Quanto tempo leva a aula “Ordenação por várias colunas e posicionamento de NULL”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de Coding Interview Prep?
Sim. Cada aula de Coding Interview Prep inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Ordenação por várias colunas e posicionamento de NULL
- LIMIT, OFFSET e FETCH FIRST
- Retornando as linhas Top-N de forma confiável
- Ordenando por expressões e aliases