5.1 Falta de significância
A linguagem SQL, como a linguagem Java, tem uma palavra-chave especial para denotar a ausência de um valor - é null. Ou como costuma ser escrito - NULL.
O uso NULLem SQL é muito semelhante ao uso de null em Java. Em Java, pode haver objetos cujos campos contenham valores nulos. No SQL, pode haver tabelas cujas linhas contenham valores NULL.
Deixe-me adicionar alguns produtos sem marca à nossa tabela de produtos de propósito. Se a marca do produto for desconhecida, o valor será NULL.
Para exibir esses produtos, vamos classificar nossa tabela de produtos por id na ordem inversa e obter 10 registros. A solicitação ficará assim:
SELECT * FROM product
ORDER BY id DESC
LIMIT 10
Obtemos o seguinte resultado da consulta:
| eu ia | nome | marca | preço | contar |
|---|---|---|---|---|
| 15 | Rebite | NULO | 0,01 | 1000 |
| 14 | Parafuso | NULO | 0,10 | 1000 |
| 13 | Ficar | IKEA | 100,00 | 10 |
| 12 | vaso de flores | flor inteligente | 99,00 | 9 |
| onze | Cadeirão | Bosch | 44,00 | 8 |
| 10 | Placa | Bosch | 199,00 | 10 |
| 9 | Cômoda | IKEA | 99,00 | 10 |
| 8 | Lâmpada | LG | 15h00 | 100 |
| 7 | televisão | LG | 350,00 | 4 |
| 6 | Prateleira | Bosch | 25h00 | 114 |
Sim, adicionei rebites e parafusos à mesa. Eles têm preço e quantidade, mas não têm marca.
5.2 Comparação com NULL
Você se lembra que às vezes você ficava bravo em Java ao usar null? Que você não pode comparar variáveis que podem se referir a valores nulos via equals(). Exemplo:
Product product1 = new Product();
Product product2 = null;
if (product2.equals(product1) { //an exception will be raised here
…
}
Você não vai acreditar, mas na linguagem SQL também está esperando as nuances ao trabalhar com valores NULL. E soa mais ou menos assim:nada é NULO.
Se você tentar filtrar todos os produtos cuja marca é null:
SELECT * FROM product
WHERE brand = NULL
Você receberá uma tabela vazia:
| eu ia | nome | marca | preço | contar |
|---|
Mas se você escrever na consulta que marca não é igual a NULL, obterá o mesmo resultado:
SELECT * FROM product
WHERE brand != NULL
Você receberá novamente uma mesa vazia:
| eu ia | nome | marca | preço | contar |
|---|
Qualquer comparação/ação com NULL retornará NULL:
| Expressão | Resultado |
|---|---|
| marca = NULL | NULO |
| marca != NULO | NULO |
| NULO = NULO | NULO |
| NULO != NULO | NULO |
Sim,mesmo se você comparar NULL com NULL, a resposta será NULL.
5.3 É NULO e NÃO É NULO
Então, como verificamos se algum campo (ou alguma coluna) tem um valor de NULL? E para isso, o SQL possui uma expressão especial - IS NULL. Se parece com isso.
variable IS NULL
Se você quiser verificar se uma coluna da sua tabela não é igual a NULL, então você precisa escrever IS NOT NULL:
variable IS NOT NULL
Vamos escrever uma consulta que selecionará todos os produtos da tabela de produtos cuja marca seja igual a NULL. Tal solicitação ficaria assim:
SELECT * FROM product
WHERE brand IS NULL
E obtemos o seguinte resultado da consulta:
| eu ia | nome | marca | preço | contar |
|---|---|---|---|---|
| 14 | Parafuso | NULO | 0,10 | 1000 |
| 15 | Rebite | NULO | 0,01 | 1000 |
Agora vamos exibir todos os produtos cujo preço é inferior a $ 20:
SELECT * FROM product
WHERE price < 20
E obtemos o seguinte resultado da consulta:
| eu ia | nome | marca | preço | contar |
|---|---|---|---|---|
| 2 | Cadeira | IKEA | 5,00 | 45 |
| 8 | Lâmpada | LG | 15h00 | 100 |
| 14 | Parafuso | NULO | 0,10 | 1000 |
| 15 | Rebite | NULO | 0,01 | 1000 |
Agora especificamos que o preço deve ser inferior a $ 20 e a marca não é NULL.
SELECT * FROM product
WHERE price < 20 AND brand IS NOT NULL
Obtemos o seguinte resultado da consulta:
| eu ia | nome | marca | preço | contar |
|---|---|---|---|---|
| 2 | Cadeira | IKEA | 5,00 | 45 |
| 8 | Lâmpada | LG | 15h00 | 100 |
Ótimo, as duas últimas linhas sumiram. Veja como funciona. Um pouco incomum, mas ainda há uma certa lógica nisso.
GO TO FULL VERSION