15th Mar 2024 Lectura de 21 minutos 9 Ejemplos Prácticos de SQL LEFT JOIN Tihomir Babic LEFT JOIN SQL Índice El SQL LEFT JOIN Básico Sintaxis SQL LEFT JOIN Ejemplos de LEFT JOIN Ejemplo 1: LEFT JOIN básico Ejemplo 2: Un ejemplo real de LEFT JOIN Ejemplo 3: Otro ejemplo real de LEFT JOIN Ejemplo 4: LEFT JOIN con 3 Tablas Ejemplo 5: LEFT JOIN "forzado" con tres tablas Ejemplo 6: LEFT JOIN con WHERE Ejemplo 7: WHERE vs. ON en LEFT JOIN Ejemplo 8: LEFT JOIN con Alias Ejemplo 9: LEFT JOIN con GROUP BY Más Ejemplos y Recursos 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! Tags: LEFT JOIN SQL