NULL em bancos de dados relacionais
Lição 1.6 · Tempo de leitura: ~6 min · Tarefas para praticar ↓
NULL é a marca especial que os bancos de dados relacionais usam quando um valor está ausente, é desconhecido ou não se aplica. Nesta lição você vai aprender o que NULL significa, o que ele não é, por que os bancos de dados precisam dele, quais colunas podem contê-lo e por que, com NULL, o banco responde "desconhecido" em vez de "sim" ou "não".
Nas lições anteriores vimos tabelas, linhas, colunas e tipos de dados. Cada célula de uma tabela guarda um valor do tipo da sua coluna - exceto quando não há valor nenhum para guardar.
O que NULL significa?
NULL não é um valor, mas uma marca: ela diz que a célula não tem valor. O motivo pode variar - o valor é desconhecido, não se aplica a essa linha ou simplesmente ainda não existe.
NULL numa tabela
A tabela rental do banco Sakila guarda os aluguéis de filmes. Um aluguel só recebe a sua return_date quando o filme volta, então até lá a célula é NULL:
| rental_id | rental_date | return_date |
|---|---|---|
| 14098 | 2005-08-21 00:30:32 | NULL |
| 14469 | 2005-08-21 13:07:24 | 2005-08-24 10:37:24 |
| 14626 | 2005-08-21 18:35:44 | 2005-08-25 23:54:44 |
O aluguel 14098 ainda não foi devolvido: a data de devolução ainda não existe. Não é "zero" nem "uma data vazia" - simplesmente não há nada ali.
O que NULL não é
- NULL não é 0. Zero é um número de verdade: um preço 0 significa "grátis", um preço NULL significa "o preço é desconhecido".
- NULL não é uma string vazia.
''é um texto sem caracteres; é um valor conhecido. NULL significa que não há texto nenhum. - NULL não é a palavra 'NULL'. O texto
'NULL'é uma string comum de quatro letras. - NULL não é false. Na lógica dos bancos de dados, NULL significa "desconhecido", não "não".
Por que os bancos de dados usam NULL?
Sem NULL, cada valor ausente precisaria de um substituto inventado, como 0, '' ou 1900-01-01, e esses substitutos se misturam com os dados reais. NULL cobre os casos típicos com honestidade:
- Desconhecido: um cliente não informou o telefone.
- Não se aplica: uma pessoa física não tem CNPJ de empresa.
- Ainda não conhecido: um aluguel não tem data de devolução até o filme voltar.
Quais colunas podem conter NULL?
Se uma coluna aceita NULL é decidido no projeto da tabela. Uma coluna declarada NOT NULL sempre precisa ter um valor: em rental, a rental_date é obrigatória, enquanto a return_date pode ficar vazia. Uma chave primária nunca pode ser NULL: uma linha precisa sempre poder ser identificada.
Uma boa regra prática: permita NULL só onde a ausência de valor realmente faz sentido e marque todo o resto como NOT NULL.
NULL em cálculos
Se uma expressão usa NULL, o resultado normalmente também é NULL, porque um valor desconhecido torna todo o resultado desconhecido:
10 + NULLé NULL.5 * NULLé NULL.- O número de dias entre a data de um aluguel e uma data de devolução NULL é NULL - o aluguel ainda não terminou.
Lógica de três valores
Normalmente uma condição é verdadeira ou falsa. Com NULL aparece uma terceira resposta: UNKNOWN ("desconhecido"). O aluguel 14098 foi devolvido antes de 25 de agosto? A data de devolução é desconhecida, então a resposta honesta é "desconhecido".
O mesmo vale ao comparar NULL com NULL: não se sabe se dois valores desconhecidos são iguais, então NULL = NULL também é UNKNOWN, e não verdadeiro. É por isso que os bancos de dados têm verificações especiais para NULL em vez das comparações comuns - você vai usá-las quando começar a escrever consultas.
Principais conclusões:
- NULL marca um valor ausente: desconhecido, não aplicável ou ainda não conhecido.
- NULL não é 0, nem uma string vazia, nem o texto 'NULL', nem false.
- Colunas declaradas NOT NULL e chaves primárias não podem conter NULL; as outras colunas podem.
- Cálculos com NULL normalmente resultam em NULL.
- Comparações com NULL dão um terceiro resultado lógico, UNKNOWN; até NULL = NULL é UNKNOWN.
Perguntas frequentes
NULL é o mesmo que uma string vazia?
Não. Uma string vazia '' é um valor de texto conhecido com zero caracteres. NULL significa que não há valor nenhum.
NULL é igual a NULL?
Não no sentido comum. Cada NULL representa um valor desconhecido, e não dá para provar que dois valores desconhecidos são iguais, então comparar NULL com NULL resulta em UNKNOWN.
Qualquer coluna pode conter NULL?
Uma coluna de qualquer tipo - número, texto ou data - pode conter NULL, a menos que a tabela proíba isso com NOT NULL. Colunas de chave primária nunca aceitam NULL.
Perguntas de entrevista
Como você explicaria NULL numa entrevista?
NULL é uma marca de valor ausente: desconhecido, não aplicável ou ainda não conhecido. Não é zero, nem string vazia, nem false, e segue regras próprias: cálculos com NULL retornam NULL, e comparações com ele retornam UNKNOWN.
O que é lógica de três valores?
Em SQL uma condição pode ser TRUE, FALSE ou UNKNOWN. UNKNOWN aparece sempre que uma comparação envolve NULL, porque o banco de dados não consegue dizer se um valor desconhecido satisfaz a condição.
Por que uma chave primária não pode ser NULL?
A chave primária identifica uma linha. Um identificador desconhecido não consegue fazer isso: duas linhas com chave NULL não poderiam ser distinguidas, por isso os bancos de dados rejeitam NULL nas colunas de chave primária.