Volver a la lista de artículos Artículos
Lectura de 8 minutos

Cómo conservar las filas no coincidentes al unir dos tablas en SQL

Aprenda a usar JOIN para mantener tanto las filas coincidentes como las no coincidentes cuando une dos tablas.

Unir dos o más tablas es una habilidad que necesitas mucho si trabajas con bases de datos. Para repasar y practicar tus habilidades de unión en SQL, te recomiendo el curso interactivo Tipos de JOIN en SQL interactivo. Contiene más de 90 ejercicios y secciones sobre diferentes retos de unión.

Si a menudo une tablas en SQL, probablemente habrá notado que no todos los datos de una tabla se corresponden con los datos de otra tabla todo el tiempo. A veces, sólo necesita los datos que coinciden en ambas tablas. Y a veces, también necesita conservar las filas que no coinciden. ¿Cómo se hace eso en un JOIN?

¿Qué JOIN le da las filas no coincidentes?

Probablemente ya sabe esto, pero vale la pena repetirlo. El propósito de JOIN es obtener los datos de dos o más tablas. Las unes por la(s) columna(s) que tienen en común.

Los cuatro tipos principales de JOINs son:

  • (INNER) JOIN.
  • LEFT (OUTER) JOIN.
  • RIGHT (OUTER) JOIN.
  • FULL (OUTER) JOIN.

Si utiliza un (INNER) JOIN simple, sólo obtendrá las filas que tengan coincidencias en ambas tablas. La consulta no devolverá las filas que no coincidan de ninguna forma.

Si esto no es lo que quiere, la solución es utilizar LEFT JOIN, RIGHT JOIN, o FULL JOIN, dependiendo de lo que quiera ver.

Si es nuevo en el JOIN, aquí se explica a fondo cada tipo de JOIN. También puede tener cerca una hoja de trucos de SQL JOIN para ayudarle con la sintaxis y el uso de JOIN.

Conozca los datos

Los datos con los que trabajaremos consisten en dos tablas:

  • employee.
  • project.

La tabla employee tiene cuatro columnas:

  • id: El ID del empleado; es la clave primaria (PK) de la tabla.
  • first_name: El nombre del empleado.
  • last_name: El apellido del empleado.
  • project_id: El ID del proyecto y la clave foránea (FK) de la tabla, que hace referencia a otra tabla llamada project.

Esto es lo que los datos de la tabla employee se ven:

idfirst_namelast_nameproject_id
1IngaDansken1
2RosinaSneezem5
3DarRisbie4
4LyneaBraveyNULL
5AlanahAbrashkov4
6EmmitJaime4
7KarrieLatek5
8GarrettCreginNULL
9CecilioZiemkeNULL
10MalanieChapellow1
11FraydaPinkett1
12MaddiMullissNULL
13BlaneTue5
14CarverVeighey5
15ChristosManleyNULL

Hay dos columnas en la tabla project:

  • id: El ID del proyecto; es la clave primaria (PK) de la tabla.
  • project_name: El nombre del proyecto.

Y estos son los datos de la tabla:

idproject_name
1Reporting Process
2Database Enhancement
3Sales Boosting
4Employee Satisfaction
5IT Security
6Diversity Program
7Policies & Procedures
8Social Media Visibility
9Mobile Banking
10Education

¿Qué ocurre cuando se utiliza el INNER JOIN?

Para obtener el nombre de los empleados y los proyectos en los que están trabajando utilizando el INNER JOIN, tendrá que escribir este código:

SELECT
  first_name,
  last_name,
  project_name
FROM employee e
JOIN project p
  ON e.project_id = p.id;

Nota: Por supuesto, puede usar tanto JOIN como INNER JOIN como palabra clave - son lo mismo.

Esto es lo que obtienes como resultado:

first_namelast_nameproject_name
FraydaPinkettReporting Process
MalanieChapellowReporting Process
IngaDanskenReporting Process
EmmitJaimeEmployee Satisfaction
AlanahAbrashkovEmployee Satisfaction
DarRisbieEmployee Satisfaction
CarverVeigheyIT Security
BlaneTueIT Security
KarrieLatekIT Security
RosinaSneezemIT Security

El resultado muestra sólo las filas de la tabla employee que coinciden con las filas de la tabla project. En otras palabras, el código devuelve sólo los empleados que tienen un proyecto asignado. Sin embargo, esto significa que cada tabla puede tener filas que no corresponden a la otra tabla. Puede haber algunos empleados que no estén asignados a ningún proyecto, y puede haber algunos proyectos sin ningún empleado asignado a ellos.

¿Cómo se obtienen también las filas no coincidentes?

Obtener todas las filas coincidentes y no coincidentes de una tabla

Para obtener todas las filas de una sola tabla - tanto las filas coincidentes como las no coincidentes - necesita usar el LEFT JOIN o el RIGHT JOIN. Cuál debe usar depende de la tabla de la cual quiere mantener las filas no coincidentes. El LEFT JOIN lo hará desde la tabla de la izquierda, el RIGHT JOIN desde la de la derecha. Déjeme mostrarle lo que esto significa en la práctica.

Usando el LEFT JOIN

Para obtener las filas emparejadas y no emparejadas de una tabla utilizando el LEFT JOIN, tendrá que escribir este código:

SELECT
  first_name,
  last_name,
  project_name
FROM employee e
LEFT JOIN project p
  ON e.project_id = p.id;

Es casi el mismo código que en el ejemplo anterior. La única diferencia es que utiliza la palabra clave LEFT JOIN en lugar de JOIN. Esto le permitirá obtener todos los datos de la tabla de la izquierda (employeeen este caso), y todos los datos coincidentes de la tabla de la derecha (project). Cuando no hay datos coincidentes en la tabla projectse obtienen los valores de NULL., pero se siguen obteniendo todos los valores de la tabla employee. Compruébelo usted mismo:

first_namelast_nameproject_name
FraydaPinkettReporting Process
MalanieChapellowReporting Process
IngaDanskenReporting Process
EmmitJaimeEmployee Satisfaction
AlanahAbrashkovEmployee Satisfaction
DarRisbieEmployee Satisfaction
CarverVeigheyIT Security
BlaneTueIT Security
KarrieLatekIT Security
RosinaSneezemIT Security
ChristosManleyNULL
MaddiMullissNULL
CecilioZiemkeNULL
GarrettCreginNULL
LyneaBraveyNULL

¿Cómo interpretas estos datos? Tienes todos los empleados y los proyectos en los que están trabajando. Cuando hay un valor NULL en la columna project_name, significa que el empleado en cuestión no está trabajando en ningún proyecto.

Utilizando el RIGHT JOIN

Ahora, escribamos el mismo código con el RIGHT JOIN en lugar de utilizar el LEFT JOIN.

SELECT
  first_name,
  last_name,
  project_name
FROM employee e
RIGHT JOIN project p
  ON e.project_id = p.id;

Es una imagen especular del código anterior. Devolverá todos los datos de la tabla de la derecha, projecty sólo las filas coincidentes de la tabla de la izquierda, employee. De nuevo, cuando no hay datos coincidentes de la tabla employeelos valores serán NULL.

Este es el resultado de la consulta:

first_namelast_nameproject_name
FraydaPinkettReporting Process
MalanieChapellowReporting Process
IngaDanskenReporting Process
NULLNULLDatabase Enhancement
NULLNULLSales Boosting
EmmitJaimeEmployee Satisfaction
AlanahAbrashkovEmployee Satisfaction
DarRisbieEmployee Satisfaction
CarverVeigheyIT Security
BlaneTueIT Security
KarrieLatekIT Security
RosinaSneezemIT Security
NULLNULLDiversity Program
NULLNULLPolicies & Procedures
NULLNULLSocial Media Visibility
NULLNULLMobile Banking
NULLNULLEducation

Ahora, estos datos muestran todos los proyectos que existen en la tabla project. Cuando las columnas first_name y last_name son NULL, significa que no hay ningún empleado trabajando en ese proyecto.

¿El FULL JOIN obtendrá todas las filas coincidentes y no coincidentes?

Creo que la consulta usando el FULL JOIN y su resultado hablarán por sí mismos. Veamos lo que hace. Primero, la consulta:

SELECT
  first_name,
  last_name,
  project_name
FROM employee e
FULL JOIN project p
  ON e.project_id = p.id;

Nuevamente, la única diferencia con respecto a las consultas anteriores es el tipo de unión utilizado. Todo lo demás es igual. Esta consulta FULL JOIN devolverá los siguientes datos:

first_namelast_nameproject_name
FraydaPinkettReporting Process
MalanieChapellowReporting Process
IngaDanskenReporting Process
NULLNULLDatabase Enhancement
NULLNULLSales Boosting
EmmitJaimeEmployee Satisfaction
AlanahAbrashkovEmployee Satisfaction
DarRisbieEmployee Satisfaction
CarverVeigheyIT Security
BlaneTueIT Security
KarrieLatekIT Security
RosinaSneezemIT Security
NULLNULLDiversity Program
NULLNULLPolicies & Procedures
NULLNULLSocial Media Visibility
NULLNULLMobile Banking
NULLNULLEducation
ChristosManleyNULL
MaddiMullissNULL
CecilioZiemkeNULL
GarrettCreginNULL
LyneaBraveyNULL

Inspeccionemos un poco los datos. Hay filas que se encuentran en ambas tablas. Sin embargo, hay filas de la tabla employee que no tienen filas correspondientes en la tabla project. Puede identificar estas filas por los valores de NULL en la columna project_name. También hay filas de la tabla project sin filas correspondientes en la tabla employee. De nuevo, aquí es donde están los valores de NULL. Esta vez, los NULLs estarán en las columnas first_name y last_name.

Cuándo usar qué JOIN

Ahora que ha visto lo que devuelve cada JOIN, vamos a aclarar lo que hace cada JOIN.

JOIN o INNER JOIN no devuelve ninguna fila que no coincida. Sólo devuelve las filas que coinciden en las dos tablas que se unen. Si desea obtener filas no coincidentes, no debería utilizarlo.

LEFT JOIN y RIGHT JOIN permiten obtener tanto filas coincidentes como no coincidentes. Sin embargo, debe saber de qué tabla obtiene las filas no coincidentes. En función de sus necesidades, utilizará LEFT JOIN o RIGHT JOIN. Ambos obtienen todas las filas de una tabla (coincidentes y no coincidentes) y todas las filas coincidentes de la otra tabla. Cuando no se encuentran filas coincidentes en la otra tabla, las columnas de la otra tabla muestran los valores de NULL.

El FULL JOIN obtiene todos los datos de todas las tablas que se unen. Es como combinar las tres uniones anteriores. Obtendrá todas las filas coincidentes como cuando se utiliza el INNER JOIN. También obtendrá las filas no coincidentes de la tabla de la izquierda y de la tabla de la derecha, también. Es como si usaras el LEFT JOIN y el RIGHT JOIN simultáneamente.

Aquí hay algunos ejemplos más para practicar la unión de las tablas.

Aprenda los diferentes tipos de JOIN para seleccionar el que necesita

Verá, conocer cómo funcionan estos JOINs es bastante útil. Le permiten unir dos o más tablas y obtener diferentes combinaciones de datos de cada tabla. No hay ninguna diferencia en la forma de escribir el código. Lo único que cambia es la palabra clave que utilizas en función del tipo de JOIN que necesitas. Es realmente importante entender qué datos devuelve cada uno de estos JOINs.

Para dominar y practicar esta habilidad, el curso SQL para principiantes y el curso de SQL JOINs son lo que necesitas. Si necesitas consejos sobre cómo practicar losJOINs, aquí tienes algunos consejos.