15th Mar 2024 20 minutos de leitura 9 exemplos práticos de LEFT JOIN em SQL Tihomir Babic left join sql Índice Noções básicas sobre o SQL LEFT JOIN Sintaxe SQL LEFT JOIN Exemplos de LEFT JOIN Exemplo 1: LEFT JOIN básico Exemplo 2: um exemplo real de LEFT JOIN Exemplo 3: outro exemplo real de LEFT JOIN Exemplo 4: LEFT JOIN com 3 tabelas Exemplo 5: LEFT JOIN "forçado" com três tabelas Exemplo 6: LEFT JOIN com WHERE Exemplo 7: WHERE vs. ON em LEFT JOIN Exemplo 8: LEFT JOIN com alias Exemplo 9: LEFT JOIN com GROUP BY Mais exemplos e recursos do SQL LEFT JOIN LEFT JOIN é um dos métodos de junção mais comuns do SQL. JOINs. Certifique-se de conhecer todas as suas vantagens e desvantagens analisando todos os nove exemplos da vida real. LEFT JOIN exemplos reais. LEFT JOIN - Ao lado de INNER JOIN - é uma das ferramentas SQL essenciais de que você precisa para trabalhar com dados de duas ou mais tabelas. Mas como e quando você deve usá-la? Estes nove exemplos do site LEFT JOIN lhe mostrarão o caminho. É a primeira vez que você ouve falar em JOINs? Se for o caso, nosso curso abrangente sobre Cláusulas JOIN em SQL o ajudará. Você aprenderá desde o início sobre todos os tipos de SQL JOIN, as diferentes maneiras de unir duas ou mais tabelas e quando usar cada tipo de JOIN. Você aprenderá até mesmo como se unir a uma tabela e como usar uniões não equivalentes. Ao final do curso, você terá resolvido 99 desafios interativos. Noções básicas sobre o SQL LEFT JOIN LEFT JOIN SQL JOINO objetivo do JOINé obter os dados de duas ou mais tabelas. O LEFT JOIN atinge esse objetivo retornando todos os dados da primeira tabela (esquerda) e somente as linhas correspondentes da segunda tabela (direita). Os valores não correspondentes da tabela da direita serão mostrados como NULL. Como isso difere de outros JOINs? Aqui está uma breve visão geral, mas para entender ainda melhor, dê uma olhada nestes exemplos de SQL JOIN. (INNER) JOIN - Retorna somente as linhas correspondentes das tabelas unidas. Aqui está um artigo para saber mais sobre INNER JOIN. RIGHT (OUTER) JOIN - Retorna todos os dados da tabela da direita e somente as linhas correspondentes da tabela da esquerda. Os valores das linhas não correspondentes serão NULL. FULL (OUTER) JOIN - Retorna todas as linhas de ambas as tabelas unidas. Se houver linhas não correspondentes entre as tabelas, elas serão mostradas como NULL. Você pode saber mais sobre isso em nosso artigo dedicado a FULL JOIN. CROSS JOIN - Retorna todas as combinações de todas as linhas das tabelas unidas, ou seja, um produto cartesiano. Mais informações estão disponíveis neste artigo sobre CROSS JOIN. As palavras entre colchetes nos nomes JOIN acima não são obrigatórias; o SQL aceita versões completas e curtas. Isso significa que LEFT JOIN é o mesmo que LEFT OUTER JOIN. Portanto, sim, LEFT JOIN é um tipo de junção externa, juntamente com RIGHT JOIN e FULL JOIN. Como usuários de SQL, geralmente escrevemos apenas LEFT JOIN. O motivo? É mais curto e somos preguiçosos. Você pode saber mais no artigo que explica como funciona o LEFT JOIN. Sintaxe SQL LEFT JOIN A sintaxe do LEFT JOIN é a seguinte. SELECT … FROM table1 LEFT JOIN table2 ON table1.column = table2.column; Os dois pontos principais são a palavra-chave LEFT JOIN e a cláusula de união ON. A primeira tabela unida é referenciada na cláusula FROM, depois a LEFT JOIN é adicionada, seguida pela segunda tabela que você deseja unir. As tabelas são unidas por valores de coluna correspondentes; você faz referência a essas colunas na cláusula ON e coloca um sinal de igual entre elas. Isso unirá as tabelas em que a coluna de uma tabela é igual à coluna da segunda tabela. Esse é o tipo mais comum de LEFT JOIN. É chamado de equi-join por causa do sinal de igual. Outros operadores de comparação podem ser usados; essas são as junções não equi e estão fora do escopo deste artigo. Tudo isso também é explicado em nossa Folha de consulta SQL JOIN. Mantenha-a por perto durante os exemplos a seguir; ela o ajudará a entendê-los melhor. Exemplos de LEFT JOIN Vou lhe mostrar agora vários exemplos reais de uso do LEFT JOIN. Começarei com um exemplo básico e direto para mostrar como o LEFT JOIN funciona com dados reais. Exemplo 1: LEFT JOIN básico Trabalharei com duas tabelas. A primeira é companyque armazena uma lista de empresas de eletrônicos. Use este script para criar a tabela. idcompany_name 1Lenovo 2Apple 3Samsung 4Huawei 5Fairphone A segunda tabela é a tabela product tabela. O script para criar a tabela está aqui. 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 acessar LEFT JOIN essas duas tabelas e ver o que acontece: SELECT company_name, product_name FROM company LEFT JOIN product ON company.id = product.company_id ORDER BY company_name; Seleciono o nome da empresa e do produto. Essas são as colunas de duas tabelas. Portanto, preciso unir as tabelas para obter essas colunas na saída. A tabela da esquerda é companye faço referência a ela em FROM. Em seguida, adiciono LEFT JOIN e a segunda tabela, que é product. Na cláusula ON, especifico as colunas nas quais as tabelas serão unidas. Nesse caso, é a coluna id da primeira e a coluna company_id da segunda tabela. Usei ORDER BY para tornar a saída mais legível. (Você não precisa de ORDER BY para que a união funcione). Falando em saída, aqui está ela. 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+ O resultado mostra uma lista de todas as empresas, o que está de acordo com o LEFT JOIN que mostra todos os dados da tabela da esquerda. Quando uma empresa tem vários produtos, todos esses produtos são listados e o nome da empresa é duplicado. Quando não há produtos da empresa (Huawei e Lenovo), o valor da coluna product_name é NULL. Exemplo 2: um exemplo real de LEFT JOIN Vamos explorar um cenário comum. Neste exemplo, você deseja listar todos os departamentos e seus funcionários, mas também mostrar os departamentos sem funcionários, caso existam. Para isso, você precisa de LEFT JOIN. Aqui está a tabela department e seu script. É uma lista de departamentos. iddepartment_name 1Sales 2Accounting 3IT 4HR 5Operations A segunda tabela é employee, que é uma lista de funcionários. Aqui está o script. idfirst_namelast_namedepartment_id 1BobEstevez3 2FrancescaGotze2 3FrankGordon2 4MilicentJohnson3 5HansHandkeNULL 6KatieKeaton1 7LucaDi FrancescoNULL 8ZoeJong1 9PatrickRose2 10BillieThompsonNULL Os valores NULL aqui significam que esse funcionário ainda não foi atribuído a um departamento. Para mostrar os departamentos e seus funcionários, bem como os departamentos sem funcionários, este é o 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; Seleciono o ID da tabela department e o renomeio como department_id. A segunda coluna selecionada da mesma tabela é department_name. Os dados selecionados da tabela employee Os dados selecionados da tabela são id (renomeado como employee_id) e os nomes dos funcionários. Toda essa renomeação das colunas é apenas para facilitar a leitura do resultado. Agora, posso fazer referência à tabela department em FROM e LEFT JOIN com a tabela employee. As tabelas são unidas quando os IDs de departamento são iguais. Por fim, classifico o resultado pelo departamento e depois pelo ID do funcionário para facilitar a leitura. Aqui está o resultado: department_iddepartment_nameemployee_idfirst_namelast_name 1Sales6KatieKeaton 1Sales8ZoeJong 2Accounting2FrancescaGotze 2Accounting3FrankGordon 2Accounting9PatrickRose 3IT1BobEstevez 3IT4MilicentJohnson 4HRNULLNULLNULL 5OperationsNULLNULLNULL O resultado mostra todos os departamentos e seus funcionários. Também mostra dois departamentos que não têm funcionários: RH e Operações. Pode ser que o banco de dados ainda não tenha sido atualizado e os novos funcionários não estejam alocados no departamento. Exemplo 3: outro exemplo real de LEFT JOIN Outro exemplo típico do site LEFT JOIN é quando você deseja encontrar todos os clientes e seus pedidos, mas também deseja incluir os clientes que ainda não fizeram nenhum pedido. Para esse exemplo, usarei o seguinte conjunto de dados. A primeira tabela é customerque é uma lista simples de clientes. Aqui está o script. idfirst_namelast_name 1FlorentinusGlöckner 2EmanAdcock 3ErikNyman 4LeebaKubo 5LiasVámos 6LavanyaNikolaev 7RishiPetit 8ChristieFodor 9AndrisLončar 10JulianaHarlan A segunda tabela no conjunto de dados é orders. Você mesmo pode criá-la usando este script. É assim que escrevo o código para obter o resultado desejado: 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; Seleciono os nomes dos clientes na tabela customer. Logicamente, as informações sobre os pedidos vêm da tabela orders. A tabela da esquerda é customere quero todas as suas linhas. Eu a LEFT JOIN com a tabela orders no ID do cliente. O resultado é semelhante a este: 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 Você pode ver que ela mostra todos os clientes e seus pedidos. Quando o cliente não tem nenhum pedido, há NULLs. Para praticar mais, dê uma olhada neste artigo que demonstra mais quatro exemplos de LEFT JOIN. Exemplo 4: LEFT JOIN com 3 tabelas Este é um exemplo do LEFT JOIN em que mostrarei como unir três tabelas. Primeiro, vamos dar uma olhada no conjunto de dados. A primeira tabela é writercom o script aqui. É simplesmente uma lista de escritores. idfirst_namelast_name 1BernardineEvaristo 2AlbertCamus 3GeorgeOrwell 4ÉmileZola 5MilanKundera 6CharlesDickens 7BohumilHrabal 8WitoldGombrowicz A segunda tabela é tradutor. É uma lista de tradutores de livros. O script para criar a tabela está aqui. idfirst_namelast_name 1JenniferCroft 2PeterConstantine 3EwaldOsers A tabela final é book, que mostra informações sobre os livros específicos. Aqui está o script. idbook_titlepublication_yearwriter_idtranslator_id 1The Plague200823 2Cosmos201581 3Manifesto: On Never Giving Up20211NULL 4Girl, Woman, Other20191NULL 5The Stranger202223 6Germinal201243 7198420203NULL Se o valor da coluna translator_id for NULL, esse livro não é uma tradução. Neste exemplo, quero mostrar todos os escritores, independentemente de eles terem um livro ou não. Também quero mostrar as informações sobre o tradutor do livro. Veja como deve ser o 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; Seleciono os nomes dos escritores, os títulos de seus livros e os nomes dos tradutores. Para obter todos esses dados, preciso unir as três tabelas. A união de três (ou mais) tabelas é feita na forma de uma cadeia. Depois de unir as duas primeiras tabelas, você adiciona outra união, faz referência à terceira tabela e declara a condição de união na segunda cláusula ON. Primeiro, faço referência à tabela writere LEFT JOIN com a tabela book no escritor ID. Em seguida, adiciono a segunda cláusula LEFT JOIN. Eu a utilizo para unir a segunda tabela (book) com a tabela translator sobre o ID do tradutor. Por que esses LEFT JOINs são o resultado do relacionamento entre as tabelas? O primeiro LEFT JOIN está lá porque pode haver escritores sem um livro. No entanto, isso também é verdadeiro para o relacionamento entre as tabelas book e translator: um livro pode ou não ser uma tradução, portanto, pode ou não ter um tradutor correspondente. Portanto, você também precisa usar o LEFT JOIN entre eles, pois deseja mostrar os livros, sejam eles traduções ou não. Aqui está o resultado do 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 você pode ver, os livros de Bernardine Evaristo são exibidos apesar de não serem traduções. Isso se deve ao fato de eu ter usado LEFT JOIN como uma segunda união. Além disso, Milan Kundera, Charles Dickens e Bohumil Hrabal são mostrados apesar de não terem livros e, portanto, nenhum tradutor. Exemplo 5: LEFT JOIN "forçado" com três tabelas Normalmente, a escolha de LEFT JOIN decorre da natureza das relações entre as tabelas. Entretanto, às vezes somos "forçados" a usar o LEFT JOIN. Você logo verá o que quero dizer. A primeira tabela do conjunto de dados é uma lista de diretores chamada director. Aqui está o script. idfirst_namelast_name 1StanleyKubrick 2CélineSciamma 3WoodyAllen 4LynneRamsay 5KrzysztofKieślowski Em seguida, temos a tabela streaming_platformque é uma lista de plataformas de streaming disponíveis. Você pode criar a tabela usando este script. idplatform_name 1Netflix 2HBO 3Hulu 4Mubi 5Apple TV A terceira tabela é streaming_catalogue. Ela contém informações sobre filmes e tem relações com as duas primeiras tabelas por meio de director_id e streaming_platform_id. Aqui está o script para criar a tabela. 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 Os valores NULL na coluna ended_showing significam que o filme ainda está sendo exibido na plataforma. Quero mostrar todos os diretores, seus filmes e as plataformas de streaming que estão exibindo (ou já exibiram) seus filmes. Além disso, quero mostrar os diretores que não têm nenhum filme em streaming. A relação entre as tabelas é que todo filme precisa ter um diretor, mas não vice-versa. Além disso, todo filme no catálogo precisa ter uma plataforma de streaming, mas nem toda plataforma de streaming precisa estar no catálogo. Começo a escrever o código selecionando os nomes dos diretores, os títulos dos filmes, os nomes das plataformas e as datas de início e término da exibição. Com base nos exemplos anteriores, você sabe que é esperado unir a tabela director com a tabela streaming_catalogue na coluna ID do diretor. É isso que faço para garantir que também mostro os diretores que não têm nenhum filme no catálogo. Agora, adiciono o segundo LEFT JOIN para unir a tabela streaming_catalogue com a tabela streaming_platform na ID da 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; A consulta retorna 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 O resultado mostra todos os diretores, seus filmes e as plataformas onde eles estão ou estavam sendo exibidos. Os filmes com todos os dados , exceto um NULL nas colunas ended_showing, ainda podem ser vistos em uma determinada plataforma. Apesar de não haver filmes no catálogo, Lynne Ramsay e Stanley Kubrick também estão listados. Isso é reconhecido por ter seus nomes, mas nenhum outro dado. Consegui obtê-los porque usei dois LEFT JOINs. O primeiro LEFT JOIN não é questionável; tive de usá-lo para o caso de haver diretores sem filmes. Acontece que há. Mas o que dizer do segundo LEFT JOIN? Fui meio que forçado a usá-lo para reter todos os diretores sem os filmes e obter o resultado desejado. Por que "forçado"? Bem, vamos usar INNER JOIN em vez do segundo LEFT JOIN, e você verá. 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; O resultado agora está faltando Lynne Ramsay e 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 que isso acontece? Porque INNER JOIN retorna somente as linhas correspondentes das tabelas unidas. Portanto, consegui gerar os diretores sem filmes com o primeiro LEFT JOIN. Muito bem! Mas então usei o INNER JOIN e baguncei tudo! O INNER JOIN cancela o primeiro LEFT JOIN, pois mostrará somente as linhas correspondentes entre streaming_catalogue e streaming_platform. Como Lynne Ramsay e Stanley Kubrick não têm filmes na tabela streaming_catalogueseus filmes inexistentes não podem ser combinados na tabela streaming_platform e eles não aparecem no resultado final. Aqui está um artigo que fornece mais dicas e exemplos de LEFT JOINing de várias tabelas. Exemplo 6: LEFT JOIN com WHERE Vamos continuar com os exemplos do SQL LEFT JOIN usando os mesmos dados do exemplo anterior. Este exemplo mostrará como o LEFT JOIN pode ser usado com a cláusula WHERE. O código abaixo faz exatamente isso para encontrar os diretores, seus filmes e as datas de início e término das exibições. No entanto, ele não mostra todos os filmes, apenas aqueles cuja exibição terminou antes de 1º de outubro 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'; Depois de selecionar as colunas necessárias, eu LEFT JOIN a tabela director com a tabela streaming_ catalogue. As tabelas são unidas pelo ID do diretor. Uso a cláusula WHERE para gerar apenas os filmes que terminaram de ser exibidos antes de 1º de outubro de 2023. Em WHERE, comparo a coluna ended_showing com a data de corte exigida usando o operador de comparação 'less than' (<). Aqui está o resultado. Nenhum filme terminou de ser exibido após 1º de outubro 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 Exemplo 7: WHERE vs. ON em LEFT JOIN Agora mostrarei como o efeito do LEFT JOIN pode ser cancelado se o WHERE for usado na tabela correta. E, é claro, mostrarei uma solução para isso. Estou usando novamente o mesmo conjunto de dados do exemplo anterior. Digamos que eu queira consultá-lo e recuperar todos os diretores, tenham eles um filme no banco de dados ou não. Para os diretores que têm um filme, quero mostrar somente os filmes que foram lançados em 1993. Posso tentar fazer isso escrevendo 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; Primeiro, seleciono as colunas necessárias. Estou usando SELECT DISTINCT para evitar a duplicação de linhas, pois há alguns filmes que aparecem mais de uma vez na tabela streaming_catalogue. Agora, eu LEFT JOIN a tabela director com streaming_catalogue no ID do diretor. A etapa final seria usar a cláusula WHERE e recuperar somente os filmes lançados em 1993. Vamos ver o resultado: first_namelast_namemovie_titlerelease_year KrzysztofKieślowskiThree Colours: Blue1993 WoodyAllenManhattan Murder Mystery1993 Não, isso não está certo! Obtive apenas dois diretores em vez de cinco. Lembre-se, eu queria uma lista de todos os diretores. Por que isso aconteceu, apesar de eu ter usado LEFT JOIN? O motivo é que quando o filtro em WHERE é aplicado aos dados da tabela correta, ele cancela o efeito de LEFT JOIN. Lembre-se, se o diretor não tiver nenhum filme na tabela, os valores na coluna release_year serão NULL. Esse é o resultado de LEFT JOIN. E o filtro em WHERE excluirá NULLs também do resultado. Então, como você pode listar todos os diretores e usar o filtro no ano de lançamento ao mesmo tempo? A resposta é que você deve mover a condição de filtragem de WHERE para ON, desta forma. 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; A condição do ano de lançamento agora se torna a segunda condição de união na cláusula ON. A segunda (terceira, quarta...) condição é adicionada usando a palavra-chave AND. Veja que o resultado agora está correto: first_namelast_namemovie_titlerelease_year StanleyKubrickNULLNULL LynneRamsayNULLNULL CélineSciammaNULLNULL KrzysztofKieślowskiThree Colours: Blue1993 WoodyAllenManhattan Murder Mystery1993 Você pode saber mais neste artigo dedicado à diferença entre WHERE e ON em Cláusulas JOIN em SQL. Exemplo 8: LEFT JOIN com alias Em todos os exemplos anteriores, não foi necessário usar aliases com as tabelas em LEFT JOIN. Pode ter ajudado você a encurtar os nomes das tabelas e a escrever o código um pouco mais rápido. É útil, sim, mas não obrigatório. No entanto, os aliases se tornam obrigatórios quando você está LEFT JOINING a tabela com ela mesma, ou seja, quando você está fazendo a autojunção da tabela. Vamos ver como isso funciona em um exemplo em que quero recuperar os nomes de todos os funcionários e os nomes de seus gerentes. Quero que essa lista contenha funcionários que não tenham um gerente acima deles. Vou demonstrar isso na tabela chamada employees_managers. Aqui está o script: idfirst_namelast_namemanager_id 1LindKaiser2 2IanMcKune8 3DeckTrustrieNULL 4RupertaNind1 5GarrotCharsleyNULL 6AtheneFedoronko8 7PriscillaCrocombeNULL 8StafaniSidebottom8 9MarveTrustie1 10AntonyMarple2 Esta é uma lista dos funcionários. A coluna manager_id contém o ID do funcionário que é o gerente desse funcionário específico. Alguns funcionários não têm gerentes, portanto o valor é NULL. Para concluir a tarefa necessária, preciso escrever 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; Faço referência à tabela na cláusula FROM e dou a ela o alias e. Essa tabela servirá como dados do funcionário. Em seguida, faço referência à mesma tabela em LEFT JOIN e dou a ela o alias m. Ela será usada para os dados dos gerentes. Dessa forma, consegui unir a tabela com ela mesma. Isso não é diferente de unir duas tabelas diferentes. Ao unir-se a si mesma, uma tabela funciona como duas tabelas. Você só precisa dar a elas aliases para que o SQL saiba a qual tabela você se refere. A tabela é autounida quando o ID do gerente da tabela "employee" é igual ao ID do funcionário da tabela "manager". Dessa forma, obterei todos os funcionários e seus gerentes. Agora que as tabelas estão prontas, só preciso selecionar as colunas necessárias. Novamente, para fazer uma distinção, uso aliases de tabela diferentes para obter os nomes dos funcionários e dos gerentes. Aqui está o resultado: employee_first_nameemployee_last_namemanager_first_namemanager_last_name LindKaiserIanMcKune IanMcKuneStafaniSidebottom DeckTrustrieNULLNULL RupertaNindLindKaiser GarrotCharsleyNULLNULL AtheneFedoronkoStafaniSidebottom PriscillaCrocombeNULLNULL StafaniSidebottomStafaniSidebottom MarveTrustieLindKaiser AntonyMarpleIanMcKune Como você pode ver, essa é uma lista completa de funcionários e seus gerentes. Deck Trustrie, Garrot Charsley e Priscilla Crocombe não têm gerentes. Eles estão no topo da estrutura hierárquica da empresa. Exemplo 9: LEFT JOIN com GROUP BY Vamos voltar ao Exemplo 2, em que trabalhamos com uma lista de departamentos e funcionários. Um exemplo simples de LEFT JOIN com GROUP BY seria listar todos os departamentos e contar o número de funcionários em cada um deles: 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; Eu seleciono o departamento e uso a função de agregação COUNT() na coluna de ID do funcionário para encontrar o número de funcionários. Os dados vêm de duas tabelas. Preciso acessar LEFT JOIN a tabela department com a tabela employee já que também quero departamentos sem funcionários. As tabelas são unidas pelo ID do departamento. Como usei uma função de agregação, também preciso agrupar os dados. Faço isso usando a cláusula GROUP BY. O agrupamento da saída pelo nome do departamento mostrará o número de funcionários de cada departamento. Dê uma olhada. Legal, não é? department_namenumber_of_employees Accounting3 Operations0 Sales2 IT2 HR0 Agora, vamos tentar outro exemplo e usar COUNT(*) em vez de aplicar COUNT() a uma coluna específica. Desta vez, estou usando os dados sobre as empresas e seus produtos do Exemplo 1. Neste exemplo, quero recuperar todas as empresas e mostrar o número de produtos que elas têm. Vamos ver o que acontece se eu usar COUNT(*): SELECT company_name, COUNT(*) AS number_of_products FROM company LEFT JOIN product ON company.id = product.company_id GROUP BY company_name; As tabelas company e product são LEFT JOINed no ID da empresa. Estou usando COUNT(*) e GROUP BY para encontrar o número de produtos por empresa. Este é o resultado: company_namenumber_of_products Huawei1 Lenovo1 Samsung3 Apple3 Fairphone2 No entanto, posso dizer que esse resultado não está certo: a Huawei e a Lenovo deveriam ter tido zero produtos. Por que esse erro ocorreu? O culpado é COUNT(*)! O asterisco na função COUNT() significa que ela conta todas as linhas, inclusive NULLs. Está ficando mais claro agora? Sim, é isso mesmo: quando as empresas sem produtos são LEFT JOINed, elas terão produtos NULL. Entretanto, esse ainda é um valor, e o COUNT(*) verá cada valor do NULL como um produto. Em outras palavras, até mesmo as empresas sem produtos serão mostradas como tendo um produto. Para corrigir isso, use COUNT(expression). Nesse caso, isso significa COUNT(product.id). O uso de COUNT() com um nome de coluna 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; O resultado agora é o esperado: company_namenumber_of_products Huawei0 Lenovo0 Samsung3 Apple3 Fairphone2 Você pode obter mais detalhes lendo este artigo sobre diferentes variações da função agregada COUNT(). Mais exemplos e recursos do SQL LEFT JOIN Você pode ver nos exemplos acima que o site LEFT JOIN tem amplo uso no trabalho prático com dados. Ele pode ser usado para recuperação simples de dados, em que você precisa de todos os dados de uma tabela e apenas os dados correspondentes de outra. No entanto, também pode ser usado ao unir várias tabelas, com WHERE, em autouniões e com funções agregadas e GROUP BY. As uniões de SQL são vitais no trabalho com várias tabelas, o que é uma tarefa cotidiana até mesmo para analistas de dados juniores. Conhecer as junções é uma necessidade absoluta se você quiser se considerar fluente em SQL e melhorar seu trabalho. Isso também significa conhecer LEFT JOIN, pois é um dos dois tipos de junção mais usados. Devido às suas características muito específicas, muitas tarefas não podem ser realizadas de outra forma que não seja por meio do LEFT JOIN. Portanto, se precisar de um guia detalhado sobre esses tópicos, convidamos você a dar uma olhada em nosso cursoCláusulas JOIN em SQL . Além disso, você precisa praticar todos esses conceitos para que eles sejam realmente assimilados. Isso significa praticar o LEFT JOIN e outros tipos de JOIN para que você possa diferenciá-los. Você pode tentar estas 12 perguntas práticas sobre JOIN ou algumas das sugestões sobre como praticar Cláusulas JOIN em SQL. Se você tiver uma entrevista de emprego sobre SQL em breve, tente responder a estas 10 perguntas de entrevista sobre SQL JOIN. Bom aprendizado! Tags: left join sql