19th Jul 2022 9 minutos de leitura Como ORDER BY e NULL Trabalham Juntos em SQL Kateryna Koidan sql aprender sql ORDER BY Índice Como os Valores NULL são Ordenados por Padrão? PostgreSQL Oracle SQLite MySQL SQL Server Como Mudar o Comportamento Padrão do ORDER BY PostgreSQL e Oracle SQLite MySQL SQL Server Hora de Treinar o Uso de ORDER BY com Valores NULL! 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: SQL para Iniciantes fala sobre valores NULL e ordenação. Obtenha mais informações sobre o conteúdo deste curso em nosso guia específico sobre o curso SQL para Iniciantes . Curso de Práticas em SQL fornece ainda mais exercícios sobre a cláusula ORDER BY. Bons estudos! Tags: sql aprender sql ORDER BY