Voltar para a lista de artigos Artigos
9 minutos de leitura

Como ORDER BY e NULL Trabalham Juntos em SQL

Valores NULL aparecem primeiro ou por último quando você usa o comando ORDER BY? São considerados valores maiores ou menores que os valores não NULL? Neste artigo, explicarei como diferentes bancos de dados relacionais tratam os valores NULL ao classificar os resultados e como mudar o comportamento padrão da cláusula ORDER BY.

Quando os usuários do LearnSQL praticam a cláusula ORDER BY em nosso curso SQL para Iniciantes, eles frequentemente perguntam por que os valores NULL aparecem primeiro na saída e como eles podem mudar este comportamento. Inspirado por estas perguntas, vou explicar em detalhes o assunto de ordenação de linhas contendo valores NULL.

Por padrão, os valores NULL aparecem sempre primeiro? É possível mudar como o ORDER BY ordena os valores NULL? Como aplicamos as opções NULLS FIRST e NULLS LAST? Vamos descobrir agora.

Como os Valores NULL são Ordenados por Padrão?

O padrão SQL não define a ordenação padrão dos valores NULLs. O que isso significa?

Se você aplicar a cláusula ORDER BY a uma coluna com NULLs, os valores NULL serão colocados em primeiro ou último lugar no conjunto de resultados. A saída depende do tipo do banco de dados. Portanto, vamos ver como diferentes bancos de dados relacionais ordenam os valores NULL.

PostgreSQL

Por padrão, o PostgreSQL considera valores NULL maiores do que qualquer valor não NULL. Se você ordenar sua saída de forma ascendente - adicionando a palavra-chave ASC ou por padrão (isto é, não especificando a ordem) - todos os valores NULL serão mostrados por último na saída. Aqui está um exemplo:

SELECT *
FROM quadros
ORDER BY ano;
idquadropintorano
4A Ronda NoturnaRembrandt1642
2A Noite EstreladaVincent van Gogh1889
3O GritoEdvard Munch1893
1Mona LisaLeonardo da VinciNULL
5O Nascimento de VênusSandro BotticelliNULL

Se você usar a palavra-chave DESC no ORDER BY para exibir os valores em ordem descendente, os valores NULL aparecerão no topo da tabela de resultados.

SELECT *
FROM quadros
ORDER BY DESC ano;
idquadropintorano
1Mona LisaLeonardo da VinciNULL
5O Nascimento de VênusSandro BotticelliNULL
3O GritoEdvard Munch1893
2A Noite EstreladaVincent van Gogh1889
4A Ronda NoturnaRembrandt1642

Oracle

O Oracle trata os NULLs da mesma forma que o PostgreSQL. Especificamente, a documentação do Oracle afirma que "se a ordem NULL não for especificada, então o tratamento dos valores nulos é NULLS LAST se o tipo for ASC, NULLS FIRST se o tipo for DESC". Com efeito, o Oracle considera os valores NULL maiores do que quaisquer valores não NULL.

SQLite

Ao contrário dos dois tipos de banco de dados anteriores, o SQLite considera NULLs menores que qualquer outro valor. Se você ordenar uma coluna com valores NULL em ordem ascendente, os NULLs virão primeiro.

SELECT *
FROM quadros
ORDER BY ano;
idquadropintorano
1Mona LisaLeonardo da VinciNULL
5O Nascimento de VênusSandro BotticelliNULL
4A Ronda NoturnaRembrandt1642
2A Noite EstreladaVincent van Gogh1889
3O GritoEdvard Munch1893

Por outro lado, se você adicionar uma palavra-chave DESC para obter uma ordem descendente, os NULLs aparecerão por último.

SELECT *
FROM quadros
ORDER BY ano DESC;
idquadropintorano
3O GritoEdvard Munch1893
2A Noite EstreladaVincent van Gogh1889
4A Ronda NoturnaRembrandt1642
5O Nascimento de VênusSandro BotticelliNULL
1Mona LisaLeonardo da VinciNULL

MySQL

Assim como o SQLite, o MySQL considera valores NULL inferiores a qualquer valor não NULL. Se você utilizar este banco de dados, os valores NULL serão tratados da mesma forma como ilustrado acima: aparecerão primeiro se os valores forem ordenados em ordem ascendente e por último se for utilizada a ordem descendente.

SQL Server

O SQL Server também trata os valores NULL como menores do que quaisquer valores não NULL. Você verá os NULLs primeiro quando uma coluna for ordenada em ordem ascendente e por último quando a coluna for ordenada em ordem descendente.

Vamos resumir como os NULLs são ordenados de forma padrão em diferentes bancos de dados:

ASCDESC
NULLs aparecem primeiroSQL Server, MySQL, SQLitePostgreSQL, Oracle
NULLs aparecem por últimoPostgreSQL, OracleSQL Server, MySQL, SQLite

Como Mudar o Comportamento Padrão do ORDER BY

Agora que você conhece o comportamento padrão de vários bancos de dados na classificação dos valores NULL, você pode estar se perguntando se é possível alterá-lo.

A resposta varia de acordo com o tipo de banco de dados que você utiliza. O comportamento padrão do SQL oferece as opções NULLS FIRST / NULLS LAST que mudam a ordenação dos valores NULL quando eles são adicionados à cláusula ORDER BY.

Infelizmente, nem todos os bancos de dados suportam este padrão. Vamos entender melhor.

PostgreSQL e Oracle

Como você se lembra, PostgreSQL e Oracle consideram os valores NULL muito altos, colocando-os no final em uma ordenação ascendente e no início uma ordenação descendente. Entretanto, você pode mudar este comportamento adicionando NULLS FIRST ou NULLS LAST à cláusula ORDER BY.

SELECT *
FROM quadros
ORDER BY ano NULLS FIRST;
idquadropintorano
1Mona LisaLeonardo da VinciNULL
5O Nascimento de VênusSandro BotticelliNULL
4A Ronda NoturnaRembrandt1642
2A Noite EstreladaVincent van Gogh1889
3O GritoEdvard Munch1893

Acima temos uma tabela que é ordenada em ordem ascendente, mas com NULLs vindo primeiro. A seguir, faremos o inverso - usaremos uma ordem descendente, com NULLs vindo por último:

SELECT *
FROM quadros
ORDER BY ano DESC NULLS LAST;
idquadropintorano
3O GritoEdvard Munch1893
2A Noite EstreladaVincent van Gogh1889
4A Ronda NoturnaRembrandt1642
1Mona LisaLeonardo da VinciNULL
5O Nascimento de VênusSandro BotticelliNULL

SQLite

Ao contrário do PostgreSQL e Oracle, o SQLite trata os NULLs como valores muito pequenos, colocando-os em primeiro lugar em um ordenamento ascendente e em último lugar em um ordenamento descendente. Começando com o SQLite versão 3.30.0, este comportamento também pode ser facilmente alterado usando as opções NULLS FIRST / NULLS LAST.

SELECT *
FROM quadros
ORDER BY ano NULLS LAST;
idquadropintorano
4A Ronda NoturnaRembrandt1642
2A Noite EstreladaVincent van Gogh1889
3O GritoEdvard Munch1893
1Mona LisaLeonardo da VinciNULL
5O Nascimento de VênusSandro BotticelliNULL

Acima, a palavra-chave NULLS LAST nos dá uma ordenação ascendente com os valores NULL vindo por último. Agora, vamos fazer o contrário:

SELECT *
FROM quadros
ORDER BY ano DESC NULLS FIRST;
idquadropintorano
1Mona LisaLeonardo da VinciNULL
5O Nascimento de VênusSandro BotticelliNULL
3O GritoEdvard Munch1893
2A Noite EstreladaVincent van Gogh1889
4A Ronda NoturnaRembrandt1642

Mais uma vez, a opção NULLS FIRST coloca os valores NULL no topo da ordenação descendente.

MySQL

Assim como o SQLite, o MySQL trata os valores NULL como inferiores a qualquer valor não NULL; assim, por padrão, ele coloca estes valores em primeiro lugar ao ordenar em ordem ascendente e em último ao ordenar em ordem descendente. Entretanto, o MySQL não suporta as opções NULLS FIRST / NULLS LAST, o que torna mais desafiador mudar o comportamento padrão.

Entretanto, podemos usar alguns truques para obter os valores NULL na ordem em que desejamos:

Usando o operador menos (-). (Atenção: Isto só funciona para números ou datas). Para ordenar valores em ordem crescente com NULLs aparecendo em último, podemos usar a seguinte consulta:

SELECT *
FROM quadros
ORDER BY -ano DESC;

Aqui, o sinal de menos antes do nome da coluna faz com que o MySQL ordene os valores não NULL em ordem inversa. Se adicionarmos a palavra-chave DESC, retornamos à ordem ascendente dos valores não-NULL. Os valores NULL não são afetados pelo operador menos, enquanto a palavra-chave DESC os faz aparecer por último ao ordenar em ordem descendente. Assim, este truque funciona da mesma forma que a opção NULLS LAST em SQLite.

Para ordenar valores em ordem descendente mas com NULLs vindo primeiro, podemos usar a seguinte consulta no MySQL:

SELECT *
FROM quadros
ORDER BY -ano;

A consulta fará com que o resultado de saída seja ordenado pela coluna do ano, em ordem descendente. Aqui, os NULLs aparecem primeiro - o mesmo resultado que obtemos com a opção NULLS FIRST em SQLite.

Usando o operador IS (NOT) NULL. (Funciona para todos os tipos de dados). Neste truque, podemos confiar que IS NULL retorna 1 para todas as expressões NULL e 0 para as expressões que não são NULL. Para que os NULLs apareçam por último ao utilizarmos a ordem ascendente, podemos realizar a seguinte consulta:

SELECT *
FROM quadros
ORDER BY ano IS NULL, ano;

Da mesma forma, também podemos ordenar o resultado em ordem descendente, com NULLs aparecendo primeiro. Desta vez, vamos usar IS NOT NULL:

SELECT *
FROM quadros
ORDER BY ano IS NOT NULL, ano DESC;

Os operadores IS NULL e IS NOT NULL podem ser muito úteis para alterar o comportamento padrão do MYSQL na ordenação de valores NULL.

Usando a função COALESCE. (Funciona para todos os tipos de dados). Se você não estiver familiarizado com esta função, leia nosso guia sobre como trabalhar com valores NULL usando a função COALESCE. Basicamente, podemos fazer os valores NULL aparecerem por último enquanto ordenamos os valores não NULL em ordem ascendente, fornecendo o maior valor possível como um substituto para os valores NULL:

SELECT *
FROM quadros
ORDER BY COALESCE(ano, 2021);

Aqui, usamos 2021 como o valor mais alto possível para a coluna do ano (temos certeza de que nenhuma pintura da nossa tabela vem do futuro. Para isso, também poderíamos usar qualquer número acima de 2020).

Da mesma forma, para exibir os valores NULL primeiro ao ordenarmos os valores não NULL de forma descendente, podemos usar a seguinte consulta:

SELECT * 
FROM quadros
ORDER BY COALESCE(ano, 2021) DESC;

O resultado das duas consultas acima será idêntico ao uso das opções NULLS FIRST / NULLS LAST em SQLite.

SQL Server

Como o MySQL, o SQL Server não suporta as opções NULLS FIRST / NULLS LAST. Entretanto, os truques com o operador menos e a função COALESCE funcionam no SQL Server da mesma forma que funcionam no MySQL. Você pode usar estas opções para alterar o comportamento padrão do SQL Server ao ordenar os valores NULL.

Hora de Treinar o Uso de ORDER BY com Valores NULL!

Você já sabe que o comportamento padrão da cláusula ORDER BY ao ordenar os valores NULL varia com o banco de dados que você está usando. Na maioria dos casos, alterar este comportamento padrão é fácil. Use as opções NULLS FIRST / NULLS LAST com SQLite, PostgreSQL e Oracle. Para MySQL e SQL Server, use os outros truques que mostramos.

Para ficar mais confiante ao trabalhar com valores NULL, confira os cursos interativos do LearnSQL:

Bons estudos!