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! 🙂