Manejo de valores nulos: NULL en SQL
En SQL, NULL representa la ausencia de valor. No es lo mismo que cero, una cadena vacía o falso: es simplemente “no hay dato”.
NULL≠0NULL≠''NULL≠false5 + NULL=NULLNULL = NULL=NULL(!)NULL IS NULL=true✓IS NULLDetecta ausenciaCOALESCEValor por defectoNULLIFGenera NULL si igualIS NULL e IS NOT NULL
No puedes comparar con NULL usando =. Debes usar operadores especiales:
-- Filas donde developer NO tiene valor
SELECT * FROM videogames WHERE developer IS NULL;
-- Filas donde developer SÍ tiene valor
SELECT * FROM videogames WHERE developer IS NOT NULL;NULL en operaciones
NULL tiene un comportamiento que sorprende a muchos principiantes. En SQL existe lo que se llama lógica de tres valores: cualquier operación con NULL no devuelve verdadero ni falso, sino NULL.
- Aritmética: cualquier cálculo con
NULLda como resultadoNULL. Por ejemplo,5 + NULLdevuelveNULL, no 5. - Comparaciones:
NULL = NULLno es verdadero. Tampoco es falso. EsNULL. Por eso debes usarIS NULLen lugar de= NULL. - Lógica:
NULL AND TRUEdevuelveNULL.NULL OR TRUEdevuelveTRUE, peroNULL OR FALSEdevuelveNULL.
Piensa en NULL como un “no lo sé”. Si no sé cuánto mide Juan y no sé cuánto mide Ana, no puedo afirmar que midan lo mismo. Por eso NULL = NULL no es verdadero.
COALESCE: Valor por defecto
COALESCE devuelve el primer valor no nulo de una lista de argumentos. Es perfecto para reemplazar NULL con un valor por defecto:
SELECT title, COALESCE(developer, 'Desconocido') AS developer
FROM videogames;NULLIF: Convertir un valor a NULL
NULLIF(a, b) devuelve NULL si a es igual a b. En caso contrario, devuelve a. Puede parecer extraño querer crear un NULL a propósito, pero es muy útil para evitar divisiones por cero:
SELECT title, playtime_hours / NULLIF(year - 2000, 0) AS ratio
FROM videogames;Si year es 2000, la resta daría 0 y la división fallaría. Con NULLIF, el denominador se convierte en NULL y el resultado es simplemente NULL en vez de un error. Este patrón es habitual cuando trabajas con datos reales donde los divisores pueden ser cero.
Nuestra tabla con valores nulos
En esta lección, algunos videojuegos tienen campos sin valor (NULL):
| id | title | developer | year | playtime_hours |
|---|---|---|---|---|
| 1 | The Legend of Zelda | Nintendo | 1986 | 20 |
| 2 | Super Mario Bros. | Nintendo | 1985 | 10 |
| 3 | Final Fantasy VII | Square Enix | 1997 | 40 |
| 4 | The Witcher 3 | CD Projekt Red | 2015 | 100 |
| 5 | Minecraft | Mojang Studios | 2011 | 9999 |
| 6 | Grand Theft Auto V | Rockstar Games | 2013 | 80 |
| 7 | Dark Souls | FromSoftware | 2011 | 60 |
| 8 | Portal 2 | Valve | 2011 | 8 |
| 9 | Red Dead Redemption 2 | Rockstar Games | 2018 | 70 |
| 10 | The Last of Us | Naughty Dog | 2013 | 15 |
| 11 | Unknown Game | NULL | 2020 | NULL |
| 12 | Mystery Title | NULL | 2019 | 30 |
| 13 | Retro Classic | Retro Studios | 1990 | NULL |
Observa que los juegos 11 y 12 no tienen desarrollador, y los juegos 11 y 13 no tienen horas de juego registradas.