Usos y diferencias entre Inner, Left y Right join

En el mundo de las bases de datos relacionales encontramos las palabras claves inner, left y right join, que se usan para encontrar relaciones entre dos tablas indexadas. En este artículo vamos a ahondar sobre la utilidad y diferencias de cada una de ellas.

Para este fin vamos como a usar como ejemplo dos tablas indexadas entre sí, una llamada clientes y la otra ventas. Las dos tablas se relacionan entre sí por medio campos clientes.id (PK) y ventas.cliente_id (FK).

tabla clientes
Tabla Clientes – Diferencia inner, left. right join
tabla ventas

Tabla Ventas – Diferencia inner, left. right join

Te invitamos a seguir leyendo las siguientes páginas donde mostraremos la diferencia entre las relaciones inner, left y right join:


Relación Inner Join


Con esta relación se van a obtener los registros que son comunes a ambas tablas. En nuestro ejemplo, como la relación es entre los campos clientes.id y ventas.cliente_id, el inner join va a obtener los registros donde ambos campos son iguales.

En el diagrama de Venn se muestra lo que se quiere obtener con esta relación del ejemplo:

Inner Join
Inner Join

En términos de consulta SQL para MySQL tendríamos la siguiente sintaxis para el ejemplo:

select * from clientes c inner join  ventas v on c.id=v.cliente_id

Que en nuestro ejemplo da como resultado:

Resultado de Inner Join
Resultado de Inner Join

Vemos entonces que aparecen con Inner Join los registros comunes a las dos tablas donde son iguales clientes.id y ventas.cliente_id, es decir donde están los códigos 1 y 3.


Relación Left Join


Con Left Join se obtiene además de los registros comunes del inner join, los registros que pertenecen a la tabla que se nombra a la izquierda de la consulta.

Para nuestro ejemplo en el diagrama de Venn es así:

Left Join
Left Join

Que en consulta SQL para el ejemplo sería así:

select * from clientes c left join  ventas v on c.id=v.cliente_id

Y da como resultado:

Resultado Left Join
Resultado Left Join

Ahora con Left Join se obtienen los registros del inner join (1 y 3), más los restantes registros de la tabla clientes (2 y 4).


Relación Right Join


Con Right Join se obtiene además de los registros comunes de inner, los que pertenecen a la tabla que se nombra a la derecha de la consulta.

Para el ejemplo en cuestión en el diagrama de Venn es así:

Right Join

Y da como resulado en el ejemplo:

select * from clientes c left join  ventas v on c.id=v.cliente_id

Resultado de Right Join
Resultado de Right Join

Aquí vemos que además de los registros del inner join (1,3), se obtuvieron los registros que faltaban de la tabla ventas (8).


Relación Left Outer Join


Con Left Outer Join se obtienen los registros de la tabla de la izquierda que no son comunes a ambas tablas.

Que en términos del diagrama de Venn del ejemplo sería así:

Left Outer Join
Left Outer Join

Como estamos usando MySQL en el ejemplo, esta SQL sería como ésta:

select * from clientes c left  join  ventas v on c.id=v.cliente_id where v.cliente_id is null

Y da como resultado:

Resultado de Left Outer Join
Resultado de Left Outer Join

Aquí vemos que sólo salen los registros 2 y 4 de la tabla clientes, que no son comunes con la tabla Ventas.


Relación Right Outer Join


Con Right Outer Join se obtienen los registros de la tabla de la derecha que no son comunes a ambas tablas.

Que en términos del diagrama de Venn del ejemplo sería:

Right Outer Join

Como usamos MySQL en el ejemplo, la SQL sería como ésta:

select * from clientes c right join ventas v on c.id=v.cliente_id where c.id  is null

Y da como resultado:

Resultado de Right Outer Join
Resultado de Right Outer Join

Aquí sale sólo el registro con código 8 de la tabla ventas, que es el valor no común con la tabla clientes.


Relación Full Outer Join


Con Full Outer Join se obtienen los registros de ambas tablas que no son comunes entre ellas.

Que en el diagrama de Venn del ejemplo sería:

Full Outer Join

Como usamos MySQL en el ejemplo, esta SQL sería como ésta:

select * from clientes c left  join  ventas v on c.id=v.cliente_id where v.cliente_id is null
union
select * from clientes c right join ventas v on c.id=v.cliente_id where c.id is null

Y da como resultado:

Resultado de Full Outer Join
Resultado de Full Outer Join

Aquí no tenemos registros con valores comunes, sólo aparecen registros donde clientes.id y ventas.cliente_id no son iguales en ambas tablas.

Como conclusión, el uso adecuado de estas sentencias permite hacer consultas más efectiva en términos de tiempo y de carga de procesamiento. Es también importante anotar que para que la consulta sea más eficiente, se deben indexar las tablas y generar los llaves primarias y foráneas de las tablas que se quieren relacionar.

Este artículo hace parte del sistema de divulgación de conocimiento de ITSoftware SAS.

Si te gustó, por favor no olvides compartirlo en las redes sociales. 😉

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.