Voltar para a lista de artigos Artigos
20 minutos de leitura

9 exemplos práticos de LEFT JOIN em SQL

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!