CodeGym /Cursos /SQL SELF /Errores típicos al trabajar con NULL

Errores típicos al trabajar con NULL

SQL SELF
Nivel 10, Lección 4
Disponible

En esta lección vamos a conocer aún mejor a nuestro misterioso colega NULL. Obvio, tus propios errores con él todavía están por venir, pero... estar prevenido es estar armado. Vamos a ver algunos errores típicos relacionados con NULL.

Error 1: Usar el operador normal = para comprobar NULL

Probablemente el error más popular entre los que empiezan con SQL es intentar usar el operador = para comprobar si un valor es NULL.

¿Qué pasa?

SELECT *
FROM students
WHERE age = NULL;

Si piensas ingenuamente que esto te va a mostrar todos los estudiantes con edad indefinida, te vas a decepcionar: esta consulta no devuelve nada. ¿Por qué? Porque NULL no es un valor, así que los operadores normales de comparación no funcionan con él. Como dice el libro mágico de SQL: "No puedes comparar NULL directamente con nada".

¿Cómo debería ser?

Para comprobar si un valor es NULL, usa IS NULL:

SELECT *
FROM students
WHERE age IS NULL;

Ahora sí vas a obtener todos los estudiantes cuya edad no está indicada.

Error 2: Las funciones agregadas ignoran NULL (excepto COUNT(*))

Cuando haces consultas con funciones agregadas, NULL se excluye automáticamente de los cálculos. Esto puede dar resultados inesperados.

¿Qué pasa?

SELECT AVG(salary) AS avg_salary
FROM employees;

Si la columna salary tiene NULL, esas filas simplemente se ignoran y el salario promedio se calcula sin tenerlas en cuenta. Esto puede dar una idea falsa del salario medio.

¿Cómo evitarlo?

Antes de hacer el cálculo, asegúrate de reemplazar NULL por un valor por defecto. Por ejemplo, usa COALESCE():

SELECT AVG(COALESCE(salary, 0)) AS avg_salary
FROM employees;

Ahora los valores NULL se reemplazarán por 0 antes del cálculo.

Error 3: Comparar NULL entre sí

En la base de datos, NULL no es igual literalmente a nada, ni siquiera a otro NULL. Esto puede sorprenderte.

¿Qué pasa?

SELECT *
FROM students
WHERE NULL = NULL;

Esta consulta también devuelve un resultado vacío. ¿Por qué? Porque SQL considera que la ausencia de un valor no puede ser "igual" a la ausencia de otro. Sí, SQL es un lenguaje filosófico.

¿Cómo debería ser?

Si necesitas comprobar si dos NULL son "iguales", usa construcciones especiales como IS NULL. Por ejemplo:

SELECT *
FROM students
WHERE first_name IS NULL AND last_name IS NULL;

Error 4: Dividir por NULL

Dividir por NULL no es solo un error, es casi un crimen matemático que SQL castiga con un resultado sin sentido: NULL.

¿Qué pasa?

SELECT 10 / NULL AS result;

¿El resultado? NULL. SQL ni siquiera intenta entender lo que quieres de él.

¿Cómo evitarlo?

Para proteger tus consultas de estos líos, usa COALESCE() o NULLIF():

SELECT 10 / COALESCE(divisor, 1) AS result
FROM calculations;

En esta consulta, si divisor es NULL, en vez de dividir por NULL se divide por 1.

Error 5: Operadores lógicos que no funcionan con NULL

NULL rompe la lógica en cuanto aparece en las expresiones. Por ejemplo, la condición TRUE AND NULL devuelve NULL, no TRUE ni FALSE.

¿Qué pasa?

SELECT *
FROM students
WHERE age > 18 OR age = NULL;

En este caso, aunque age > 18 sea cierto para algunas filas, algunas filas con NULL en la columna age pueden quedar fuera del resultado. ¿Por qué? Porque la parte age = NULL devuelve NULL, no TRUE.

¿Cómo debería ser?

Siempre maneja explícitamente los valores NULL en condiciones lógicas:

SELECT *
FROM students
WHERE age > 18 OR age IS NULL;

Error 6: Comportamiento implícito al ordenar NULL (el error más "pesado")

Si usas ORDER BY en una consulta, el comportamiento de NULL puede sorprenderte. Por defecto, PostgreSQL ordena las filas con valores NULL al final si ordenas ascendente y al principio si ordenas descendente.

¿Qué pasa?

SELECT product_name, price
FROM products
ORDER BY price;

Si price tiene NULL, esas filas aparecerán al final de la lista.

¿Cómo evitar sorpresas?

Puedes especificar explícitamente el orden para NULL usando NULLS FIRST o NULLS LAST:

SELECT product_name, price
FROM products
ORDER BY price NULLS FIRST;

Error 7: Manejo incorrecto de claves foráneas y NULL

Los valores NULL en columnas con claves foráneas a veces pueden causar comportamientos inesperados.

¿Qué pasa?

Si has añadido claves foráneas a una tabla e intentas insertar una fila dejando el campo de la clave foránea vacío, PostgreSQL ni se inmuta. Esto es porque los valores NULL no se comprueban contra las tablas relacionadas.

¿Cómo trabajar bien?

Usa restricciones NOT NULL si quieres evitar el uso de NULL en esos campos. O simplemente ten en cuenta que los valores NULL quedan como "huérfanos", sin pertenecer a ninguna tabla relacionada.

Más sobre tablas relacionadas y claves foráneas lo verás en la próxima lección :P

2
Tarea
SQL SELF, nivel 10, lección 4
Bloqueada
Manejo de valores `NULL` en funciones agregadas
Manejo de valores `NULL` en funciones agregadas
2
Tarea
SQL SELF, nivel 10, lección 4
Bloqueada
Ordenación de datos considerando `NULL`
Ordenación de datos considerando `NULL`
1
Cuestionario/control
Expresiones condicionales, nivel 10, lección 4
No disponible
Expresiones condicionales
Expresiones condicionales
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION