Comportamiento y tratamiento de registros con valores NULL durante la operación JOIN en SQL

En este artículo, se explica el comportamiento de los registros con valores NULL en las operaciones JOIN de SQL y cómo abordarlos. Al manejar bases de datos, los valores NULL representan datos faltantes, lo que puede causar resultados no deseados cuando se incluyen en operaciones JOIN. Aquí, aprenderás a comprender el comportamiento de los valores NULL en varios tipos de JOIN y a aplicar métodos adecuados para asegurar una manipulación de datos precisa.

Índice

Comportamiento básico de los valores NULL en operaciones JOIN

En las operaciones JOIN de SQL, los valores NULL reciben un tratamiento especial. NULL indica “ausencia de valor” y, en las comparaciones, produce resultados diferentes a los valores normales. Específicamente, una comparación entre NULL y cualquier otro valor se considera siempre falsa. Por lo tanto, si una condición JOIN incluye NULL, es posible que ese registro no se incluya en el conjunto de resultados del JOIN.

Conceptos básicos de la comparación con valores NULL

NULL significa “valor desconocido” y no se considera igual a ningún otro valor en las comparaciones. Por ejemplo, en una consulta como la siguiente, los registros que contienen NULL no coinciden:

SELECT *
FROM table1
JOIN table2 ON table1.column = table2.column;

En la consulta anterior, si table1.column o table2.column contienen NULL, esas filas no se incluirán en el conjunto de resultados.

Impacto de los registros con valores NULL en los resultados de JOIN

El impacto de los registros con valores NULL en un JOIN varía según el tipo de JOIN que se utilice. Esto se explicará con más detalle en la siguiente sección.

Manejo de valores NULL en INNER JOIN

INNER JOIN solo incluye en el conjunto de resultados los registros que cumplen con la condición de unión, por lo que los registros que contienen valores NULL en la clave de unión no se incluirán en los resultados. Esto puede llevar a la pérdida no intencionada de datos.

Funcionamiento básico de INNER JOIN

INNER JOIN combina únicamente los registros que cumplen con la condición en ambas tablas. Veamos un ejemplo:

SELECT *
FROM employees
INNER JOIN departments ON employees.department_id = departments.department_id;

Esta consulta une las tablas employees y departments utilizando la columna department_id. Si employees.department_id o departments.department_id contienen NULL, esos registros no se incluirán en el conjunto de resultados.

Ejemplo concreto

Por ejemplo, supongamos que tenemos los siguientes datos:

Tabla employees

employee_idnamedepartment_id
1Alice10
2BobNULL
3Charlie20

Tabla departments

department_iddepartment_name
10HR
20IT
NULLUnknown

Si ejecutamos un INNER JOIN sobre los datos anteriores, los registros que contienen valores NULL no cumplirán con la condición de unión, por lo que el resultado será el siguiente:

SELECT *
FROM employees
INNER JOIN departments ON employees.department_id = departments.department_id;

Conjunto de resultados

employee_idnamedepartment_iddepartment_name
1Alice10HR
3Charlie20IT

El registro de Bob no se incluye en el resultado porque contiene un valor NULL.

Manejo de valores NULL en LEFT JOIN

LEFT JOIN incluye todos los registros de la tabla de la izquierda en el conjunto de resultados y, si no se cumple la condición de unión, utiliza NULL para completar los valores de la tabla de la derecha. Por lo tanto, es posible que los registros que contienen valores NULL se incluyan en el resultado.

Funcionamiento básico de LEFT JOIN

LEFT JOIN mantiene todos los registros de la tabla de la izquierda y combina los registros correspondientes de la tabla de la derecha. Si no se cumple la condición de unión, los valores de la tabla de la derecha se completan con NULL. Aquí hay un ejemplo:

SELECT *
FROM employees
LEFT JOIN departments ON employees.department_id = departments.department_id;

En esta consulta, todos los registros de la tabla employees se incluyen en el conjunto de resultados, y si no se cumple la condición de unión, los valores de la tabla departments serán NULL.

Ejemplo concreto

Utilizaremos los mismos datos del ejemplo anterior:

Tabla employees

employee_idnamedepartment_id
1Alice10
2BobNULL
3Charlie20

Tabla departments

department_iddepartment_name
10HR
20IT
NULLUnknown

Si ejecutamos un LEFT JOIN, obtendremos el siguiente resultado:

SELECT *
FROM employees
LEFT JOIN departments ON employees.department_id = departments.department_id;

Conjunto de resultados

employee_idnamedepartment_iddepartment_name
1Alice10HR
2BobNULLNULL
3Charlie20IT

El registro de Bob se incluye en el resultado debido al LEFT JOIN, pero como no hay un valor correspondiente en la tabla departments, department_name es NULL.

Manejo de valores NULL en RIGHT JOIN

RIGHT JOIN incluye todos los registros de la tabla de la derecha en el conjunto de resultados y, si no se cumple la condición de unión, utiliza NULL para completar los valores de la tabla de la izquierda. Esto da prioridad a los registros de la tabla de la derecha.

Funcionamiento básico de RIGHT JOIN

RIGHT JOIN mantiene todos los registros de la tabla de la derecha y combina los registros correspondientes de la tabla de la izquierda. Si no se cumple la condición de unión, los valores de la tabla de la izquierda se completan con NULL. Aquí hay un ejemplo:

SELECT *
FROM employees
RIGHT JOIN departments ON employees.department_id = departments.department_id;

En esta consulta, todos los registros de la tabla departments se incluyen en el conjunto de resultados, y si no se cumple la condición de unión, los valores de la tabla employees serán NULL.

Ejemplo concreto

Una vez más, utilizamos los mismos datos:

Tabla employees

employee_idnamedepartment_id
1Alice10
2BobNULL
3Charlie20

Tabla departments

department_iddepartment_name
10HR
20IT
NULLUnknown

Si ejecutamos un RIGHT JOIN, obtendremos el siguiente resultado:

SELECT *
FROM employees
RIGHT JOIN departments ON employees.department_id = departments.department_id;

Conjunto de resultados

employee_idnamedepartment_iddepartment_name
1Alice10HR
3Charlie20IT
NULLNULLNULLUnknown

Todos los registros de la tabla departments se incluyen en el resultado, y si no hay valores correspondientes en la tabla employees, estos se completan con NULL.

Manejo de valores NULL en FULL OUTER JOIN

FULL OUTER JOIN incluye todos los registros de ambas tablas en el conjunto de resultados, y si no se cumple la condición de unión, utiliza NULL para completar los valores de la tabla izquierda o derecha. De este modo, se combinan completamente los registros de ambas tablas.

Funcionamiento básico de FULL OUTER JOIN

FULL OUTER JOIN mantiene todos los registros de ambas tablas y, si no se cumple la condición de unión, se completan con NULL. Aquí hay un ejemplo:

SELECT *
FROM employees
FULL OUTER JOIN departments ON employees.department_id = departments.department_id;

En esta consulta, todos los registros de las tablas employees y departments se incluyen en el conjunto de resultados, y si no se cumple la condición de unión, se completan con NULL.

Ejemplo concreto

Veamos los resultados utilizando los mismos datos:

Tabla employees

employee_idnamedepartment_id
1Alice10
2BobNULL
3Charlie20

Tabla departments

department_iddepartment_name
10HR
20IT
NULLUnknown

Si ejecutamos un FULL OUTER JOIN, obtendremos el siguiente resultado:

SELECT *
FROM employees
FULL OUTER JOIN departments ON employees.department_id = departments.department_id;

Conjunto de resultados

employee_idnamedepartment_iddepartment_name
1Alice10HR
3Charlie20IT
2BobNULLNULL
NULLNULLNULLUnknown

Todos los registros de ambas tablas se incluyen en el resultado y, si no se cumple la condición de unión, se completan con NULL.

Métodos para manejar JOIN considerando valores NULL

Para manejar adecuadamente los registros con valores NULL en las operaciones JOIN, es necesario ajustar las consultas SQL. A continuación, se presentan algunas formas de realizar un JOIN teniendo en cuenta los valores NULL.

Uso de la función COALESCE

La función COALESCE permite reemplazar valores NULL por otro valor. De esta forma, se evita que los valores NULL afecten la evaluación de la condición de unión. Por ejemplo, para reemplazar los valores NULL por 0, se puede usar la siguiente consulta:

SELECT *
FROM employees
JOIN departments ON COALESCE(employees.department_id, 0) = COALESCE(departments.department_id, 0);

En esta consulta, los valores NULL se reemplazan por 0, lo que permite que los registros con NULL se unan correctamente.

Uso de IS NULL e IS NOT NULL

Para filtrar registros que contienen valores NULL, se pueden utilizar IS NULL e IS NOT NULL. Por ejemplo, si solo deseas unir registros que no contienen valores NULL, puedes hacerlo de la siguiente manera:

SELECT *
FROM employees
JOIN departments ON employees.department_id = departments.department_id
WHERE employees.department_id IS NOT NULL AND departments.department_id IS NOT NULL;

En esta consulta, solo se unen los registros en los que department_id no es NULL en ambas tablas.

Uso adecuado de LEFT JOIN y RIGHT JOIN

Si deseas incluir registros en el resultado incluso si no se cumple la condición de unión, utiliza LEFT JOIN o RIGHT JOIN. Esto permite incluir registros que no existen en una de las tablas.

SELECT *
FROM employees
LEFT JOIN departments ON employees.department_id = departments.department_id;

En esta consulta, todos los registros de la tabla employees se incluyen en el resultado, y si no hay valores correspondientes en la tabla departments, estos se completan con NULL.

Manejo de valores NULL usando la función COALESCE

La función COALESCE se utiliza para reemplazar valores NULL por otro valor especificado. Esto permite controlar el impacto de los registros con valores NULL en las operaciones JOIN y otras operaciones SQL.

Sintaxis básica de la función COALESCE

La función COALESCE toma varios argumentos y devuelve el primer valor que no es NULL. La sintaxis es la siguiente:

COALESCE(value1, value2, ..., valueN)

Esta función devuelve el primer valor que no es NULL entre value1 y valueN. Si todos los argumentos son NULL, devuelve NULL.

Ejemplo concreto: reemplazo de valores NULL

Por ejemplo, para reemplazar el valor NULL en la columna department_id de la tabla employees por 0, se puede usar la siguiente consulta:

SELECT employee_id, name, COALESCE(department_id, 0) AS department_id
FROM employees;

En esta consulta, si department_id es NULL, se reemplaza por 0 en el resultado.

Ejemplo de uso de COALESCE en operaciones JOIN

A continuación, se muestra un ejemplo de cómo utilizar la función COALESCE para manejar valores NULL en una operación JOIN. Por ejemplo, al unir las tablas employees y departments utilizando department_id, puedes reemplazar los valores NULL por 0 para realizar la unión:

SELECT *
FROM employees
JOIN departments ON COALESCE(employees.department_id, 0) = COALESCE(departments.department_id, 0);

En esta consulta, los valores NULL en department_id se reemplazan por 0, lo que permite unir correctamente los registros con valores NULL.

Uso de COALESCE con múltiples columnas

La función COALESCE también se puede utilizar con múltiples columnas. Por ejemplo, para obtener el primer valor no NULL entre varios campos de dirección, puedes hacerlo de la siguiente manera:

SELECT employee_id, name, COALESCE(address1, address2, address3) AS address
FROM employees;

En esta consulta, se devuelve el primer valor no NULL entre address1, address2 y address3, y se asigna a la columna address en el resultado.

Filtrado de valores NULL usando IS NULL/IS NOT NULL

En una consulta SQL, para identificar o excluir registros que contienen valores NULL, es útil utilizar IS NULL e IS NOT NULL. Estas condiciones permiten filtrar eficazmente los valores NULL.

Filtrado usando IS NULL

IS NULL selecciona los registros donde la columna especificada contiene un valor NULL. Por ejemplo, para seleccionar los registros donde department_id es NULL en la tabla employees, puedes usar la siguiente consulta:

SELECT *
FROM employees
WHERE department_id IS NULL;

Esta consulta incluye en el conjunto de resultados todos los registros donde department_id es NULL.

Filtrado usando IS NOT NULL

IS NOT NULL selecciona los registros donde la columna especificada no contiene un valor NULL. Por ejemplo, para seleccionar los registros donde department_id no es NULL en la tabla employees, puedes usar la siguiente consulta:

SELECT *
FROM employees
WHERE department_id IS NOT NULL;

Esta consulta incluye en el conjunto de resultados todos los registros donde department_id no es NULL.

Uso de IS NULL/IS NOT NULL en operaciones JOIN

En operaciones JOIN, puedes usar IS NULL e IS NOT NULL para manejar adecuadamente los registros que contienen valores NULL. Por ejemplo, para unir las tablas employees y departments y solo incluir registros donde department_id no sea NULL, puedes hacerlo de la siguiente manera:

SELECT *
FROM employees
JOIN departments ON employees.department_id = departments.department_id
WHERE employees.department_id IS NOT NULL AND departments.department_id IS NOT NULL;

Esta consulta une solo los registros donde department_id no es NULL en ambas tablas.

Tratamiento específico de valores NULL

Cuando necesites manejar valores NULL bajo ciertas condiciones, también puedes usar la instrucción CASE. Por ejemplo, si deseas realizar una operación específica para los registros con valores NULL, puedes hacerlo de la siguiente manera:

SELECT employee_id, name, 
       CASE 
           WHEN department_id IS NULL THEN 'No Department' 
           ELSE department_id 
       END AS department
FROM employees;

En esta consulta, si department_id es NULL, se muestra ‘No Department’; de lo contrario, se muestra el valor real de department_id.

Conclusión

En las operaciones JOIN de SQL, los registros que contienen valores NULL reciben un tratamiento especial, lo que puede tener un impacto inesperado en los resultados. En este artículo, hemos aprendido sobre el comportamiento de los valores NULL en varios tipos de JOIN (INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL OUTER JOIN) y cómo manejarlos.

Hemos explorado, en particular, cómo usar la función COALESCE para reemplazar valores NULL por otros valores, así como cómo usar IS NULL e IS NOT NULL para filtrar valores NULL. Aplicar estas técnicas te permitirá controlar con mayor precisión los resultados de tus consultas SQL y mejorar la confiabilidad de la manipulación de datos.

Comprender y manejar adecuadamente los valores NULL en las operaciones JOIN te permitirá realizar operaciones de bases de datos más robustas y coherentes. Como resultado, podrás mejorar la confiabilidad de tus análisis de datos y aplicaciones, extrayendo información más valiosa.

Con esto, concluimos la explicación sobre el comportamiento y tratamiento de registros con valores NULL durante la operación JOIN en SQL.

Índice