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

Cómo crear una combinación izquierda de varias tablas en SQL

¿Se pueden hacer LEFT JOIN de tres tablas en SQL? Sí, por supuesto. Si es necesario, en una consulta de análisis se pueden usar varias operaciones LEFT JOIN. En este artículo, voy a incluir algunos ejemplos para demostrar cómo hacer LEFT JOIN a varias tablas en SQL y cómo evitar algunos errores habituales al hacerlo.

¿Qué es una operación LEFT JOIN?

Comencemos recordando qué es una operación LEFT JOIN y cómo usarla. Como recordará, las INNER JOIN solo devuelven los registros que están en ambas tablas. En cambio, las operaciones LEFT JOIN de SQL devuelven todos los registros (o filas) de la tabla izquierda y solo los registros (o filas) que coinciden de la derecha. Esto quiere decir que, si una fila específica está presente en la tabla izquierda, pero no en la derecha, el resultado incluirá esta fila y valores NULL en cada columna de la derecha. Si un registro de la tabla derecha no está en la izquierda, no se incluirá en el resultado.

Únete a

La sintaxis general de las operaciones LEFT JOIN es la siguiente:

SELECT column nombres
FROM tabla1
LEFT JOIN tabla2
  ON tabla1.columna_comun = tabla2.columna_comun;

Si quiere obtener más información sobre las combinaciones en SQL, consulte esta completa guía. Si desea practicar con diferentes tipos de combinaciones, consulte nuestro curso interactivo Tipos de JOIN en SQL, que incluye más de 90 ejercicios prácticos.

La operación LEFT JOIN se utiliza a menudo para las tareas de análisis. En primer lugar, es muy útil para identificar registros de una tabla específica para los que no existen registros en otra. En este caso, se puede añadir una cláusula WHERE a la consulta para seleccionar, del resultado de la combinación, las filas con valores NULL de todas las columnas de la segunda tabla. Sin embargo, primero hay que asegurarse de que la segunda tabla no tiene registros con valores NULL en todas las columnas, excepto en el campo común utilizado para la combinación. También, se puede usar una columna de la segunda tabla que esté completamente llena de valores que no son NULL, en caso de que exista.

Este es otro escenario. Imaginemos que tenemos una librería online y queremos mostrar los clientes que realizaron pedidos en los últimos 6 meses y los que estuvieron inactivos durante el mismo periodo. En este caso, queremos que el resultado incluya a TODOS los clientes, tanto los activos como los inactivos, y que una los datos sobre nuestros clientes con los datos sobre las ventas recientes. Aquí, encaja perfectamente una operación LEFT JOIN.

Estas son las tablas clientes y ventas de nuestra librería:

clientes

idnombreapellidosexoedadcliente_desde
1DanielBlackM342014-10-13
2ErikBrownM252015-06-10
3DianaTrumpF392015-10-25
4AnnaYaoF192017-02-20
5ChristianSandersM422018-01-31

ventas

idfechaid_del_libroid_del_clientecantidadimporte
12019-09-0223114.99
22019-10-0112112.99
32019-10-0134115.75

Para unir estas dos tablas y obtener la información que necesitamos para el análisis, utilice la siguiente consulta SQL:

SELECT c.id, c.nombre, c.nombre, c.sexo, c.edad, c.cliente_desde,    
       s.fecha AS fecha_de_venta, sum(s.importe) AS total_gastado
FROM clientes c
LEFT JOIN ventas s
ON c.id = s.id_del_cliente
GROUP BY c.id;

Con ella, obtenemos todos los registros sobre los clientes, añadimos las fechas de las ventas y calculamos el importe total gastado. En la tabla siguiente, las filas que se mostrarían con la operación INNER JOIN están resaltadas en azul, mientras que el amarillo muestra los registros adicionales debidos a la LEFT JOIN.

idnombreapellidosexoedadcliente_desdefecha_de_ventatotal_gastado
1DanielBlackM342014-10-13[NULL][NULL]
2ErikBrownM252015-06-102019-10-0112.99
3DianaTrumpF392015-10-252019-09-0214.99
4AnnaYaoF192017-02-202019-10-0115.75
5ChristianSandersM422018-01-31[NULL][NULL]

Como puede ver, los clientes que no han comprado en el periodo indicado tienen el valor NULL en las celdas de fecha de venta y de importe total gastado, ya que sus registros no están presentes en la tabla ventas. Así es como funciona la LEFT JOIN. Puede practicar con las LEFT JOIN y con otros tipos de combinaciones en nuestro completo curso Tipos de JOIN en SQL. También, puede consultar nuestro programa de enseñanza Ejercicio de SQL, que incluye múltiples ejercicios de SQL con los que puede hacer ejercicios prácticos de varias construcciones de SQL.

Ahora, ¡vamos a ver casos más complicados!

Varias LEFT JOIN en una consulta

A veces, hay que usar LEFT JOIN en más de dos tablas para obtener los datos que se necesitan para determinados análisis. Afortunadamente, la palabra clave LEFT JOIN se puede utilizar en varias tablas en SQL.

Veamos un ejemplo. Queremos analizar cómo nuestra última campaña promocional influyó en el comportamiento de nuestros clientes.

promociones

idcampañaid_del_clientefecha
1SMS_discount1022019-09-01
2SMS_discount1032019-09-01
3SMS_discount1052019-09-01

Para hacerlo, tenemos que combinar los datos de las tablas clientes, ventas y promociones.

SELECT c.id, c.nombre, c.apellido, c.sexo, c.edad, c.cliente_desde, 
   s.fecha AS fecha_de_venta, p.fecha AS promocion
FROM clientes c
LEFT JOIN ventas s
ON c.id = s.id_del_cliente
LEFT JOIN promociones p
ON c.id = p.id_del_cliente;

Este es el resultado de la consulta:

idnombreapellidosexoedadcliente_desdefecha_de_ventapromocion
1DanielBlackM342014-10-13[NULL][NULL]
2ErikBrownM252015-06-102019-10-012019-09-01
3DianaTrumpF392015-10-252019-09-022019-09-01
4AnnaYaoF192017-02-202019-10-01[NULL]
5ChristianSandersM422018-01-31[NULL]2019-09-01

Como puede ver, al utilizar una LEFT JOIN, mantuvimos los registros de todos nuestros clientes, independientemente de su historial de compras o de su participación en las campañas promocionales. Por ejemplo, el Cliente 1 está en el resultado de la consulta, aunque no haya realizado ninguna compra ni haya recibido el mensaje promocional. También tenemos al Cliente 4, que ha comprado un libro, pero no ha recibido ningún mensaje promocional, y al Cliente 5, que ha recibido un mensaje promocional, pero no ha realizado ninguna compra. Por último, el resultado también incluye a los clientes que han realizado compras y han recibido mensajes promocionales (Clientes 2 y 3).

Observe que, en este ejemplo, hemos utilizado un campo común de la primera tabla para unir la segunda y la tercera tablas. Sin embargo, este no es siempre el caso. Veamos un caso en el que se utiliza un campo común de la segunda tabla para hacer la combinación izquierda con la tercera, pero no con la primera.

Queremos descubrir qué géneros de libros interesan más a nuestros clientes. Esta información es muy valiosa, ya que nos ayuda a ofrecerles una experiencia más personalizada con recomendaciones específicas de libros. Para este análisis, necesitaremos los datos de clientes, ventas y libros. Ya hemos unido las dos primeras en nuestro primer ejemplo. Ahora, a esto lo añadiremos la tabla libros.

libros

idnombreautorgenerocantidadprecio
1The Lord of the RingsJ. R. R. Tolkienfantasy712.99
2LolitaVladimir Nabokovnovel414.99
4The HobbitJ. R. R. Tolkienfantasy1010.75
5Death on the NileAgatha Christiedetective89.75

Para obtener los datos necesarios para analizar los libros y géneros que prefieren nuestros clientes, utilice la siguiente consulta:

SELECT c.id, c.nombre, c.apellido, s.fecha AS fecha_de_venta, 
 b.nombre AS libro, b.genero
FROM clientes c
LEFT JOIN ventas s
ON c.id = s.id_del_cliente
LEFT JOIN libros b
ON s.id_del_libro = b.id;

Este es el resultado de la consulta, en la que los datos de los clientes se combinan con los datos de los libros comprados recientemente (si los hay).

idnombreapellidofecha_de_ventalibrogenero
1DanielBlack[NULL][NULL][NULL]
2ErikBrown2019-10-01The Lord of the Ringsfantasy
3DianaTrump2019-09-02Lolitanovel
4AnnaYao2019-10-01[NULL][NULL]
5ChristianSanders[NULL][NULL][NULL]

Tenemos dos clientes (1 y 5) que no han comprado nada y, por tanto, no tienen registros en la tabla ventas. Sin embargo, estas filas se muestran mediante una operación LEFT JOIN. Además, la tabla incluye la fila del cliente 4, que ha comprado recientemente un libro que no está en nuestra base de datos y que, por tanto, no está en la tabla libros. El resultado de la consulta incluye este registro gracias a la LEFT JOIN.

Como puede ver, la LEFT JOIN de SQL se puede utilizar con varias tablas. Sin embargo, tenga en cuenta los problemas que pueden surgir cuando se combinan más de dos tablas, para asegurarse de que obtiene los resultados esperados.

Cosas a tener en cuenta cuando se usan varias LEFT JOIN

Combinar varias tablas en SQL puede ser complicado. Aquí, detallo algunas cosas que hay que tener en cuenta cuando se usan LEFT JOIN, especialmente, en varias tablas.

Al contrario que con las INNER JOIN, en las LEFT JOIN el orden de las tablas juega un papel importante, y los resultados pueden ser completamente diferentes si se cambia su orden en las consultas SQL. Cuando se determina el orden de las tablas en una LEFT JOIN, la regla general es comenzar con la tabla de la que se desea mostrar todos los registros en el resultado final.

Además, tenga en cuenta que la LEFT JOIN afecta a todas las combinaciones de la consulta. Si utiliza una LEFT JOIN, normalmente, las tablas subsiguientes también deberían usarla. Las INNER JOIN eliminan los registros que no se encuentren en ambos lados de la combinación, por lo que, le podrían hacer perder todos los registros que quiere conservar. Esa es la primera razón por la que se utilizan LEFT JOIN en lugar de las típicas INNER JOIN.

Además, hay que utilizar LEFT JOIN para la tercera tabla cuando la primera tiene registros que no se encuentran en la segunda (¡lo que suele ocurrir en las LEFT JOIN!) y cuando se utiliza un campo común diferente para combinar las tablas segunda y tercera. Si se utiliza INNER JOIN en esta situación, se eliminarán todos los registros de la primera tabla que no coincidan con las tablas segunda y tercera.

Este es el caso de nuestro ejemplo anterior, en el que hemos combinado las tablas clientes, ventas y libros. Veamos qué ocurre si utilizamos INNER JOIN en lugar de LEFT JOIN para añadir los datos de la tabla libros:

SELECT c.id, c.nombre, c.apellido, s.fecha AS fecha_de_venta, 
 b.nombre AS libro, b.genero
FROM clientes c
LEFT JOIN ventas s
ON c.id = s.id_del_cliente
INNER JOIN libros b
ON s.id_del_libro = b.id;
idnombreapellidofecha_de_ventalibrogenero
2ErikBrown2019-10-01The Lord of the Ringsfantasy
3DianaTrump2019-09-02Lolitanovel

Como puede ver, ahora obtenemos solo dos registros, en lugar de cinco. Cuando combinamos las tablas con INNER JOIN, perdemos el registro que correspondía a la compra del libro que no estaba en la tabla libros. También perdemos la información de los dos clientes que no realizaron compras recientemente, y que son los registros que debíamos conservar con la combinación izquierda con la tabla ventas. Esto se debe a que hemos creado la combinación de la tercera tabla con un campo que tiene común con la segunda, y el valor de esta columna es NULL para todas las filas de la primera tabla que no se encuentran en la segunda. Por eso, estos registros no coinciden con los de la tercera tabla y, en consecuencia, la INNER JOIN de la última parte de nuestra consulta los elimina.

¡Es hora de practicar con varias LEFT JOIN!

Ha aprendido mucho sobre las operaciones LEFT JOIN. Ahora, incluso, conoce los matices de usarlas en varias tablas de una consulta SQL. Para practicar sus habilidades recién adquiridas, consulte lo siguiente:

  • Nuestro curso Tipos de JOIN en SQL proporciona ejercicios prácticos completos para diferentes tipos de combinaciones, como LEFT JOIN, INNER JOIN, autocombinaciones, combinaciones non-equi (no equivalentes) y, por supuesto, combinaciones de varias tablas en una consulta.
  • Nuestro programa de enseñanza Ejercicio de SQL brinda varios cursos prácticos interactivos de SQL con los que practicar diferentes construcciones de SQL, como JOIN, GROUP BY, de agregado, etc.

Gracias por leerme, y ¡feliz aprendizaje!