Hoje aprenderemos o que é NULL no mundo de banco de dados. Criei esse artigo pois percebo que o tema causa certa confusão em algumas situações, especialmente para o pessoal que está começando a estudar banco de dados.
Uma vez um aluno me disse que esse assunto era intrigante e um pouco estranho… Achei engraçada a colocação, e na hora lembrei do seriado Arquivo X, onde Fox Mulder e Dana Scully, dois agentes do FBI, resolvem casos misteriosos e sobrenaturais, principalmente ligados a extraterrestres.
Naturalmente quando fui fazer o vídeo explicando “o que é NULL”, pensei que não haveria melhor oportunidade para homenagear o seriado que tanto gostava durante minha adolescência e alguns outros famosos que você verá na introdução…
OBS: A introdução original pode ser vista nesse link: https://www.youtube.com/watch?v=v6EkU3ZezLY
O que é NULL
NULL em banco de dados é usado quando uma informação a ser cadastrada é desconhecida ou não é aplicável.
Na tabela abaixo temos alguns exemplos de quando usar e quando não usar NULL:
numero | nome | dt_nascimento | nr_filhos | telefone | observacao |
---|---|---|---|---|---|
1 | Azimute | 1985-01-02T00:00:00 | 0 | NULL | Atualizar telefone |
2 | Josemar | 1990-02-05T00:00:00 | NULL | (11) 9.9999-9999 | |
3 | Jonival | 1990-02-05T00:00:00 | 1 | (51) 9.9999-8888 | NULL |
4 | Josicleia | NULL | 2 | (51) 9.9999-7777 | NULL |
– NULL não é zero: Azimute tem 0 filhos, porém para Josemar essa informação é desconhecida. Então usamos NULL
– NULL não é espaço em branco: Espaço em branco é o que temos na observação de Azimute entre as palavras “atualizar” e “telefone”. O caractere espaço é um caractere como qualquer outra letra, já a expressão NULL significa vazio.
– NULL não é ausência de caracteres: A observação de Josemar está em branco. É como se tivesse sido preenchida e depois apagada. A observação de Jonival, no entanto, está vazia, ou nula.
– NULL é palavra chave: Null deve ser escrito sem aspas, pois se escrito com aspas será entendido como um texto qualquer.
Sintaxe de utilização (is null | is not null)
Para referenciar registros nulos, você não pode utilizar os mesmos operadores que está habituado para trabalhar com valores, ou seja, os exemplos abaixo são todos INCORRETOS e não retornarão dados:
select * from amigos where dt_nascimento = null select * from amigos where dt_nascimento > null select * from amigos where dt_nascimento < null select * from amigos where dt_nascimento <> null select * from amigos where dt_nascimento between '1800-01-01' and null select * from amigos where dt_nascimento between null and '2099-01-01' select * from amigos where dt_nascimento in (null)
A sintaxe correta para trabalhar com valores nulos é (is null | is not null), como nos exemplos abaixo:
select * from amigos where dt_nascimento is null select * from amigos where dt_nascimento is not null select * from amigos where year(dt_nascimento) = 1985 or nr_filhos is null or dt_nascimento is null
Caso você esteja trabalhando com aplicações antigas, que necessitem obrigatoriamente utilizar “= null” ou “<> null”, você pode forçar o SQL a interpretar igual e diferente conforme o exemplo abaixo:
set ansi_nulls off select * from amigos where dt_nascimento = null select * from amigos where dt_nascimento <> null set ansi_nulls on
Teste você mesmo…
Abaixo o script completo da aula de hoje para você testar os exemplos no seu computador:
------------------------------------------------------------------ -- O que é NULL em banco de dados ------------------------------------------------------------------ -- Banco de testes use master if db_id('curso') is null create database Curso go use Curso go if object_id('amigos') is not null drop table amigos if object_id('tabela_teste') is not null drop table tabela_teste go create table amigos (numero int, nome varchar(100), dt_nascimento datetime, nr_filhos tinyint, telefone varchar(16), observacao varchar(2000)) insert into amigos values (1, 'Azimute', '1985-01-02', 0, null, 'Atualizar telefone'), (2, 'Josemar', '1990-02-05', null, '(11) 9.9999-9999', ''), (3, 'Jonival', '1990-02-05', 1, '(51) 9.9999-8888', null), (4, 'Josicleia', null, 2, '(51) 9.9999-7777', null) go -- Tabela de amigos: select * from amigos ---------------------------------------------- -- Trabalhando com NULL no SQL ---------------------------------------------- /* => O que é null e quando usar? null é vazio => Informação ausente! Use quando a informação "não estiver disponível" ou "for não aplicável" => O que NÃO é null? Não é "zero" Não é "espaço" e não é ' ' Não é "branco" e não é '' Não é "texto" ou seja, não é 'null' ==> DICA: NULL é uma palavra chave no banco! É algo realmente especial... :) => Sintaxe: CORRETA: is null | is not null ERRADA: = null | <> null | between null | in (null), etc... */ -- Sintaxe ERRADA - Não volta o resultado esperado... select * from amigos where dt_nascimento = null select * from amigos where dt_nascimento > null select * from amigos where dt_nascimento < null select * from amigos where dt_nascimento <> null select * from amigos where dt_nascimento between '1800-01-01' and null select * from amigos where dt_nascimento between null and '2099-01-01' select * from amigos where dt_nascimento in (null) -- Josicleide que tem a data de nascimento null não aparece... -- Sintaxe CORRETA: select * from amigos where dt_nascimento is null select * from amigos where dt_nascimento is not null select * from amigos where year(dt_nascimento) = 1985 or nr_filhos is null or dt_nascimento is null -- É possível forçar o funcionamento para: = <> in (NÃO RECOMENDADO) set ansi_nulls off select * from amigos where dt_nascimento = null select * from amigos where dt_nascimento <> null set ansi_nulls on -- NULL funciona igual para qualquer tipo de dados: insert into amigos values (null, null, null, null, null, null) -- sem sentido, mas funciona... select * from amigos -- CURIOSIDADE: Tipo de dados "padrão" do NULL select null as coluna into tabela_teste select data_type,* from information_schema.columns where table_name = 'tabela_teste' -- Limpando dados de teste use master drop database curso
CONCLUSÃO
Percebo que inicialmente os alunos tendem a não gostar do NULL, por ele ser, como disse um aluno, estranho e misterioso…
Porém, estou certo de que após ver alguns exemplos como os que mostrei, você verá que o NULL pode ajudar bastante em seus projetos de banco (ou talvez não né… de repente sou eu que acostumei…).
Enfim, como inúmeras coisas que existem no mercado, o objetivo desse artigo não é entrar no mérito de certo ou errado / bom ou ruim, mas sim entendermos como “é” e usarmos quando apropriado.
Espero que também tenha gostado desse conteúdo.
Abraço do seu amigo Josué 🙂
Muito didático e esclarecedor
Obrigada
Valeu Carol! 🙂