5.1 Falta de significado
El lenguaje SQL, como el lenguaje Java, tiene una palabra clave especial para indicar la ausencia de un valor: es nulo. O como suele escribirse - NULL
.
El uso NULL
en SQL es muy similar al uso de nulo en Java. En Java, puede haber objetos cuyos campos contengan valores nulos. En SQL, puede haber tablas cuyas filas contengan valores NULL.
Permítanme agregar un par de productos sin marca a nuestra tabla de productos a propósito. Si se desconoce la marca del producto, entonces el valor será NULL
.
Para mostrar dichos productos, ordenemos nuestra tabla de productos por ID en orden inverso y tomemos 10 registros. La solicitud se verá así:
SELECT * FROM product
ORDER BY id DESC
LIMIT 10
Obtenemos el siguiente resultado de la consulta:
identificación | nombre | marca | precio | contar |
---|---|---|---|---|
15 | Remache | NULO | 0.01 | 1000 |
14 | Tornillo | NULO | 0.10 | 1000 |
13 | Pararse | IKEA | 100.00 | 10 |
12 | maceta | flor inteligente | 99.00 | 9 |
once | Sillón | el bosco | 44.00 | 8 |
10 | Lámina | el bosco | 199.00 | 10 |
9 | Vestidor | IKEA | 99.00 | 10 |
8 | Lámpara | LG | 15.00 | 100 |
7 | TELEVISOR | LG | 350.00 | 4 |
6 | Estante | el bosco | 25.00 | 114 |
Sí, agregué remaches y tornillos a la mesa. Tienen precio y cantidad, pero no marca.
5.2 Comparación con NULL
¿Recuerdas que a veces solías enojarte en Java cuando usabas nulo? Que no puedes comparar variables que pueden hacer referencia a valores nulos a través de equals(). Ejemplo:
Product product1 = new Product();
Product product2 = null;
if (product2.equals(product1) { //an exception will be raised here
…
}
No lo vas a creer, pero en el lenguaje SQL también estás esperando los matices al trabajar con valores NULL. Y suena algo como esto:nada es NULO.
Si intenta filtrar todos los productos cuya marca es null
:
SELECT * FROM product
WHERE brand = NULL
Obtendrá una tabla vacía:
identificación | nombre | marca | precio | contar |
---|
Pero si escribes en la consulta que marca no es igual a NULL
, obtendrás el mismo resultado:
SELECT * FROM product
WHERE brand != NULL
Volverá a obtener una tabla vacía:
identificación | nombre | marca | precio | contar |
---|
Cualquier comparación/acción con NULL devolverá NULL:
Expresión | Resultado |
---|---|
marca = NULL | NULO |
marca != NULL | NULO |
NULO = NULO | NULO |
NULO != NULO | NULO |
Sí,incluso si compara NULL con NULL, entonces la respuesta será NULL.
5.3 ES NULO y NO ES NULO
Entonces, ¿cómo verificamos que algún campo (o alguna columna) tenga un valor de NULL
? Y para esto, SQL tiene una expresión especial: IS NULL
. Se parece a esto.
variable IS NULL
Si desea verificar si una columna de su tabla no es igual a NULL
, debe escribir IS NOT NULL
:
variable IS NOT NULL
Escribamos una consulta que seleccione todos los productos de la tabla de productos cuya marca sea igual a NULL
. Tal solicitud se vería así:
SELECT * FROM product
WHERE brand IS NULL
Y obtenemos el siguiente resultado de la consulta:
identificación | nombre | marca | precio | contar |
---|---|---|---|---|
14 | Tornillo | NULO | 0.10 | 1000 |
15 | Remache | NULO | 0.01 | 1000 |
Ahora vamos a mostrar todos los productos cuyo precio es inferior a $20:
SELECT * FROM product
WHERE price < 20
Y obtenemos el siguiente resultado de la consulta:
identificación | nombre | marca | precio | contar |
---|---|---|---|---|
2 | Silla | IKEA | 5.00 | 45 |
8 | Lámpara | LG | 15.00 | 100 |
14 | Tornillo | NULO | 0.10 | 1000 |
15 | Remache | NULO | 0.01 | 1000 |
Ahora especificamos que el precio debe ser inferior a $20 y la marca no lo es NULL
.
SELECT * FROM product
WHERE price < 20 AND brand IS NOT NULL
Obtenemos el siguiente resultado de la consulta:
identificación | nombre | marca | precio | contar |
---|---|---|---|---|
2 | Silla | IKEA | 5.00 | 45 |
8 | Lámpara | LG | 15.00 | 100 |
Genial, las dos últimas líneas se han ido. Así es como funciona. Un poco inusual, pero aún así hay cierta lógica en esto.