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

9 Ejemplos Prácticos de SQL LEFT JOIN

LEFT JOIN es uno de los métodos más comunes de SQL. JOINs. Asegúrese de que conoce todos sus entresijos repasando los nueve ejemplos reales. LEFT JOIN ejemplos reales.

LEFT JOIN - junto a INNER JOIN - es una de las herramientas esenciales de SQL que necesita para trabajar con datos de dos o más tablas. Pero, ¿cómo y cuándo utilizarla? Estos nueve ejemplos de LEFT JOIN le indicarán el camino.

¿Es la primera vez que oyes hablar de JOIN? Si es así, te ofrecemos nuestro completo curso Tipos de JOIN en SQL . Podrá aprender desde cero todos los tipos de SQL JOIN, las diferentes formas de unir dos o más tablas y cuándo utilizar cada tipo de JOIN. Incluso aprenderá cómo autounir una tabla y cómo utilizar uniones no equitativas. Al final del curso, habrá resuelto 99 desafíos interactivos.

El SQL LEFT JOIN Básico

LEFT JOIN es uno de los varios tipos de SQL JOINs. El propósito de JOINs es obtener los datos de dos o más tablas. LEFT JOIN logra ese objetivo devolviendo todos los datos de la primera tabla (izquierda) y sólo las filas coincidentes de la segunda tabla (derecha). Los valores no coincidentes de la tabla derecha se mostrarán como NULL.

¿En qué se diferencia de otras JOIN? Aquí tiene un breve resumen, pero para entenderlo mejor, eche un vistazo a estos ejemplos de SQL JOIN.

  • (INNER) JOIN - Devuelve sólo las filas coincidentes de las tablas unidas. Aquí hay un artículo para aprender más sobre INNER JOIN.
  • RIGHT (OUTER) JOIN - Devuelve todos los datos de la tabla derecha y sólo las filas coincidentes de la tabla izquierda. Los valores de las filas no coincidentes serán NULL.
  • FULL (OUTER) JOIN - Devuelve todas las filas de ambas tablas unidas. Si hay filas no coincidentes entre las tablas, se muestran como NULL. Puede obtener más información en nuestro artículo dedicado a FULL JOIN.
  • CROSS JOIN - Devuelve todas las combinaciones de todas las filas de las tablas unidas, es decir, un producto cartesiano. Encontrará más información en este artículo sobre CROSS JOIN.

Las palabras entre paréntesis en los nombres anteriores de JOIN no son obligatorias; SQL acepta tanto la versión completa como la abreviada.

Esto significa que LEFT JOIN es lo mismo que LEFT OUTER JOIN. Así que, sí, LEFT JOIN es un tipo externo de unión, junto con RIGHT JOIN y FULL JOIN.

Como usuarios de SQL, normalmente escribimos sólo LEFT JOIN. ¿Por qué? Es más corto y nos da pereza.

Puedes aprender más en el artículo que explica cómo funciona LEFT JOIN.

Sintaxis SQL LEFT JOIN

La sintaxis de LEFT JOIN es la siguiente.

SELECT …
FROM table1
LEFT JOIN table2
ON table1.column = table2.column;

Los dos puntos clave son la palabra clave LEFT JOIN y la cláusula de unión ON. La primera tabla unida es referenciada en la cláusula FROM, luego se agrega LEFT JOIN, seguida por la segunda tabla que desea unir.

Las tablas se unen según los valores de columna coincidentes; se hace referencia a estas columnas en la cláusula ON y se pone un signo igual entre ellas. Esto unirá las tablas donde la columna de una tabla es igual a la columna de la segunda tabla. Este es el tipo más común de LEFT JOIN. Se llama equi-join por el signo igual. Se pueden utilizar otros operadores de comparación; estos son los non-equi joins y están fuera del alcance de este artículo.

Todo esto también se explica en nuestra hoja de trucos SQL JOIN. Manténgala cerca durante los siguientes ejemplos; le ayudará a entenderlos mejor.

Ejemplos de LEFT JOIN

Permítame mostrarle ahora varios ejemplos reales del uso de LEFT JOIN. Comenzaré con un ejemplo básico y directo para mostrarle cómo funciona LEFT JOIN con datos reales.

Ejemplo 1: LEFT JOIN básico

Trabajaré con dos tablas. La primera es companyque almacena una lista de empresas de electrónica. Utilice este script para crear la tabla.

idcompany_name
1Lenovo
2Apple
3Samsung
4Huawei
5Fairphone

La segunda tabla es product tabla. El script para crear la tabla está aquí.

idproduct_namecompany_id
1Fairphone 45
2Galaxy S24 Ultra3
3Galaxy Z Flip53
4iPhone 15 Pro2
5Fairbuds XL5
6MacBook Pro 16' M3 Pro2
7iPad Air 10.9' M12
8Galaxy Tab S9 FE+3

Vamos a LEFT JOIN estas dos tablas y ver qué pasa:

SELECT company_name,
	 product_name
FROM company
LEFT JOIN product
ON company.id = product.company_id
ORDER BY company_name;

Selecciono la empresa y el nombre del producto. Estas son las columnas de dos tablas. Por lo tanto, necesito unir las tablas para obtener esas columnas en la salida.

La tabla de la izquierda es companyy hago referencia a ella en FROM. Luego añado LEFT JOIN y la segunda tabla, que es product.

En la cláusula ON, especifico las columnas en las que se unirán las tablas. En este caso, es la columna id de la primera y la columna company_id de la segunda tabla.

He utilizado ORDER BY para que la salida sea más legible. (No necesitas ORDER BY para que la unión funcione).

Hablando de la salida, aquí está.

company_nameproduct_name
AppleiPhone 15 Pro
AppleiPad Air 10.9' M1
AppleMacBook Pro 16' M3 Pro
FairphoneFairphone 4
FairphoneFairbuds XL
HuaweiNULL
LenovoNULL
SamsungGalaxy Z Flip5
SamsungGalaxy S24 Ultra
SamsungGalaxy Tab S9 FE+

La salida muestra una lista de todas las empresas, que está en línea con el LEFT JOIN mostrando todos los datos de la tabla de la izquierda.

Cuando una empresa tiene varios productos, se enumeran todos los productos y se duplica el nombre de la empresa. Cuando no hay productos de la empresa (Huawei y Lenovo), el valor de la columna product_name es NULL.

Ejemplo 2: Un ejemplo real de LEFT JOIN

Exploremos un escenario común. En este ejemplo, desea listar todos los departamentos y sus empleados pero también mostrar los departamentos sin empleados, si los hay.

Para lograrlo, necesita LEFT JOIN.

Aquí está la tabla department y su script. Es una lista de departamentos.

iddepartment_name
1Sales
2Accounting
3IT
4HR
5Operations

La segunda tabla es employee, que es una lista de empleados. Este es su script.

idfirst_namelast_namedepartment_id
1BobEstevez3
2FrancescaGotze2
3FrankGordon2
4MilicentJohnson3
5HansHandkeNULL
6KatieKeaton1
7LucaDi FrancescoNULL
8ZoeJong1
9PatrickRose2
10BillieThompsonNULL

Los valores NULL significan que a este empleado aún no se le ha asignado un departamento.

Para mostrar los departamentos y sus empleados - así como los departamentos sin empleados - este es el código:

SELECT department.id AS department_id,
	 department_name,
	 employee.id AS employee_id,
       first_name,
       last_name	   
FROM department
LEFT JOIN employee
ON department.id = employee.department_id
ORDER BY department_id, employee_id;

Selecciono el ID de la tabla department y lo renombro como department_id. La segunda columna seleccionada de la misma tabla es department_name. Los datos seleccionados de la tabla employee es id (renombrada como employee_id) y los nombres de los empleados. Todo este cambio de nombre de las columnas es sólo para que la salida sea más fácil de leer.

Ahora, puedo hacer referencia a la tabla department en FROM y LEFT JOIN con la tabla employee. Las tablas se unen cuando los ID de departamento son iguales.

Finalmente, ordeno la salida por el departamento y luego por el ID del empleado para hacerla más legible. Este es el resultado:

department_iddepartment_nameemployee_idfirst_namelast_name
1Sales6KatieKeaton
1Sales8ZoeJong
2Accounting2FrancescaGotze
2Accounting3FrankGordon
2Accounting9PatrickRose
3IT1BobEstevez
3IT4MilicentJohnson
4HRNULLNULLNULL
5OperationsNULLNULLNULL

La salida muestra todos los departamentos y sus empleados. También muestra dos departamentos que no tienen empleados: RRHH y Operaciones. Puede ser que la base de datos no se haya actualizado todavía y los nuevos empleados no estén asignados al departamento.

Ejemplo 3: Otro ejemplo real de LEFT JOIN

Otro ejemplo típico de LEFT JOIN es cuando desea encontrar todos los clientes y sus pedidos - pero también desea incluir a los clientes que aún no han realizado ningún pedido.

Para este ejemplo, utilizaré el siguiente conjunto de datos. La primera tabla es customerque es una simple lista de clientes. Este es el script.

idfirst_namelast_name
1FlorentinusGlöckner
2EmanAdcock
3ErikNyman
4LeebaKubo
5LiasVámos
6LavanyaNikolaev
7RishiPetit
8ChristieFodor
9AndrisLončar
10JulianaHarlan

La segunda tabla del conjunto de datos es orders. Puedes crearla tú mismo utilizando este script.

Así es como escribo el código para conseguir el resultado deseado:

SELECT customer.first_name, 
       customer.last_name,
	 orders.id AS order_id,
	 orders.order_date
FROM customer
LEFT JOIN orders
ON customer.id = orders.customer_id;

Selecciono los nombres de los clientes de la tabla customer. Lógicamente, la información sobre los pedidos procede de la tabla orders.

La tabla de la izquierda es customery quiero todas sus filas. La LEFT JOIN con la tabla orders sobre el ID del cliente.

El resultado es el siguiente:

first_namelast_nameorder_idorder_date
LiasVámos12024-01-01
EmanAdcock22024-01-08
ChristieFodor32024-01-08
AndrisLončar42024-01-12
LiasVámos52024-01-18
LavanyaNikolaev62024-01-22
JulianaHarlanNULLNULL
LeebaKuboNULLNULL
FlorentinusGlöcknerNULLNULL
ErikNymanNULLNULL
RishiPetitNULLNULL

Puedes ver que muestra todos los clientes y sus pedidos. Donde el cliente no tiene ningún pedido, hay NULLs.

Para más práctica, eche un vistazo a este artículo que muestra cuatro ejemplos más de LEFT JOIN.

Ejemplo 4: LEFT JOIN con 3 Tablas

Este es un ejemplo de LEFT JOIN donde le mostraré como unir tres tablas.

Primero veamos el conjunto de datos.

La primera tabla es writercon el script aquí. Es simplemente una lista de escritores.

idfirst_namelast_name
1BernardineEvaristo
2AlbertCamus
3GeorgeOrwell
4ÉmileZola
5MilanKundera
6CharlesDickens
7BohumilHrabal
8WitoldGombrowicz

La segunda tabla es traductor. Es una lista de traductores de libros. El script para crear la tabla está aquí.

idfirst_namelast_name
1JenniferCroft
2PeterConstantine
3EwaldOsers

La última tabla es libro, que muestra información sobre los libros en particular. Aquí está el script.

idbook_titlepublication_yearwriter_idtranslator_id
1The Plague200823
2Cosmos201581
3Manifesto: On Never Giving Up20211NULL
4Girl, Woman, Other20191NULL
5The Stranger202223
6Germinal201243
7198420203NULL

Si el valor de la columna translator_id es NULL, este libro no es una traducción.

En este ejemplo, quiero mostrar todos los escritores, sin importar si tienen un libro o no. También quiero mostrar la información sobre el traductor del libro.

Este es el aspecto que debería tener el código:

SELECT writer.first_name AS writer_first_name,
	 writer.last_name AS writer_last_name,
	 book_title,
	 translator.first_name AS translator_first_name,
	 translator.last_name AS translator_last_name
FROM writer
LEFT JOIN book
ON writer.id = book.writer_id
LEFT JOIN translator
ON book.translator_id = translator.id;

Selecciono los nombres de los escritores, los títulos de sus libros y los nombres de los traductores. Para obtener todos estos datos, tengo que unir las tres tablas.

La unión de tres (o más) tablas se realiza en forma de cadena. Después de unir las dos primeras tablas, se añade otra unión, se hace referencia a la tercera tabla y se indica la condición de unión en la segunda cláusula ON.

En primer lugar, hago referencia a la tabla writery LEFT JOIN con la tabla book en el escritor ID.

A continuación, añado la segunda cláusula LEFT JOIN. La utilizo para unir la segunda tabla (book) con la tabla translator del identificador del traductor.

¿Por qué estos LEFT JOINson el resultado de la relación entre las tablas? El primer LEFT JOIN está ahí porque puede haber escritores sin libro. Sin embargo, esto también es cierto para la relación entre las tablas book y translatorun libro puede ser o no una traducción, por lo que puede tener o no un traductor correspondiente. Por lo tanto, también es necesario utilizar LEFT JOIN entre ellos, ya que se desea mostrar los libros sean o no traducciones.

Aquí está la salida del código:

writer_first_namewriter_last_namebook_titletranslator_first_nametranslator_last_name
AlbertCamusThe PlagueEwaldOsers
WitoldGombrowiczCosmosJenniferCroft
BernardineEvaristoManifesto: On Never Giving UpNULLNULL
BernardineEvaristoGirl, Woman, OtherNULLNULL
AlbertCamusThe StrangerEwaldOsers
ÉmileZolaGerminalEwaldOsers
GeorgeOrwell1984NULLNULL
MilanKunderaNULLNULLNULL
CharlesDickensNULLNULLNULL
BohumilHrabalNULLNULLNULL

Como puede ver, los libros de Bernardine Evaristo se muestran a pesar de no ser traducciones. Esto se debe a que he utilizado LEFT JOIN como segunda unión.

También aparecen Milan Kundera, Charles Dickens y Bohumil Hrabal a pesar de no tener ningún libro y, por tanto, ningún traductor.

Ejemplo 5: LEFT JOIN "forzado" con tres tablas

Normalmente, la elección de LEFT JOIN viene dada por la naturaleza de las relaciones entre las tablas. Sin embargo, a veces nos vemos "obligados" a utilizar LEFT JOIN. Pronto verá a qué me refiero.

La primera tabla del conjunto de datos es una lista de directores denominada director. Aquí está el script.

idfirst_namelast_name
1StanleyKubrick
2CélineSciamma
3WoodyAllen
4LynneRamsay
5KrzysztofKieślowski

La siguiente tabla es streaming_platformque es una lista de las plataformas de streaming disponibles. Puede crear la tabla utilizando este script.

idplatform_name
1Netflix
2HBO
3Hulu
4Mubi
5Apple TV

La tercera tabla es streaming_catalogue. Contiene información sobre las películas y está relacionada con las dos primeras tablas a través de director_id y streaming_platform_id. Este es el script para crear la tabla.

idmovie_titlerelease_yeardirector_idstreaming_platform_idstarted_showingended_showing
1Three Colours: Blue1993542023-02-282023-09-30
2Three Colours: White1994542023-02-282023-09-30
3Three Colours: Red1994542023-02-282023-09-30
4Manhattan Murder Mystery1993312023-08-15NULL
5Portrait of a Lady on Fire2019212023-01-012023-09-28
6Three Colours: Blue1993522024-01-15NULL
7Three Colours: White1994522024-01-15NULL
8Three Colours: Red1994522024-01-15NULL
9Tomboy2011212020-04-012021-04-01
10Vicky Cristina Barcelona2008312023-10-01NULL

Los valores NULL en la columna ended_showing significan que la película se sigue proyectando en la plataforma.

Quiero mostrar todos los directores, sus películas y las plataformas de streaming que están mostrando (o han mostrado) sus películas. También quiero mostrar los directores que no tienen ninguna película en streaming.

La relación entre las tablas es que cada película tiene que tener un director, pero no viceversa. Además, cada película en el catálogo tiene que tener una plataforma de streaming, pero no todas las plataformas de streaming tienen que estar en el catálogo.

Empiezo a escribir el código seleccionando los nombres de los directores, los títulos de las películas, los nombres de las plataformas y las fechas de inicio y fin de las proyecciones.

De los ejemplos anteriores, sabes que se espera unir la tabla director con la tabla streaming_catalogue en la columna ID del director. Esto es lo que hago para asegurarme de mostrar también los directores que no tienen ninguna película en el catálogo.

Ahora, añado el segundo LEFT JOIN para unir la tabla streaming_catalogue con la tabla streaming_platform en el ID de la plataforma.

SELECT first_name AS director_first_name,
	 last_name AS director_last_name,
	 movie_title,
	 platform_name,
	 started_showing, 
	 ended_showing
FROM director
LEFT JOIN streaming_catalogue
ON director.id = streaming_catalogue.director_id
LEFT JOIN streaming_platform
ON streaming_catalogue.streaming_platform_id = streaming_platform.id;

La consulta devuelve este resultado:

director_first_namedirector_last_namemovie_titleplatform_namestarted_showingended_showing
KrzysztofKieślowskiThree Colours: BlueMubi2023-02-282023-09-30
KrzysztofKieślowskiThree Colours: WhiteMubi2023-02-282023-09-30
KrzysztofKieślowskiThree Colours: RedMubi2023-02-282023-09-30
WoodyAllenManhattan Murder MysteryNetflix2023-08-15NULL
CélineSciammaPortrait of a Lady on FireNetflix2023-01-012023-09-28
KrzysztofKieślowskiThree Colours: BlueHBO2024-01-15NULL
KrzysztofKieślowskiThree Colours: WhiteHBO2024-01-15NULL
KrzysztofKieślowskiThree Colours: RedHBO2024-01-15NULL
CélineSciammaTomboyNetflix2020-04-012021-04-01
WoodyAllenVicky Cristina BarcelonaNetflix2023-10-01NULL
LynneRamsayNULLNULLNULLNULL
StanleyKubrickNULLNULLNULLNULL

La salida muestra todos los directores, sus películas y las plataformas en las que están o estaban en cartelera.

Las películas con todos los datos excepto un NULL en las columnas ended_showing aún pueden verse en una plataforma concreta.

A pesar de no haber películas en el catálogo, Lynne Ramsay y Stanley Kubrick también aparecen en la lista. Esto se reconoce por tener sus nombres pero ningún otro dato.

Pude conseguirlos porque utilicé dos LEFT JOINs. El primero LEFT JOIN no es cuestionable; tuve que utilizarlo por si había directores sin películas. Resulta que los hay.

Pero ¿y el segundo LEFT JOIN? En cierto modo me vi obligado a utilizarlo para retener a todos esos directores sin películas y obtener el resultado deseado. ¿Por qué "obligado"? Bueno, utilicemos INNER JOIN en lugar del segundo LEFT JOIN, y ya verás.

SELECT first_name AS director_first_name,
	 last_name AS director_last_name,
	 movie_title,
	 platform_name,
	 started_showing, 
	 ended_showing
FROM director
LEFT JOIN streaming_catalogue
ON director.id = streaming_catalogue.director_id
JOIN streaming_platform
ON streaming_catalogue.streaming_platform_id = streaming_platform.id;

Ahora faltan Lynne Ramsay y Stanley Kubrick.

director_first_namedirector_last_namemovie_titleplatform_namestarted_showingended_showing
KrzysztofKieślowskiThree Colours: BlueMubi2023-02-282023-09-30
KrzysztofKieślowskiThree Colours: WhiteMubi2023-02-282023-09-30
KrzysztofKieślowskiThree Colours: RedMubi2023-02-282023-09-30
WoodyAllenManhattan Murder MysteryNetflix2023-08-15NULL
CélineSciammaPortrait of a Lady on FireNetflix2023-01-012023-09-28
KrzysztofKieślowskiThree Colours: BlueHBO2024-01-15NULL
KrzysztofKieślowskiThree Colours: WhiteHBO2024-01-15NULL
KrzysztofKieślowskiThree Colours: RedHBO2024-01-15NULL
CélineSciammaTomboyNetflix2020-04-012021-04-01
WoodyAllenVicky Cristina BarcelonaNetflix2023-10-01NULL

¿Por qué? Porque INNER JOIN sólo devuelve las filas coincidentes de las tablas unidas. Por lo tanto, pude obtener los directores sin películas con el primer LEFT JOIN. Bien hecho.

Pero entonces utilicé INNER JOIN ¡y lo estropeé todo! INNER JOIN anula el primer LEFT JOIN, ya que sólo mostrará las filas coincidentes entre streaming_catalogue y streaming_platform.

Como Lynne Ramsay y Stanley Kubrick no tienen películas en la tabla streaming_cataloguesus películas inexistentes no se pueden emparejar en la tabla streaming_platform y no aparecen en el resultado final.

Aquí hay un artículo que proporciona más consejos y ejemplos para LEFT JOINing múltiples tablas.

Ejemplo 6: LEFT JOIN con WHERE

Continuemos con los ejemplos de SQL LEFT JOIN utilizando los mismos datos que en el anterior.

Este ejemplo le mostrará como LEFT JOIN puede ser usado con la cláusula WHERE.

El código siguiente hace exactamente eso para encontrar los directores, sus películas y las fechas de inicio y fin de las proyecciones. Sin embargo, no muestra todas las películas, sino sólo aquellas cuya proyección finalizó antes del 1 de octubre de 2023.

SELECT first_name,
	 last_name,
	 movie_title, 
	 started_showing, 
	 ended_showing
FROM director
LEFT JOIN streaming_catalogue
ON director.id = streaming_catalogue.director_id
WHERE ended_showing < '2023_10_01';

Después de seleccionar las columnas necesarias, LEFT JOIN la tabla director con la tabla streaming_ catálogo. Las tablas están unidas por el ID del director.

Utilizo la cláusula WHERE para obtener sólo las películas que finalizaron su proyección antes del 1 de octubre de 2023. En WHERE comparo la columna ended_showing con la fecha límite requerida utilizando el operador de comparación "menor que" (<).

El resultado es el siguiente. Ninguna película terminó su proyección después del 1 de octubre de 2023.

first_namelast_namemovie_titlestarted_showingended_showing
KrzysztofKieślowskiThree Colours: Blue2023-02-282023-09-30
KrzysztofKieślowskiThree Colours: White2023-02-282023-09-30
KrzysztofKieślowskiThree Colours: Red2023-02-282023-09-30
CélineSciammaPortrait of a Lady on Fire2023-01-012023-09-28
CélineSciammaTomboy2020-04-012021-04-01

Ejemplo 7: WHERE vs. ON en LEFT JOIN

Ahora le mostraré cómo se puede anular el efecto de LEFT JOIN si se utiliza WHERE en la tabla de la derecha. Y, por supuesto, le mostraré un remedio para ello.

Vuelvo a utilizar el mismo conjunto de datos que en el ejemplo anterior. Digamos que quiero consultarlo y recuperar todos los directores, tengan o no una película en la base de datos. Para los directores que tienen una película, quiero mostrar sólo las películas estrenadas en 1993.

Podría intentar conseguirlo escribiendo esta consulta:

SELECT DISTINCT first_name,
	   	    last_name,
	   	    movie_title, 
	   	    release_year
FROM director
LEFT JOIN streaming_catalogue
ON director.id = streaming_catalogue.director_id
WHERE release_year = 1993;

Primero, selecciono las columnas necesarias. Utilizo SELECT DISTINCT para evitar la duplicación de filas, ya que hay algunas películas que aparecen más de una vez en la tabla streaming_catalogue.

A continuación, LEFT JOIN la tabla director con streaming_catalogue en el ID del director.

El último paso sería utilizar la cláusula WHERE y recuperar sólo las películas estrenadas en 1993.

Veamos el resultado:

first_namelast_namemovie_titlerelease_year
KrzysztofKieślowskiThree Colours: Blue1993
WoodyAllenManhattan Murder Mystery1993

No, ¡esto no está bien! Obtuve sólo dos directores en lugar de cinco. Recuerda que quería una lista con todos los directores. ¿Por qué ocurrió esto, a pesar de que utilicé LEFT JOIN?

La razón es que cuando el filtro de WHERE se aplica a los datos de la tabla de la derecha, anula el efecto de LEFT JOIN. Recuerde, si el director no tiene ninguna película en la tabla, entonces los valores de la columna release_year serán NULL. Es el resultado de LEFT JOIN. Y el filtro en WHERE excluirá NULLs, también, de la salida.

Entonces, ¿cómo puede listar todos los directores y utilizar el filtro en el año de publicación al mismo tiempo? La respuesta es que debe mover la condición de filtrado de WHERE a ON, así.

SELECT DISTINCT first_name,
	          last_name,
	          movie_title, 
	          release_year
FROM director
LEFT JOIN streaming_catalogue
ON director.id = streaming_catalogue.director_id AND release_year = 1993;

La condición del año de publicación se convierte ahora en la segunda condición de unión de la cláusula ON. La segunda (tercera, cuarta...) condición se añade utilizando la palabra clave AND.

Mire, ahora la salida es correcta:

first_namelast_namemovie_titlerelease_year
StanleyKubrickNULLNULL
LynneRamsayNULLNULL
CélineSciammaNULLNULL
KrzysztofKieślowskiThree Colours: Blue1993
WoodyAllenManhattan Murder Mystery1993

Puede obtener más información en este artículo dedicado a la diferencia entre WHERE y ON en Tipos de JOIN en SQL.

Ejemplo 8: LEFT JOIN con Alias

En todos los ejemplos anteriores, el uso de alias con las tablas en LEFT JOIN no era necesario. Podría haberle ayudado a acortar los nombres de las tablas y escribir el código un poco más rápido. Útil, sí, pero no obligatorio.

Sin embargo, los alias pasan a ser obligatorios cuando se LEFT JOINING la tabla consigo misma, es decir, cuando se autounen las tablas.

Veamos cómo funciona esto en un ejemplo en el que quiero recuperar los nombres de todos los empleados y los nombres de sus jefes. Quiero que esta lista contenga los empleados que no tienen un superior.

Demostraré esto en la tabla llamada employees_managers. Este es el script:

idfirst_namelast_namemanager_id
1LindKaiser2
2IanMcKune8
3DeckTrustrieNULL
4RupertaNind1
5GarrotCharsleyNULL
6AtheneFedoronko8
7PriscillaCrocombeNULL
8StafaniSidebottom8
9MarveTrustie1
10AntonyMarple2

Esta es una lista de los empleados. La columna manager_id contiene el ID del empleado que es el gerente del empleado en particular. Algunos empleados no tienen jefes, por lo que el valor es NULL.

Para completar la tarea requerida, necesito escribir esta consulta:

SELECT e.first_name AS employee_first_name, 
	 e.last_name AS employee_last_name, 
	 m.first_name AS manager_first_name,
	 m.last_name AS manager_last_name
FROM employees_managers e
LEFT JOIN employees_managers m
ON e.manager_id = m.id;

Hago referencia a la tabla en la cláusula FROM y le doy el alias e. Esta tabla servirá como datos de los empleados.

A continuación, hago referencia a la misma tabla en LEFT JOIN y le doy el alias m. Se utilizará para los datos de los directivos.

De esta forma, he podido unir la tabla consigo misma. No es diferente de unir dos tablas diferentes. Al autounirse, una tabla actúa como dos tablas. Sólo hay que darles alias para que SQL sepa a qué tabla se refiere.

La tabla está auto-unida donde el ID del manager de la tabla 'empleado' es igual al ID del empleado de la tabla 'manager'. De esta forma, obtendré todos los empleados y sus gerentes.

Ahora que ya tengo las tablas, sólo tengo que seleccionar las columnas necesarias. Una vez más, para hacer una distinción, utilizo distintos alias de tabla para obtener los nombres de los empleados y los directivos.

Este es el resultado:

employee_first_nameemployee_last_namemanager_first_namemanager_last_name
LindKaiserIanMcKune
IanMcKuneStafaniSidebottom
DeckTrustrieNULLNULL
RupertaNindLindKaiser
GarrotCharsleyNULLNULL
AtheneFedoronkoStafaniSidebottom
PriscillaCrocombeNULLNULL
StafaniSidebottomStafaniSidebottom
MarveTrustieLindKaiser
AntonyMarpleIanMcKune

Como se puede ver, se trata de una lista completa de los empleados y sus gerentes. Deck Trustrie, Garrot Charsley y Priscilla Crocombe no tienen jefes. Están en la parte superior de la estructura jerárquica de la empresa.

Ejemplo 9: LEFT JOIN con GROUP BY

Volvamos ahora al Ejemplo 2, en el que trabajamos con una lista de departamentos y empleados.

Un ejemplo sencillo de LEFT JOIN con GROUP BY sería listar todos los departamentos y contar el número de empleados en cada uno:

SELECT department_name,
	 COUNT(employee.id) AS number_of_employees
FROM department
LEFT JOIN employee
ON department.id = employee.department_id
GROUP BY department_name;

Selecciono el departamento y utilizo la función de agregado COUNT() en la columna ID de empleado para encontrar el número de empleados.

Los datos proceden de dos tablas. Necesito LEFT JOIN la tabla department con la tabla employee ya que también quiero departamentos sin empleados. Las tablas están unidas por el ID del departamento.

Como he utilizado una función agregada, también necesito agrupar los datos. Para ello utilizo la cláusula GROUP BY. La agrupación de la salida por el nombre del departamento mostrará el número de empleados por cada departamento.

Eche un vistazo. Genial, ¿verdad?

department_namenumber_of_employees
Accounting3
Operations0
Sales2
IT2
HR0

Ahora, intentemos otro ejemplo y utilicemos COUNT(*) en lugar de aplicar COUNT() a una columna en particular.

Esta vez, estoy utilizando los datos sobre las empresas y sus productos del Ejemplo 1. En este ejemplo, quiero recuperar todas las empresas y mostrar el número de productos que tienen.

Veamos qué ocurre si utilizo COUNT(*):

SELECT company_name,
	 COUNT(*) AS number_of_products
FROM company
LEFT JOIN product
ON company.id = product.company_id
GROUP BY company_name;

Las tablas empresa y producto se LEFT JOINed en el ID de la empresa. Estoy usando COUNT(*) y GROUP BY para encontrar el número de productos por empresa.

Este es el resultado:

company_namenumber_of_products
Huawei1
Lenovo1
Samsung3
Apple3
Fairphone2

Sin embargo, puedo decirte que esta salida no es correcta: Huawei y Lenovo deberían haber tenido cero productos. ¿Por qué se ha producido este error?

¡El culpable es COUNT(*)! El asterisco en la función COUNT() significa que cuenta todas las filas, incluyendo NULLs. ¿Queda más claro ahora? Sí, así es: cuando las empresas sin productos se LEFT JOINed, tendrán productos NULL. Sin embargo, esto sigue siendo un valor, y COUNT(*) verá cada valor de NULL como un producto. En otras palabras, incluso las empresas sin productos se mostrarán como si tuvieran un producto.

Para solucionar esto, utilice COUNT(expression). En este caso, significa COUNT(product.id). El uso de COUNT() con un nombre de columna ignora NULLs:

SELECT company_name,
	 COUNT(product.id) AS number_of_products
FROM company
LEFT JOIN product
ON company.id = product.company_id
GROUP BY company_name;

La salida es ahora la esperada:

company_namenumber_of_products
Huawei0
Lenovo0
Samsung3
Apple3
Fairphone2

Puede profundizar más leyendo este artículo sobre diferentes variaciones de la función agregada COUNT().

Más Ejemplos y Recursos SQL LEFT JOIN

Puede ver en los ejemplos anteriores que LEFT JOIN tiene un amplio uso en el trabajo práctico con datos. Se puede utilizar para la recuperación de datos simples donde se necesitan todos los datos de una tabla y sólo los datos coincidentes de otra. Sin embargo, también se puede utilizar al unir varias tablas, con WHERE, en autouniones y con funciones agregadas y GROUP BY.

Las uniones SQL son vitales para trabajar con varias tablas, una tarea cotidiana incluso para los analistas de datos principiantes. Conocer los joins es absolutamente imprescindible si quieres considerarte fluido en SQL y mejorar en tu trabajo.

Esto también implica conocer LEFT JOIN, ya que es uno de los dos tipos de join más utilizados. Debido a sus características tan específicas, muchas tareas no se pueden hacer de otra forma que no sea aprovechando LEFT JOIN. Así que, si necesitas una guía en profundidad sobre estos temas, te invitamos a que eches un vistazo a nuestro curso Tipos de JOIN en SQL .

Además, es necesario practicar todos estos conceptos para que realmente se asimilen. Esto significa practicar tanto LEFT JOIN como otros tipos de JOIN para poder diferenciarlos. Puedes probar estas 12 preguntas de práctica de JOIN o algunas de las sugerencias sobre cómo practicar Tipos de JOIN en SQL. Si tienes una entrevista de trabajo de SQL próximamente, intenta responder a estas 10 preguntas de entrevista de SQL JOIN. ¡Feliz aprendizaje!