Thumbnail do post

Como a SQL lida com valores NULL

Durante meus estudos direcionado para questões de projeto e implementação de banco de dados, encontrei algo bastante interessante e que seria legal compartilhar. A SQL tem diversas regras e abordagem para lidar com valores NULL e que se dividem da seguinte forma:

  • Valor desconhecido (existe, mas não é conhecido);
    A data de nascimento de uma pessoa não é conhecida, e por isso é representada por NULL no banco de dados.
  • Valor não disponível (existe, mas é propositalmente retido);
    Uma pessoa tem um telefone residencial, mas não deseja que ele seja listado, por isso ele é retido e representado como NULL no banco de dados.
  • Valor não aplicável (o atributo é indefinido para essa tupla)
    Um atributo Conjuge seria NULL para uma pessoa que não fosse casada, pois ele não se aplica a essa pessoa.

Em resumo, cada valor NULL na sua forma atômica é considerado diferente de qualquer outro valor NULL nos diversos registros do banco de dados. Ou seja, nos sistemas de gerenciamento de banco de dados (SGBD) baseados na SQL, o resultado do operação NULL = NULL não resulta em TRUE e nem e FALSE. Quando temos uma operação envolvendo valores nulos, a SQL vai retornar UNKNOWN ou TRUE ou FALSE.

Como fazemos para comparar valores nulos na SQL?

Vamos começar analisando a seguinte tabela de usuario.

Tabela de usuario

A SQL permite consultas que verificam se o valor de um atributo é NULL. Em vez de usar os operadores = ou <> para efetuar as comparações dos valores de atributos com NULL, a SQL tem seus operadores específicos para este propósito que são IS ou IS NOT. Agora, como podemos utilizar esses operadores? Veja no exemplo abaixo a execução do seguinte comando: selecione o nome das pessoas que a coluna "BIRTH_DATE" possui valores NULL.

1-- QUERY EM SQL
2SELECT FIRSTNAME, LASTNAME
3FROM usuario
4WHERE BIRTH_DATE IS NULL;
5
6-- RESULTADO
7 -------------------------------
8--|   FIRSTNAME  |  LASTNAME    |
9-------------------------------
10--|   Anderson   |  Silva       |
11-------------------------------
12--|   Antônio    |  Marcos      |

De modo similar, podemos exemplificar como o operador IS NOT funciona.

1-- QUERY EM SQL
2SELECT FIRSTNAME, LASTNAME
3FROM usuario
4WHERE BIRTH_DATE IS NOT NULL;
5
6-- RESULTADO
7 -------------------------------
8--|   FIRSTNAME  |  LASTNAME    |
9-------------------------------
10--|   Francisco   |  Pedro      |
11-------------------------------

Conclusão

Devemos usar os operadores IS e IS NOT para efetuar comparação de atributos com valores NULL, porque a SQL considera cada valor NULL sendo distinto de cada outro valor NULL, de modo que a comparação de igualdade não é apropriada. Portanto, é muito importante conhecer os fundamentos das tecnologias que estamos utilizando em nossos projetos, para poder ter um real controle do que elas estão fazendo.