ProgramaciónDesarrollador SQL

Explique cómo funciona el tratamiento de NULL en SQL. ¿Cuáles son los peligros de los valores NULL inesperados, cómo trabajar correctamente con ellos y cuáles son los errores típicos que se encuentran?

Supere entrevistas con el asistente de IA Hintsage

Respuesta.

En SQL, el valor NULL significa "desconocido" o "valor ausente". Se comporta de manera especial:

  • Comparar NULL con cualquier valor a través de = o <> siempre dará un resultado de UNKNOWN, y no TRUE o FALSE.
  • Debes comprobar la existencia de NULL usando IS NULL o IS NOT NULL.
  • Cualquier operación aritmética o lógica con NULL dará NULL.

Ejemplo:

SELECT * FROM users WHERE name = NULL; -- no devolverá ninguna fila SELECT * FROM users WHERE name IS NULL; -- correcto SELECT 1 + NULL; -- Resultado: NULL

Para reemplazar NULL se utilizan funciones como COALESCE(foo, 0) (toma el primer valor no-NULL) o ISNULL(foo, 'default') en SQL Server.

Pregunta capciosa.

Pregunta: ¿Qué resultado devolverá la condición WHERE some_column <> 'value' en las filas donde some_column es NULL?

Respuesta:

En estas filas, la condición no se cumplirá: la comparación con NULL dará UNKNOWN, y no TRUE. Por lo tanto, las filas con NULL no aparecerán en el resultado.

Ejemplo:

-- some_column | ... -- NULL | ... -- 'abc' | ... -- 'value' | ... SELECT * FROM table WHERE some_column <> 'value'; -- La fila con NULL no aparecerá

Historia

En el informe del banco, la condición WHERE status <> 'closed' no tuvo en cuenta las cuentas con el valor status = NULL (por ejemplo, nuevas solicitudes). Como resultado, se contaron incorrectamente las cuentas activas: el número resultó ser un 15% menor.

Historia

En el servicio de personalización de correos, olvidaron añadir COALESCE(user_name, 'Estimado cliente') en el envío. Casi mil clientes recibieron mensajes sin nombre, lo que se percibió como un error de automatización.

Historia

Durante la migración de la base de datos, LEFT JOIN devolvía más filas de lo esperado. Resultó que en la tabla de la izquierda había campos con NULL; los filtros como WHERE b.field = 'X' después del JOIN descartaban estas filas, lo que provocó la pérdida de parte de los datos.