Inner Join Vs Outer Join: Diferencia exacta con ejemplos

Inner Join Vs Outer Join: Prepárate para explorar las diferencias exactas entre Inner y Outer Join

Antes de explorar las diferencias entre Inner Join Vs Outer Join, veamos primero qué es un SQL JOIN?

Una cláusula join se utiliza para combinar registros o manipular los registros de dos o más tablas a través de una condición join. La condición de join indica cómo se comparan las columnas de cada tabla entre sí.

El join se basa en una columna relacionada entre estas tablas. Un ejemplo más común es la unión entre dos tablas a través de la columna de clave primaria y la columna de clave externa.

INNER JOIN VS OUTER JOIN

Supongamos que tenemos una tabla que contiene el salario de los empleados y hay otra tabla que contiene los detalles de los empleados.

En este caso, habrá una columna común como el ID del empleado que unirá estas dos tablas. Esta columna ID del empleado sería la clave primaria de las tablas de detalles del empleado y la clave foránea en la tabla de salario del empleado.

Es muy importante tener una clave común entre las dos entidades. Usted puede pensar en una tabla como una entidad y la clave como un vínculo común entre las dos tablas que se utiliza para la operación de unión.

Básicamente, hay dos tipos de unión en SQL es decir, Inner Join y Outer Join. Outer join se subdivide en tres tipos, es decir, Left Outer Join, Right Outer Join, y Full Outer Join.

En este artículo, vamos a ver la diferencia entre Inner Join y Outer Join en detalle. Mantendremos los Cross Joins y Unequal Joins fuera del ámbito de este artículo.

¿Qué es el Inner Join?

Un Inner Join devuelve sólo las filas que tienen valores coincidentes en ambas tablas (estamos considerando aquí que la unión se realiza entre las dos tablas).

¿Qué es el Outer Join?

El Outer Join incluye las filas coincidentes así como algunas de las filas no coincidentes entre las dos tablas. Un Outer join difiere básicamente del Inner join en cómo maneja la condición de falsa coincidencia.

Hay 3 tipos de Outer Join:

  • Left Outer Join: Devuelve todas las filas de la tabla IZQUIERDA y los registros coincidentes entre ambas tablas.
  • Right Outer Join: Devuelve todas las filas de la tabla DERECHA y los registros coincidentes entre ambas tablas.
  • Full Outer Join: Combina el resultado del Left Outer Join y el Right Outer Join.

Diferencia entre Inner y Outer Join

Diferencia entre INNER JOIN y OUTER JOIN

Como se muestra en el diagrama anterior, hay dos entidades, es decir, la tabla 1 y la tabla 2 y ambas tablas comparten algunos datos comunes.

Un Inner Join devolverá el área común entre estas tablas (el área sombreada en verde en el diagrama anterior), es decir, todos los registros que son comunes entre la tabla 1 y la tabla 2.

Un Left Outer Join devolverá todas las filas de la tabla 1 y sólo aquellas filas de la tabla 2 que son comunes a la tabla 1 también. Un Right Outer Join hará lo contrario. Dará todos los registros de la tabla 2 y sólo los correspondientes registros coincidentes de la tabla 1.

Además, un Full Outer Join nos dará todos los registros de la tabla 1 y de la tabla 2.

Comencemos con un ejemplo para que esto quede más claro.

Supongamos que tenemos dos tablas: EmpDetails y EmpSalary.

Tabla EmpDetails:

EmployeeID EmployeeName
1 John
2 Samantha 3 Hakuna 4 Silky 5 Ram
6 Arpit
7 Lily 8 Sita
9 Farah
10 Jerry

Tabla de salarios:

EmployeeID EmployeeName EmployeeSalary
1 John 50000
2 Samantha 120000
3 Hakuna 75000
4 Silky 25000
5 Ram 150000 6 Arpit 80000 11 Rose 90000 12 Sakshi 45000
13 Jack 250000

Hagamos un Inner Join en estas dos tablas y observemos el resultado:

Consulta:

SELECT EmpDetails. EmployeeID, EmpDetails. EmployeeName, EmpSalary. EmployeeSalaryFROM EmpDetails INNER JOIN EmpSalaryON EmpDetails. EmployeeID = EmpSalary. EmployeeID;

Resultado:

.

EmployeeID EmployeeName EmployeeSalary
1 John 50000
2 Samantha 120000 3 Hakuna 75000
4 Silky 25000
5 Ram 150000
6 Arpit 80000

En el conjunto de resultados anterior, puede ver que el Inner Join ha devuelto los primeros 6 registros que estaban presentes en EmpDetails y EmpSalary que tienen una clave coincidente, es decir.es decir, EmployeeID. Por lo tanto, si A y B son dos entidades, el Inner Join devolverá el conjunto de resultados que será igual a ‘Registros en A y B’, basado en la clave coincidente.

Veamos ahora lo que hará un Left Outer Join.

Query:

SELECT EmpDetails. EmployeeID, EmpDetails. EmployeeName, EmpSalary. EmployeeSalaryFROM EmpDetails LEFT JOIN EmpSalaryON EmpDetails. EmployeeID = EmpSalary. EmployeeID;

Resultado:

EmployeeID EmployeeName EmployeeSalary
1 John 50000
2 Samantha 120000
3 Hakuna 75000
4 Silky 25000
5 Ram 150000
6 Arpit 80000
7 Lily NULL
8 Sita NULL
9 Farah NULL
10 Jerry NULL

En el conjunto de resultados anterior, puede ver que la unión exterior izquierda ha devuelto los 10 registros de la tabla IZQUIERDA, es decirEs decir, la tabla EmpDetails y como los primeros 6 registros coinciden, ha devuelto el salario del empleado para estos registros coincidentes.

Como el resto de los registros no tienen una clave coincidente en la tabla RIGHT, es decir, la tabla EmpSalary, ha devuelto NULL correspondiente a ellos. Como Lily, Sita, Farah y Jerry no tienen un ID de empleado que coincida en la tabla EmpSalary, su salario se muestra como NULL en el conjunto de resultados.

Así que, si A y B son dos entidades, entonces el left outer join devolverá el conjunto de resultados que será igual a ‘Records in A NOT B’, basado en la clave coincidente.

Ahora observemos lo que hace el Right Outer Join.

Query:

SELECT EmpDetails. EmployeeID, EmpDetails. EmployeeName, EmpSalary. EmployeeSalaryFROM EmpDetails RIGHT join EmpSalaryON EmpDetails. EmployeeID = EmpSalary. EmployeeID;

Resultado:

EmployeeID EmployeeName EmployeeSalary
1 John 50000
2 Samantha 120000
3 Hakuna 75000
4 Silky 25000
5 Ram 150000
6 Arpit 80000
NULL NULL 90000
NULL NULL 250000
NULL NULL 250000

En el conjunto de resultados anterior, puede ver que el Right Outer Join ha hecho justo lo contrario que el left join. Ha devuelto todos los salarios de la tabla derecha, es decir, la tabla EmpSalary.

Pero, como Rose, Sakshi y Jack no tienen un ID de empleado que coincida en la tabla izquierda, es decir, la tabla EmpDetails, hemos obtenido su ID de empleado y EmployeeName como NULL de la tabla izquierda.

Así que, si A y B son dos entidades, entonces la unión externa derecha devolverá el conjunto de resultados que será igual a ‘Registros en B NO A’, basado en la clave coincidente.

Veamos también cuál será el conjunto de resultados si estamos haciendo una operación de selección en todas las columnas en ambas tablas.

Query:

SELECT *FROM EmpDetails RIGHT JOIN EmpSalaryON EmpDetails. EmployeeID = EmpSalary. EmployeeID;

Resultado:

EmployeeID EmployeeName EmployeeID EmployeeName SalarioEmpleado
1 John 1 John 50000
2 Samantha 2 Samantha 120000
3 Hakuna 3 Hakuna 75000
4 Silky 4 Silky 25000
5 Ram 5 Ram 150000
6 Arpit 6 Arpit 80000
NULL NULL 11 Rose 90000
NULL NULL 12 Sakshi 250000
NULL NULL 13 Jack 250000

Ahora, pasemos a la unión completa.

Un full outer join se hace cuando queremos todos los datos de ambas tablas independientemente de si hay una coincidencia o no. Por lo tanto, si quiero todos los empleados, incluso si no encuentro una clave coincidente, ejecutaré una consulta como se muestra a continuación.

Consulta:

SELECT *FROM EmpDetails FULL JOIN EmpSalaryON EmpDetails. EmployeeID = EmpSalary. EmployeeID;

Resultado:

EmployeeID EmployeeName EmployeeID EmployeeName EmployeeSalary
1 John 1 John 50000
2 Samantha 2 Samantha 120000
3 Hakuna 3 Hakuna 75000
4 Silky 4 Silky 25000
5 Ram 5 Ram 150000
6 Arpit 6 Arpit 80000
7 Lily NULL NULL NULL
8 Sita NULL NULL NULL
9 Farah NULL NULL NULL
10 Jerry NULL NULL NULL
NULL NULL 11 Rose 90000
NULL NULL 12 Sakshi 250000
NULL NULL 13 Jack 250000

Se puede ver en el conjunto de resultados anterior que como los seis primeros registros coinciden en ambas tablas, tenemos todos los datos sin ningún NULL. Los siguientes cuatro registros existen en la tabla izquierda pero no en la tabla derecha, por lo que los datos correspondientes en la tabla derecha son NULL.

Los últimos tres registros existen en la tabla derecha y no en la tabla izquierda, por lo que tenemos NULL en los datos correspondientes de la tabla izquierda. Por lo tanto, si A y B son dos entidades, el full outer join devolverá el conjunto de resultados que será igual a ‘Registros en A Y B’, independientemente de la clave coincidente.

Teóricamente, es una combinación de Left Join y Right Join.

Rendimiento

Comparemos un Inner Join contra un Left Outer Join en el servidor SQL. Hablando de la velocidad de la operación, un JOIN externo izquierdo no es obviamente más rápido que un inner join.

Según la definición, un outer join, ya sea el izquierdo o el derecho, tiene que realizar todo el trabajo de un inner join junto con el trabajo adicional nulo de extender los resultados. Se espera que un outer join devuelva un mayor número de registros, lo que aumenta su tiempo de ejecución total sólo por el mayor conjunto de resultados.

Por lo tanto, un outer join es más lento que un inner join.

Además, puede haber algunas situaciones específicas en las que el Left join será más rápido que un Inner join, pero no podemos seguir sustituyéndolos entre sí ya que un left outer join no es funcionalmente equivalente a un inner join.

Discutiremos un caso en el que el Left Join podría ser más rápido que el Inner Join. Si las tablas involucradas en la operación de unión son muy pequeñas, digamos que tienen menos de 10 registros y las tablas no poseen índices suficientes para cubrir la consulta, en ese caso, el Left Join es generalmente más rápido que el Inner Join.

Creemos las dos tablas de abajo y hacemos un INNER JOIN y un LEFT OUTER JOIN entre ellas como ejemplo:

CREATE TABLE #Table1(ID int NOT NULL PRIMARY KEY,Name varchar(50) NOT NULL)INSERT #Table1 (ID, Name) VALUES (1, 'A')INSERT #Table1 (ID, Name) VALUES (2, 'B')INSERT #Table1 (ID, Name) VALUES (3, 'C')INSERT #Table1 (ID, Name) VALUES (4, 'D')INSERT #Table1 (ID, Name) VALUES (5, 'E')CREATE TABLE #Table2(ID int NOT NULL PRIMARY KEY,Name varchar(50) NOT NULL)INSERT #Table2 (ID, Name) VALUES (1, 'A')INSERT #Table2 (ID, Name) VALUES (2, 'B')INSERT #Table2 (ID, Name) VALUES (3, 'C')INSERT #Table2 (ID, Name) VALUES (4, 'D')INSERT #Table2 (ID, Name) VALUES (5, 'E')SELECT *FROM #Table1 t1INNER JOIN #Table2 t2ON t2.Name = t1.Name

ID Nombre ID Nombre
1 1 A 1 A
2 2 B 2
3 3 C 3 C 4 4 D 4 D
5 5 E 5 E
SELECT * FROM (SELECT 38 AS bah) AS foo JOIN (SELECT 35 AS bah) AS barON (55=55);
ID Nombre ID Nombre
1 1 A 1 A
2 2 B 2 B
3 3 C 3 C
4 4 D 4 D
5 5 E 5 E

Como puede ver arriba, ambas consultas han devuelto el mismo conjunto de resultados. En este caso, si ve el plan de ejecución de ambas consultas, verá que la unión interna ha costado más que la unión externa. Esto se debe a que, para una unión interna, el servidor SQL hace una coincidencia de hash mientras que hace bucles anidados para la unión izquierda.

Una coincidencia de hash es normalmente más rápida que los bucles anidados. Pero, en este caso, como el número de filas es tan pequeño y no hay ningún índice que utilizar (ya que estamos haciendo la unión en la columna nombre), la operación hash se ha convertido en una consulta de unión interna más cara.

Sin embargo, si cambia la clave de coincidencia en la consulta de unión de Nombre a ID y si hay un gran número de filas en la tabla, entonces encontrará que la unión interna será más rápida que la unión externa izquierda.

Unión interna y externa de MS Access

Cuando se utilizan varias fuentes de datos en la consulta de MS Access, se aplican JOINs para controlar los registros que se quieren ver, dependiendo de cómo se vinculan las fuentes de datos entre sí.

En una unión interna, sólo los relacionados de ambas tablas se combinan en un único conjunto de resultados. Este es un join por defecto en Access y el más utilizado también. Si aplica una unión pero no especifica explícitamente de qué tipo de unión se trata, Access asume que es una unión interna.

En las uniones externas, todos los datos relacionados de ambas tablas se combinan correctamente, además de todas las filas restantes de una tabla. En las uniones externas completas, todos los datos se combinan siempre que sea posible.

Unión izquierda vs unión externa izquierda

En SQL server, la palabra clave outer es opcional cuando se aplica la unión externa izquierda. Por lo tanto, no hace ninguna diferencia si usted escribe ‘LEFT OUTER JOIN’ o ‘LEFT JOIN’ ya que ambos van a dar el mismo resultado.

A LEFT JOIN B es una sintaxis equivalente a A LEFT OUTER JOIN B.

A continuación se muestra la lista de sintaxis equivalentes en el servidor SQL:

sintaxis equivalentes en SQL server

Left Outer Join vs Right Outer Join

Ya hemos visto esta diferencia en este artículo. Puede consultar las consultas Left Outer Join y Right Outer Join y el conjunto de resultados para ver la diferencia.

La principal diferencia entre el Left Join y el Right Join radica en la inclusión de las filas no coincidentes. El Left outer join incluye las filas no coincidentes de la tabla que está a la izquierda de la cláusula de unión, mientras que el Right outer join incluye las filas no coincidentes de la tabla que está a la derecha de la cláusula de unión.

La gente se pregunta qué es mejor usar, es decir, Left join o Right join. Básicamente, son el mismo tipo de operaciones, pero con los argumentos invertidos. Por lo tanto, cuando se pregunta qué unión utilizar, en realidad se está preguntando si se debe escribir a<b o b>a. Es sólo una cuestión de preferencia.

En general, la gente prefiere utilizar Left join en su consulta SQL. Yo sugeriría que usted debe ser coherente en la forma en que está escribiendo la consulta con el fin de evitar cualquier confusión en la interpretación de la consulta.

Hemos visto todo sobre Inner join y todo tipo de Outer joins hasta ahora. Vamos a resumir rápidamente la diferencia entre Inner Join y Outer Join.

Diferencia entre Inner Join y Outer Join en formato tabular

Inner Join Outer Join
Devuelve sólo las filas que tienen valores coincidentes en ambas tablas. Incluye las filas que coinciden así como algunas de las filas que no coinciden entre las dos tablas.
En caso de que haya un gran número de filas en las tablas y haya un índice que utilizar, INNER JOIN es generalmente más rápido que OUTER JOIN. Generalmente, un OUTER JOIN es más lento que un INNER JOIN ya que necesita devolver más número de registros en comparación con INNER JOIN. Sin embargo, puede haber algunos escenarios específicos donde OUTER JOIN es más rápido.
Cuando no se encuentra una coincidencia, no devuelve nada. Cuando no se encuentra una coincidencia, se coloca un NULL en el valor de la columna devuelta.
Use INNER JOIN cuando quiera buscar información detallada de alguna columna específica. Use OUTER JOIN cuando quiera mostrar la lista de toda la información de las dos tablas.
INNER JOIN actúa como un filtro. Debe haber una coincidencia en ambas tablas para que un inner join devuelva datos. Actúan como data-add ons.
Existe la notación de join implícito para inner join que alista las tablas a unir separadas por comas en la cláusula FROM.
Ejemplo: SELECT * FROM product, category WHERE product.CategoryID = category.CategoryID;
No existe notación de unión implícita para la unión externa.
A continuación se muestra la visualización de un inner join:
visualización de un inner join
A continuación la visualización de un outer join
visualización de un outer join

Inner and Outer Join vs Union

A veces, confundimos Join y Union y esta es también una de las preguntas más frecuentes en las entrevistas SQL. Ya hemos visto la diferencia entre inner join y outer join . Ahora, veamos en qué se diferencia un JOIN de un UNION.

UNION coloca una línea de consultas una tras otra, mientras que join crea un producto cartesiano y lo subconjunta. Por lo tanto, UNION y JOIN son operaciones completamente diferentes.

Ejecutamos las dos consultas siguientes en MySQL y vemos su resultado.

Consulta UNION:

SELECT 28 AS bahUNIONSELECT 35 AS bah;

Resultado:

Bah
1 28
2 35

Consulta JOIN:

SELECT * FROM(SELECT 38 AS bah) AS fooJOIN(SELECT 35 AS bah) AS barON (55=55);

Resultado:

foo Bar
1 38 35

Una operación UNION pone el resultado de dos o más consultas en un único conjunto de resultados. Este conjunto de resultados contiene todos los registros que se devuelven a través de todas las consultas implicadas en la UNIÓN. Por lo tanto, básicamente, una UNIÓN está combinando los dos conjuntos de resultados juntos.

Una operación de unión obtiene datos de dos o más tablas sobre la base de las relaciones lógicas entre estas tablas, es decir, sobre la base de la condición de unión. En la consulta de unión, los datos de una tabla se utilizan para seleccionar registros de otra tabla. Le permite vincular datos similares que están presentes en diferentes tablas.

Para entenderlo de forma muy sencilla, se puede decir que una UNION combina filas de dos tablas mientras que una join combina columnas de dos o más tablas. Por lo tanto, ambos se utilizan para combinar los datos de n tablas, pero la diferencia radica en cómo se combinan los datos.

A continuación se muestran las representaciones pictóricas de UNION y JOIN.

UNION y JOIN1

Lo anterior es una representación pictórica de una operación de unión que muestra que cada registro en el conjunto de resultados contiene columnas de ambas tablas, es decir, la Tabla A y la Tabla B. Este resultado se devuelve en base a la condición de unión aplicada en la consulta.

Una unión es generalmente el resultado de la desnormalización (opuesto a la normalización) y utiliza la clave externa de una tabla para buscar los valores de la columna empleando la clave primaria en otra tabla.

UNION y JOIN2

Lo anterior es una representación pictórica de una operación UNION que muestra que cada registro en el conjunto de resultados es una fila de cualquiera de las dos tablas. Por lo tanto, el resultado de la UNION ha combinado las filas de la Tabla A y la Tabla B.

Más información =>> MySQL UNION explicado con ejemplos

Conclusión

En este artículo, hemos visto las principales diferencias entre el Inner Join y Outer Join en SQL. También vimos la clasificación de un Outer Join es decir, Left join, Right join y Full join. Hemos visto cómo funciona cada uno de estos tipos de join y cómo varían entre sí.

También hicimos una comparación de rendimiento entre estos tipos de join. También discutimos cómo una unión es diferente de una unión.

También lea =>> Tipos de unión de MySQL

Espero que este artículo le haya ayudado a despejar sus dudas con respecto a las diferencias entre los diversos tipos de unión. Estamos seguros de que esto de hecho le hará decidir qué tipo de unión para elegir sobre la base del conjunto de resultados deseados.