Diferencia entre inner join, left join y right join. SQL

Hoy otra cuestión a petición de un lector que decía que su nivel de inglés no era el suficiente para orientarse con la muy válida explicación que hay en StackOverflow que hasta incluye este útil diagrama:

Uniones entre tablas SQL
Diferentes tipos de uniones entre tablas

Si bien finalmente encontró una válida explicación en otras páginas (hay unas cuantas) me da pie para esta entrada. ¿Qué diferencia hay entre un inner join y un left o un right join?

Las más comunes suelen ser las uniones internas entre tablas (inner join), como ejemplo os diré que en los últimos seis meses, desde que empecé en mi actual trabajo, he tenido que hacer sólo 3 uniones externas mientras que internas he hecho docenas. Un inner join, si miráis el diagrama, se podría representar como la intersección entre dos conjuntos, es decir, una consulta con inner join mostraría los registros de las tablas que coincidan en los campos de la unión que se ha definido en dicha consulta. Dicho así es denso, pero con un ejemplo se entiende claro.

Supongamos que tenemos una tabla con los empleados de una empresa (con un identificador llamado Id, un campo de nombre, uno de apellidos y uno con el Id del departamento en que trabaja llamado IdDepartamento) y en otra tenemos los departamentos (Id y Nombre). Algunos trabajadores tienen un departamento asignado y otros no, y obviamente la relación entre ambas tablas se da entre el campo Id de Departamento con el campo IdDepartamento de la tabla Empleados. Utilizando un inner join podríamos obtener el listado de todos los trabajadores que tienen un departamento asignado:

select e.nombre, e.apellidos from empleados e inner join departamentos d on e.IdDepartamento=d.Id;

En cuanto al enlace externo tenemos dos opciones: left join y right join. Con esta unión recuperamos todos los enlaces de una tabla y los datos de la otra que coinciden con la condición definida en la consulta. Cuando usamos una unión left join recogemos todos los datos de la tabla que está a la izquierda de la unión en la consulta y si usamos en cambio right join las de la derecha. Imaginemos las tablas de antes, pero ahora queremos todos los datos de la tabla empleados, tengan o no departamento, y además el dato de en qué departamento están si lo tuvieran. Usaremos un left join para obtener los datos.

select e.nombre, e.apellidos from empleados e left join departamentos d on e.IdDepartamento=d.Id

En este caso obtendríamos los nombres y apellidos de todos los empleados, los departamentos de los que lo tenga y en los que no recibiríamos un campo con un valor NULL.

Finalmetne tendríamos opciones como el full outer join o producto cartesiano, que nos sacaría todos los valores de ambas tablas.

A partir de esto y mezclando varias tablas y condiciones extra en una cláusula WHERE podemos lograr resultados más complejos.

Anuncios

19 comentarios en “Diferencia entre inner join, left join y right join. SQL

      1. carlos

        Toda la razón, si no sabes de teoría de conjunto no pillarás nada, pero si lo sabes, entonces todo estará muy claro en cuanto a joins

    1. Malacatón

      Joder tío. Lo primero un poco de respeto al autor que aunque ni lo conozcamos ni vayamos a pagarle nada, se ha tomado la molestia de intentar ayudarnos, incluso si la explicación no te sirve.

      Lo segundo, está explicado de forma muy clara, y el gráfico que lo muestra es de lo más claro que he visto respecto a esto.

  1. eddy (Guatemala)

    Mas claro, imposible jajaja aunque me hubiese gustado que continuaras profundizando, (claro está que solo se quería ver la diferencias entre inner e inner join)
    Gracias

  2. Buenas.

    ¿Podrías incluír el CROSS JOIN y la diferencia con FULL OUTER JOIN?
    Es que full outer join no es un producto cartesiano, es una unión de dos tablas que une los registros coincidentes en la cláusula ON y los no coincidentes devuelve nulos, es cross join el producto cartesiano pues éste no rellena con nulos, simplemente devuelve todas las combinaciones posibles de combinar de cada registro de cada tabla (especialmente interesante cuando entran en juego más de 2 tablas).

    Saludos.

  3. Oscar Galindez

    De verdad que cada vez que tengo dudas sobre el comportamiento de los Joins en SQL, este post es que me resuelve todo en 60segundos, que didactico es.

  4. David Araya

    Efectivamente se entiende súper bien, pero hay que darse su tiempo para leer y COMPRENDER.
    Lo más simple es hacerse una tabla con 5 empleados y 10 departamento y ver las diferencias, entre Inner Join, Left Join y Right Join.

    Gracias al autor por este post.

  5. WoNDeR

    Que comico el que dice que esto no sirve jajaja, ese man tiene que ser down por completo, si esto lo entiende hasta mi hermanita de 9 años x dios la vida.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s