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

2 respostas

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *