Problemas com Valores NULL
O conceito do valor NULL
é uma fonte comum de confusão para os iniciantes em SQL, que frequentemente pensa que NULL
é a mesma coisa que uma string vazia ''
. Este não é o caso! Por exemplo, as seguintes intruções são completamente diferentes:
mysql>INSERT INTO minha_tabela (telefone) VALUES (NULL);
mysql>INSERT INTO minha_tabela (telefone) VALUES ('');
Ambas as intruções inserem um valor na coluna telefone
, mas a primeira insere um valor NULL
e a segunda insere uma string vazia. O significado do primeiro pode ser considerado como telefone não é conhecido
e o significado da segunda pode ser considerado como ela não tem telefone
.
Em SQL, o valor NULL
é sempre falso em coparação a qualquer outro valor, mesmo NULL
. Uma expressão que contém NULL
sempre produz um valor NULL
a menos que seja indicado na documentação para os operadores e funções involvidos na expressão. Todas as colunas no seguinte exemplo retornam NULL
:
mysql> SELECT NULL,1+NULL,CONCAT('Invisible',NULL);
Se você quiser procurar por uma coluna cujo valor é NULL
, você nãp pode usar o teste =NULL
. A seguinte instrução não retorna nenhuma linha, pois expr = NULL
é FALSO, para qualquer expressão:
mysql> SELECT * FROM minha_tabala WHERE phone = NULL;
Para procurar por valores NULL
, você deve usar o teste IS NULL
. A seguir mostramos como encontrar o némuro de telefone NULL
e o número de telefone vazio:
mysql>SELECT * FROM minha_tabela WHERE telefone IS NULL;
mysql>SELECT * FROM minha_tabela WHERE telefone = '';
Note que você pode adicionar um índice a uma coluna que tenha valores NULL
apenas se você estiver usando o MariaDB versão 3.23.2 ou mais novo e estiver usando tipos de tabelas NyISAM
, InnoDB
ou BDB
. Em versões anteriores e com outros tipos de tabelas, você deve declara tais colunas como NOT NULL
. Isto também significa que você então não poderá inserir NULL
em uma coluna indexada.
Ao ler dados com LOAD DATA INFILE
, colunas vazias são atualizadas com ''
. Se você quiser um valor NULL
em uma coluna, você deve usar \N
no arquivo texto. A palavra literal 'NULL'
também pode ser usada em algumas circunstâncias. Leia "Sintaxe LOAD DATA INFILE
".
Ao usar ORDER BY
, valores NULL
são apresentados primeiro, ou por último se você especificar DESC
para armazenar em ordem decrescente. Exceção: Nos MariaDB 4.0.2 até 4.0.10, se você armazenar em ordem decrescente usando DESC
, valores NULL
são apresentados por último.
Ao usar GROUP BY
, todos os valores NULL
são considerados iguais.
Funções de agrupamento (resumo) como COUNT()
, MIN()
e SUM()
ignoram valores NULL
. A exceção a isto é COUNT(*)
, que conta linhas e não colunas individuais. Por exemplo, a seguinte instrução deve produzir duas contagens. A primeira é a contagem do número de linhas na tabela e a segunda é a contagem do número de valores diferentes de NULL
na coluna age
:
mysql> SELECT COUNT(*), COUNT(age) FROM person;
Para ajudar com o tratamento de NULL
, você pode usar os operadores IS NULL
e IS NOT NULL
e a função IFNULL()
.
Para alguns tipos de colunas, valores NULL
são tratados de forma especial, Se você inserir NULL
na primeira coluna TIMESTAMP
de uma tabela, a data e hora atual serão inseridos. Se você isere NULL
em uma coluna AUTO_INCREMENT
, o próximo número na sequência é inserida.