Aprende SQL

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 no es...
NULL0
NULL''
NULLfalse
NULL = ausencia de valor
NULL en operaciones
5 + NULL=NULL
NULL = NULL=NULL(!)
NULL IS NULL=true
Herramientas
IS NULLDetecta ausencia
COALESCEValor por defecto
NULLIFGenera NULL si igual

IS 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 NULL da como resultado NULL. Por ejemplo, 5 + NULL devuelve NULL, no 5.
  • Comparaciones: NULL = NULL no es verdadero. Tampoco es falso. Es NULL. Por eso debes usar IS NULL en lugar de = NULL.
  • Lógica: NULL AND TRUE devuelve NULL. NULL OR TRUE devuelve TRUE, pero NULL OR FALSE devuelve NULL.

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):

Nombre de la Tabla: videogames
idtitledeveloperyearplaytime_hours
1The Legend of ZeldaNintendo198620
2Super Mario Bros.Nintendo198510
3Final Fantasy VIISquare Enix199740
4The Witcher 3CD Projekt Red2015100
5MinecraftMojang Studios20119999
6Grand Theft Auto VRockstar Games201380
7Dark SoulsFromSoftware201160
8Portal 2Valve20118
9Red Dead Redemption 2Rockstar Games201870
10The Last of UsNaughty Dog201315
11Unknown GameNULL2020NULL
12Mystery TitleNULL201930
13Retro ClassicRetro Studios1990NULL

Observa que los juegos 11 y 12 no tienen desarrollador, y los juegos 11 y 13 no tienen horas de juego registradas.

Ejercicios