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

INNER JOIN vs. OUTER JOIN: ¿Cuál es la diferencia?

Decidir cuándo usar INNER JOIN vs. OUTER JOIN es a menudo un reto para los principiantes. En este artículo, encontrará explicaciones y ejemplos que le ayudarán a entender mejor la diferencia entre estas dos uniones.

En SQL, JOINs le permite combinar datos de diferentes tablas; INNER JOIN y OUTER JOIN son simplemente tipos de sentencias JOIN. Comprender sus diferencias es fundamental si trabajas con bases de datos relacionales. También es crucial si vas a una entrevista de trabajo de SQL: la diferencia entre INNER JOIN y OUTER JOIN se encuentra entre las preguntas más frecuentes de las entrevistas de SQL.

Para repasar sus conocimientos de JOINs, le recomiendo nuestro curso interactivo Tipos de JOIN en SQL. Encontrará 93 ejercicios prácticos que cubren todos los diferentes casos de uso de INNER JOIN frente a OUTER JOIN. Además, aprenderá a filtrar datos correctamente con diferentes variantes de JOIN y a combinar tablas con columnas no clave.

¿Qué es un JOIN en SQL?

Comencemos revisando un SQL básico JOIN.

Imagina que tienes una base de datos universitaria con las tablas student y lecturer. En la tabla student tenemos el campo opcional advisor_id que almacena el ID del profesor que es el director de tesis de ese estudiante. Un estudiante puede no tener director si todavía no está escribiendo su tesis.

Para mostrar los nombres de los estudiantes y sus asesores, utilizamos la sentencia JOIN:

SELECT
  student.full_name AS student_name,
  lecturer.full_name AS advisor_name
FROM student
JOIN lecturer
ON student.advisor_id = lecturer.id;

Los datos resultantes podrían tener este aspecto:

student_nameadvisor_name
Alice JohnsonAmina Patel
Michael SmithSantiago Rivera
Bob SmithJessica Martinez
Charlie BrownJessica Martinez

La sentencia JOIN viene después de la cláusula FROM: se pone el nombre de la primera tabla después de FROM, luego la palabra clave JOIN, luego el nombre de la otra tabla, seguido de la palabra clave ON y la condición JOIN. En nuestro caso, la condición JOIN es student.advisor_id = lecturer.id.

Esta consulta devuelve las filas en las que el advisor_id de la tabla student coincide con el id de la tabla lecturer de la tabla. Básicamente, devuelve los nombres de los estudiantes junto con los nombres de sus asesores.

Para futuras referencias sobre todos los tipos de JOINs, recomendamos marcar o imprimir nuestra Hoja de Consulta SQL JOIN.

¿Qué es un INNER JOIN?

Cuando usa la palabra clave JOIN en SQL, en realidad está haciendo un INNER JOIN. Un INNER JOIN devuelve todas las combinaciones de filas de las dos tablas que satisfacen la condición ON. En nuestro ejemplo, devuelve los nombres de los estudiantes y sus asesores.

Sin embargo, un INNER JOIN no es suficiente si desea incluir filas que no tienen una coincidencia en la otra tabla. Por ejemplo, es posible que desee mostrar los nombres de todos los estudiantes, incluso los que aún no tienen asesor. O quizás necesite incluir los nombres de todos los profesores, incluso los que no están asesorando a ningún alumno. Aquí es cuando entra en juego OUTER JOIN.

¿Qué es un OUTER JOIN?

Un OUTER JOIN es el tipo de JOIN que devuelve las filas coincidentes de las dos tablas más todas las filas no coincidentes de una (o a veces ambas) de las tablas. OUTER JOIN tiene tres variantes: LEFT OUTER JOIN RIGHT OUTER JOIN y FULL OUTER JOIN. Examinemos cada una de ellas.

UNIÓN EXTERNA IZQUIERDA

LEFT OUTER JOIN (o simplemente LEFT JOIN) devuelve todas las filas de la tabla izquierda (la tabla a la izquierda de la sentencia JOIN, es decir, inmediatamente después de FROM) con datos coincidentes de la tabla derecha (la tabla a la derecha de (es decir, inmediatamente después de) la sentencia JOIN ). Si no hay ninguna coincidencia, las columnas procedentes de la tabla derecha se rellenan con NULL.

Utilizando las etiquetas student y lecturer como ejemplo, podemos utilizar LEFT JOIN para obtener una lista de todos los alumnos con los datos de su asesor. Queremos incluir a todos los estudiantes, incluso a los que aún no tienen asesor. La consulta sería la siguiente:

SELECT
  student.full_name AS student_name,
  lecturer.full_name AS advisor_name
FROM student
LEFT JOIN lecturer
ON student.advisor_id = lecturer.id;

Los resultados son:

student_nameadvisor_name
Alice JohnsonAmina Patel
Michael SmithSantiago Rivera
Bob SmithJessica Martinez
Charlie BrownJessica Martinez
Diana PrinceNULL

En los resultados podemos ver una fila que no estaba incluida anteriormente. La estudiante Diana Prince no tiene asesor, por lo que no se incluyó en el resultado de la consulta INNER JOIN. Sin embargo, con LEFT JOIN, se incluye. LEFT JOIN incluye todas las filas de la tabla izquierda, incluso aquellas que no tienen su fila correspondiente en la tabla derecha. Las columnas que provienen de la lecturer tabla se muestran como NULL.

Lea este artículo sobre LEFT OUTER JOINs en SQL si necesita más información.

UNIÓN EXTERNA DERECHA

RIGHT OUTER JOIN (o simplemente RIGHT JOIN) devuelve todas las filas de la tabla derecha (la segunda tabla) con datos coincidentes de la tabla izquierda (la primera tabla). Si no hay ninguna coincidencia, las columnas procedentes de la tabla izquierda se rellenan con nulos.

Supongamos que queremos listar los profesores con los datos de los alumnos a los que asesoran. Queremos incluir a todos los profesores, incluso a los que no están asesorando a ningún alumno. Para ello, escribiríamos una consulta como la siguiente:

SELECT
  student.full_name AS student_name,
  lecturer.full_name AS lecturer_name
FROM student
RIGHT JOIN lecturer
ON student.advisor_id = lecturer.id;

El resultado de esta consulta es:

student_namelecturer_name
Alice JohnsonAmina Patel
Michael SmithSantiago Rivera
Bob SmithJessica Martinez
Charlie BrownJessica Martinez
NULLKeiko Tanaka
NULLJamal Al-Fayed
NULLNadia Kowalski

El uso de RIGHT JOIN en la consulta nos permite obtener una lista de todos los profesores, independientemente de si están asignados a estudiantes o no. Si un profesor está asignado a un alumno, aparecerá en la lista con el nombre del alumno. Si un profesor no está asignado a ningún alumno, los datos del alumno en el conjunto de resultados son NULL.

Consulta esta guía completa de uniones SQL para obtener todos los recursos que necesitas para entender completamente este tema.

FULL OUTER JOIN

FULL OUTER JOIN (o simplemente FULL JOIN) nos permite obtener todos los datos de ambas tablas, haya o no coincidencia entre sus filas. En nuestro ejemplo, el uso de FULL JOIN entre student y lecturer devuelve todos los alumnos y todos los profesores. La consulta sería la siguiente

SELECT
  student.full_name AS student_name,
  lecturer.full_name AS advisor_name
FROM student
FULL JOIN lecturer
ON student.advisor_id = lecturer.id;

Y los resultados serían:

student_nameadvisor_name
Alice JohnsonAmina Patel
Michael SmithSantiago Rivera
Bob SmithJessica Martinez
Charlie BrownJessica Martinez
Diana PrinceNULL
NULLKeiko Tanaka
NULLJamal Al-Fayed
NULLNadia Kowalski

En el resultado, puede ver todos los estudiantes y todos los profesores. Si un estudiante no tiene asesor, los datos del asesor son NULL. Si un profesor no está asignado a ningún estudiante, los datos del estudiante correspondiente son NULL.

Encuentre más ejemplos y ponga a prueba sus conocimientos con estas 12 preguntas de práctica de SQL JOIN.

Hay algunos sistemas de gestión de bases de datos relacionales (RDBMS), como MySQL y MariaDB, que no admiten FULL JOIN. En estos SGBD se puede obtener el mismo resultado, pero la consulta es un poco más larga.

La forma de hacer un FULL JOIN en las versiones de SQL que no soportan ese comando es utilizar UNION entre el INNER JOIN, el LEFT JOIN, y el RIGHT JOIN:

SELECT
  student.full_name AS student_name,
  lecturer.full_name AS advisor_name
FROM student
LEFT JOIN lecturer
ON student.advisor_id = lecturer.id

UNION
SELECT
  student.full_name AS student_name,
  lecturer.full_name AS advisor_name
FROM student
JOIN lecturer
ON student.advisor_id = lecturer.id

SELECT
  student.full_name AS student_name,
  lecturer.full_name AS advisor_name
FROM student
RIGHT JOIN lecturer
ON student.advisor_id = lecturer.id;

En el script anterior, la unión de las tres formas de JOIN - LEFT JOIN, INNER JOIN, y RIGHT JOIN - da como resultado los mismos datos que FULL JOIN en los RDBMS que lo soportan.

Cuando sienta que ya le ha cogido el truco a Tipos de JOIN en SQL, lea estas preguntas y respuestas de entrevistas SQL JOIN para comprobar si está preparado para esa entrevista de trabajo.

Resumen de INNER JOIN vs. OUTER JOIN

Podemos sintetizar lo que hemos aprendido sobre INNER JOIN y OUTER JOIN en la siguiente tabla:

 

INNER JOIN

OUTER JOIN

Explicación

Devuelve filas de las dos tablas donde se cumple la condición ON

Devuelve filas de las dos tablas donde se cumple la condición ON Y también los registros no coincidentes de una o ambas tablas, rellenando con valores nulos donde no existen coincidencias.

Tipos

1 tipo: JOIN

3 tipos diferentes: LEFT JOIN, RIGHT JOIN, FULL JOIN

Abreviatura

JOIN = INNER JOIN

LEFT JOIN = LEFT OUTER JOIN
RIGHT JOIN = RIGHT OUTER JOIN
FULL JOIN = FULL OUTER JOIN

Ejemplo

SELECT
  student.full_name,
  lecturer.full_name
FROM student
JOIN lecturer
ON student.advisor_id = lecturer.id;

SELECT
  student.full_name,
  lecturer.full_name
FROM student
LEFT JOIN lecturer
ON student.advisor_id = lecturer.id;

Revise esta lista de siete ejemplos SQL JOIN con explicaciones para más detalles.

Dónde aprender más sobre INNER JOIN y OUTER JOIN

Ahora que conoce las diferencias entre INNER JOIN vs. OUTER JOIN, puede escribir consultas precisas que generen información confiable y precisa. Con la práctica, podrás hacer frente a cualquier pregunta de entrevista SQL sobre las diferencias entre INNER JOIN y OUTER JOIN.

Antes de irte, te recomiendo nuestro Tipos de JOIN en SQL curso si quieres profundizar tus conocimientos. Al final del curso, conocerás las distintas formas de obtener datos combinados de varias tablas. Y entenderás cómo elegir la mejor opción para cada escenario.

Ahora te toca a ti empezar a informarte sobre las diferencias entre INNER JOIN y OUTER JOIN. ¡Feliz aprendizaje!