Aprende SQL

Manejo de valores nulos: NULL en SQL

Lección 03 · Uniones y valores nulos

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”.

Diagrama: (a) “NULL no es…”: NULL ≠ 0, NULL ≠ '', NULL ≠ false, con la nota “NULL = ausencia de valor”; (b) “NULL en operaciones”: 5 + NULL = NULL, NULL = NULL = NULL (!), NULL IS NULL = true ✓; (c) “Herramientas”: IS NULL → Detecta ausencia, COALESCE → Valor por defecto, NULLIF → Genera 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

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.

Tablas de esta lección

videogames5 cols

Estructura

🔑idINTEGERtitleTEXTdeveloperTEXTyearINTEGERplaytime_hoursINTEGER

Datos de ejemplo (5 filas)

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

Ejercicios

Selecciona todos los videojuegos cuyo desarrollador sea NULL.

sql

Selecciona todos los videojuegos que tengan horas de juego registradas (playtime_hours no es NULL).

sql

Selecciona el título y el desarrollador de todos los juegos, mostrando 'Desconocido' cuando el desarrollador sea NULL.

sql

Selecciona el título y las horas de juego, mostrando 0 cuando playtime_hours sea NULL.

sql