Aprende SQL: aprendersql.com es un curso guiado gratuito de SQL. Este curso de sql para principiantes esta pensado para que aprendas este lenguaje de consulta de bases de datos desde cero paso a paso y con ejemplos. Tambien puedes consultar nuestro manual de referencia.

Curso SQL Referencias Comunidad
← Lecciones

Leccion 9 - Tipos de JOIN

Tiempo estimado de lectura: 8 minutos

La potencia de trabajar con un modelo de base de datos relacional reside en poder combinar filas de diferentes tablas. En una base de datos relacional, tenemos diferentes tablas cada con informacion propia de una entidad. Podrias preguntarte y por que no tener un solo tablon con todos los datos? Aqui es donde entra una de las caracteristicas de las bases de datos relacionales por las que obtiene su potencia.

En primer lugar, un modelo relacional permite evitar la redundancia de datos, esto es, repetir informacion, lo que permite ahorrar en costes de almacenamiento, porque?, imagina una tabla de ventas con millones de filas y en la que tengamos el nombre y apellidos de los clientes, el dia de la compra, el nombre del producto, entre otros campos, esto haria que tuvieramos informacion repetida, lo que con un modelo relacional podemos optimizar. Cuando hablamos de evitar repetir informacion en una base de datos, estariamos hablando de lo que se denomina normalizacion (de las tablas), es decir cada tabla contiene la informacion solamente necesaria a nivel de Cliente o Producto de manera minima. Por ello una tabla Clientes en un modelo relacional deberia de poder tener solo un unico registro para cada cliente. Recuerdas el concepto de clave primaria que explicamos en la leccion de Modelo Entidad-Relacion?. Lo mismo ocurriria con una tabla de Productos en un modelo de base de datos relacional. De esta manera si quisieramos registrar las ventas de la empresa, podriamos utilizar otra tabla en la que no necesitemos tener que repetir el Nombre y Apellidos del cliente en cada transaccion pudiendo poder tener en la tabla Ventas solo el identificador del cliente para asi poder en cada registro de la tabla Ventas con este identificador de cliente poder ir a la tabla Clientes y consultar el Nombre, Apellidos y demas datos de un cliente. En esto reside la potencia de las bases de datos relacionales.

Y ahora vamos a aprender a como relacionar estas tablas con los diferentes tipos de JOIN en SQL.

Sigamos con el ejemplo de nuestra base de datos de ventas, en el tenemos una tabla de Clientes, otra de Ventas, y otra de Productos. Clientes es una tabla maestra de clientes mismamente dicha con IdCliente, Nombre, Apellidos, Email, y otros campos. La tabla Ventas con campos como IdCliente, IdProducto, FechaVenta, Cantidad e Importe. Asi mismo la tabla Productos contiene las columnas IdProducto, Categoria y PrecioUnidad. Si te fijas hay campos entre las tablas que se repiten como el IdCliente e IdProducto. Como ya vimos en la leccion Entidad-Relacion, estos campos a priori seran los que nos permitiran relacionar estas tablas.

INNER JOIN

Supongamos que entre la tabla Clientes y la tabla Ventas la relacion es 1:n es decir uno a muchos, es decir los datos de un cliente puede aparecer varias veces en la tabla ventas. Ahora supongamos que queremos, dada la informacion que tenemos en la tabla ventas, poder relacionar ambas tablas, Cliente y Ventas, obtener el Nombre y Apellidos de los clientes que realizaron compras, cuya informacion tenemos en la tabla ventas registrada dado cada IdCliente. Ademas no solo queremos el Nombre y Apellidos de los clientes si no tambien la fecha de la compra. Con SQL podemos hacer lo siguiente,

SELECT a.Nombre, a.Apellidos, b.FechaVenta
FROM Clientes AS a
JOIN Ventas AS b ON b.IdCliente = a.IdCliente 

Aha, fijate en que estamos haciendo una lectura de ambas tablas Clientes y Ventas, hasta ahora solo hemos visto la palabra clave FROM que utilizamos siempre que queramos indicar de que tabla queremos leer datos, si no que ahora tambien para leer datos de otra tabla hemos utilizado la palabra clave JOIN. JOIN es lo que nos permite indicar de que otra tabla queremos leer datos, y ademas esta palabra clave indica en nuestra consulta el tipo de relacion que queremos realizar con la primera tabla dada por FROM. Una vez indicadas ambas tablas con FROM y JOIN hemos de indicar los campos por los que se relacionan ambas tablas, en este caso, lo indicamos a continuacion de la palabra clave ON, en este caso la relacion es que IdCliente de la tabla Clientes con el IdCliente de la tabla Ventas.

Cuando utilizamos JOIN estamos indicando que la relacion entre ambas tablas es identica, es decir, que la relacion dada por los campos IdCliente es perfecta, de manera que en el resultado obtendremos todos los registros de la tabla Ventas que hagan match con la tabla Clientes dada la relacion utilizando el campo IdCliente como elemento comun.

Asi mismo, cuando utilizamos JOIN tambien podemos utilizar en nuestra consulta la palabra INNER JOIN. Ambas palabras claves establecen el mismo tipo de match que queremos consultar entre dos tablas. No te preocupes por esto mismo ahora mismo.

LEFT JOIN

Ahora imagina que en nuestra base de datos tenemos registrados Clientes que nunca hicieron compras aun. Que ocurre que si realizamos la consulta anterior donde indicamos como relacionar ambas tablas dado por INNER JOIN, cuando queremos obtener los datos de la fecha de compra de nuestros clientes, al haber clientes que nunca han hecho compras, estos clientes no apareceran en el resultado debido a que por cada venta debe de haber un cliente.

Por ello imagina que queremos saber ademas de los clientes que hicieron compras, tambien queremos saber que clientes no hicieron compras aun. Esto lo podemos obtener utilizando el siguiente tipo de JOIN que vamos a introducir ahora, LEFT JOIN.

LEFT JOIN nos permite obtener resultados al relacionar dos tablas, incluso en los casos en los que no hagan match perfecto. Por lo que otra manera de escribir la consulta anterior seria de la siguiente manera.

SELECT a.Nombre, a.Apellidos, b.FechaVenta
FROM Clientes AS a
LEFT JOIN Ventas AS b ON b.IdCliente = a.IdCliente 

Con esta consulta obtendremos los datos de todos los clientes hayan hecho compras o no, esto es, cuando la relacion Cliente.IdCliente = Ventas.IdCliente haga match o no.

RIGHT JOIN

Tambien se puede dar el caso que tengamos Ventas que por el motivo que sea, puede ser que un cliente haya decidido que se borren sus datos de la base de datos, que puede ser hoy en dia dada las distintas leyes de proteccion de datos de usuarios y consumidores de productos y servicios. Entonces si se da el caso de que tengamos esta casuistica, en nuestra tabla Ventas tendremos datos de Ventas que no podremos relacionar con nuestra tabla Clientes, no al menos podremos saber el Nombre y Apellidos del cliente que las realizo. De esta manera si queremos incluir estos registros en nuestros resultados podemos utilizar RIGHT JOIN como forma de relacionar ambas tablas. De esta manera la consulta que utilizamos al principio de la leccion quedaria asi.

SELECT a.Nombre, a.Apellidos, b.FechaVenta
FROM Clientes AS a
RIGHT JOIN Ventas AS b ON b.IdCliente = a.IdCliente 

RIGHT JOIN seria el caso opuesto al utilizado en LEFT JOIN. Pero fijate que tambien podriamos reescribir nuestra consulta cambiando el orden de lectura de las tablas y obtener los mismos resultados. De manera que nuestra consulta quedaria asi

SELECT a.Nombre, a.Apellidos, b.FechaVenta
FROM Ventas AS b 
LEFT JOIN Clientes AS a ON b.IdCliente = a.IdCliente 

FULL OUTER JOIN

Que ocurre si simplemente queremos todos los resultados combinar ambas tablas Clientes y Ventas indistintamente de que hagan match o no dado el campo IdCliente. En estos casos podemos utilizar el tipo de join llamado FULL OUTER JOIN. Para ello simplemente deberiamos de poder indicar en la forma de relacionar las dos tablas del ejemplo, de manera que nuestra consulta quedaria asi.

SELECT a.Nombre, a.Apellidos, b.FechaVenta
FROM Clientes AS a
FULL OUTER JOIN Ventas AS b ON b.IdCliente = a.IdCliente 

Leer y combinar datos de dos o más tablas

Ocurre que muchas veces queremos combinar filas de dos mas tablas en una sola consulta. Esto es posible, podemos leer datos de dos o mas tablas en una sola consulta SQL, para ello simplemente hay que añadir indicando el tipo de JOIN que queremos establecer con la primera tabla de lectura.

Por ejemplo,

SELECT a.IdVenta, a.IdFecha, a.Importe, b.Producto , c.Nombre, c.Apellidos
FROM Ventas AS a 
INNER JOIN Productos AS b ON b.IdProducto = a.idProducto 
INNER JOIN Clientes AS c ON c.IdCliente = a.IdCliente 

Esta consulta nos permitirá combinar filas de la tabla Ventas con las otras dos tablas Productos y Clientes. Sencillo verdad?