Voltar para a lista de artigos Artigos
8 minutos de leitura

Como Juntar Várias Tabelas em SQL Usando LEFT JOIN

É possível unir tabelas em SQL usando LEFT JOIN? Claro que sim! Se necessário, você pode usar vários LEFT JOINs em uma única consulta para a sua análise. Neste artigo, apresentarei alguns exemplos para demonstrar como juntar várias tabelas em SQL e como evitar alguns erros comuns ao fazer isso.

O que é um LEFT JOIN?

Vamos começar lembrando o que é um LEFT JOIN e como utilizá-lo. Você deve se lembrar que um INNER JOIN retorna apenas os registros que estão em ambas as tabelas. Por outro lado, um LEFT JOIN em SQL retorna todos os registros (ou linhas) da tabela da esquerda e somente os registros (ou linhas) correspondentes da direita. Isto significa que, se uma linha específica estiver presente na tabela da esquerda mas não na da direita, o resultado incluirá esta linha mas com um valor NULL em cada coluna da direita. Se um registro da tabela da direita não estiver na esquerda, ele não aparecerá no resultado.

Junte-se a

A sintaxe geral para um LEFT JOIN é a seguinte:

SELECT nome das colunas
FROM tabela1
LEFT JOIN tabela2
  ON tabela1.coluna_comum = tabela2.coluna_comum;

Para mais informações sobre as cláusulas JOIN em SQL, confira este guia completo. Se você quiser praticar diferentes tipos de JOINs, confira nosso curso interativo Cláusulas JOIN em SQL com mais de 90 exercícios práticos.

O LEFT JOIN é comumente utilizado em tarefas analíticas. Primeiro, é muito útil para identificar registros em uma determinada tabela que não têm nenhum registro correspondente em outra. Neste caso, você pode adicionar uma cláusula WHERE à consulta para selecionar, a partir do resultado da junção, as linhas com valores NULL em todas as colunas da segunda tabela. Entretanto, certifique-se primeiro de que sua segunda tabela não tenha registros com valores NULL em todas as colunas, exceto no campo comum usado para o JOIN. Alternativamente, use uma coluna da segunda tabela que seja totalmente preenchida sem valores NULL, se houver.

Aqui está outro cenário. Imagine que administramos uma livraria on-line e queremos comparar os clientes que compraram nos últimos 6 meses com aqueles que estiveram inativos durante o mesmo período. Neste caso, queremos que o resultado inclua TODOS os clientes - ativos e inativos - unindo os dados sobre nossos clientes com os dados sobre as vendas recentes. Este é um uso perfeito para uma cláusula LEFT JOIN.

Aqui estão as tabelas de clientes e vendas da nossa livraria.

clientes

idprimeiro_nomesobrenomegeneroidadecliente_desde
1DanielBastosM342014-10-13
2EricBezerraM252015-06-10
3DianaTelesF392015-10-25
4AnnaItoF192017-02-20
5CristianoSantosM422018-01-31

vendas

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

Para unir estas duas tabelas e obter as informações que precisamos para análise, realize a seguinte consulta SQL:

SELECT c.id, c.primeiro_nome, c.sobrenome, c.genero, c.idade, c.cliente_desde,    
       s.data AS data_de_venda, sum(s.quantia) AS total_gasto
FROM clientes c
LEFT JOIN vendas s
ON c.id = s.identificacao_cliente
GROUP BY c.id;

Com isto, mantemos todos os registros sobre os clientes, anexamos a data de venda e calculamos o valor total gasto. Na tabela abaixo, as linhas que estariam presentes em INNER JOIN são destacadas em azul, enquanto o amarelo denota registros adicionais resultantes do LEFT JOIN.

idprimeiro_nomesobrenomegeneroidadecliente_desdedata_de_vendatotal_gasto
1DanielBastosM342014-10-13[NULL][NULL]
2EricBezerraM252015-06-102019-10-0112.99
3DianaTelesF392015-10-252019-09-0214.99
4AnnaItoF192017-02-202019-10-0115.75
5CristianoSantosM422018-01-31[NULL][NULL]

Como você pode ver, os clientes sem compras no período determinado têm um valor NULL para a data de venda e o valor total gasto, uma vez que seus registros não estão presentes na tabela vendas. É assim que funciona um LEFT JOIN. Considere praticar o uso de LEFT JOINs e outros tipos de JOIN em nosso curso completo Cláusulas JOIN em SQL ou confira nossa Trilha de Práticas em SQL com vários exercícios.

Agora, vamos trabalhar em alguns casos mais complicados!

Vários LEFT JOINs em uma consulta

Às vezes, precisamos juntar mais de duas tabelas utilizando LEFT JOIN para obter os dados necessários para análises específicas. Felizmente, a palavra-chave LEFT JOIN pode ser usada com várias tabelas em SQL.

Vejamos um exemplo. Queremos analisar como a nossa última campanha promocional impactou o comportamento de nossos clientes.

promocoes

idcampanhaidentificacao_clientedata
1SMS_desconto1022019-09-01
2SMS_desconto1032019-09-01
3SMS_desconto1052019-09-01

Para isso, precisamos juntar os dados das tabelas clientes, vendas e promocoes.

SELECT c.id, c.primeiro_nome, c.sobrenome, c.genero, c.idade, c.cliente_desde, 
   s.data AS venda, p.data AS promocao
FROM clientes c
LEFT JOIN vendas s
ON c.id = s.identificacao_cliente
LEFT JOIN promocoes p
ON c.id = p.identificacao_cliente;

Aqui está o resultado:

idprimeiro_nomesobrenomegeneroidadecliente_desdevendapromocao
1DanielBastosM342014-10-13[NULL][NULL]
2EricBezerraM252015-06-102019-10-012019-09-01
3DianaTelesF392015-10-252019-09-022019-09-01
4AnnaItoF192017-02-202019-10-01[NULL]
5CristianoSantosM422018-01-31[NULL]2019-09-01

Como você pode ver, ao utilizar um LEFT JOIN preservamos os registros de todos os nossos clientes, independentemente do histórico de compras ou da participação nas campanhas promocionais. Por exemplo, o Cliente 1 está no resultado da junção, mesmo não tendo feito nenhuma compra nem recebido a mensagem promocional. Temos também o Cliente 4, que comprou um livro mas não recebeu nenhuma mensagem promocional, assim como o Cliente 5, que recebeu uma mensagem promocional mas não fez nenhuma compra. Finalmente, os clientes que fizeram compras e receberam mensagens promocionais (Clientes 2 e 3) também estão incluídos no resultado.

Note que, neste exemplo, utilizamos um campo comum da primeira tabela para juntar tanto a segunda como a terceira tabela. No entanto, nem sempre é assim que acontece. Vejamos um caso em que um campo comum da segunda tabela é usado para uni-la com a terceira usando um LEFT JOIN, mas não com a primeira.

Queremos explorar os gêneros de livros que mais interessam aos nossos clientes. Esta informação é muito valiosa, pois nos ajuda a proporcionar uma experiência mais personalizada, com recomendações específicas de livros. Para esta análise, precisaremos dos dados das tabelas clientes, vendas e livros. Já juntamos as duas primeiras em nosso primeiro exemplo; a isto, acrescentaremos a tabela livros.

livros

idnomeautorgeneroquantidadepreco
1O Senhor dos AnéisJ. R. R. Tolkienfantasia712.99
2LolitaVladimir Nabokovromance414.99
4O HobbitJ. R. R. Tolkienfantasia1010.75
5Morte no NiloAgatha Christiedetetive89.75

Para obter os dados necessários para analisar os livros e gêneros que nossos clientes preferem, use a seguinte consulta:

SELECT c.id, c.primeiro_nome, c.sobrenome, s.data AS venda, 
 b.nome AS livro, b.genero
FROM clientes c
LEFT JOIN vendas s
ON c.id = s.identificacao_cliente
LEFT JOIN livros b
ON s.identificacao_livro = b.id;

Aqui está o resultado da junção, na qual os dados do cliente são combinados com os dados sobre os livros comprados recentemente (se houver).

idprimeiro_nomesobrenomevendalivrogenero
1DanielBastos[NULL][NULL][NULL]
2EricBezerra2019-10-01O Senhor dos Anéisfantasia
3DianaTeles2019-09-02Lolitaromance
4AnnaIto2019-10-01[NULL][NULL]
5CristianoSantos[NULL][NULL][NULL]

Temos dois clientes (1 e 5) que não compraram nada e, portanto, não têm registros correspondentes na tabela vendas. No entanto, estas linhas são mantidas através de um LEFT JOIN. Além disso, a tabela inclui a linha correspondente ao Cliente 4 que recentemente comprou um livro que não está em nosso banco de dados e, portanto, não tem dados na tabela livros. O resultado da junção ainda inclui este registro por causa da cláusula LEFT JOIN.

Como você pode ver, podemos usar LEFT JOIN em SQL com várias tabelas. Entretanto, para garantir os resultados esperados, esteja atento aos problemas que podem surgir ao unir mais de duas tabelas.

Pontos a considerar com o uso de vários LEFT JOINs

A junção de várias tabelas em SQL pode ser complicada. Aqui estão algumas considerações ao usar LEFT JOINs, especialmente com múltiplas tabelas.

Diferente do INNER JOIN, a ordem das tabelas desempenha um papel importante no LEFT JOIN, e os resultados podem ser completamente diferentes se você utilizar uma ordem diferente na sua consulta em SQL. Ao determinar a ordem das tabelas em um LEFT JOIN, a regra geral é começar com a tabela a partir da qual você deseja manter todos os registros no resultado final.

Além disso, tenha em mente que um LEFT JOIN influencia em todas as junções de uma consulta. Se você usar um LEFT JOIN, muitas vezes as tabelas resultantes também devem ser mantidas juntas por meio de LEFT JOINs. Um INNER JOIN deixará de fora registros não encontrados em ambos os lados da junção, e você poderá perder todos os registros que desejava manter - este é o motivo de usar LEFT JOIN em vez do habitual INNER JOIN.

Além disso, um LEFT JOIN deve ser usado para a terceira tabela quando a primeira tabela tiver registros não encontrados na segunda (comum para LEFT JOINs!) e um campo comum diferente é usado para unir a segunda e a terceira tabelas. Se você usar um INNER JOIN nesta situação, deixará de fora todos os registros da primeira tabela que não possuem correspondências na segunda e terceira tabelas.

Este é o caso do nosso exemplo anterior, no qual juntamos as tabelas clientes, vendas e livros. Vamos ver o que acontece se usarmos um INNER JOIN em vez de um LEFT JOIN para unir os dados da tabela livros:

SELECT c.id, c.primeiro_nome, c.sobrenome, s.data AS venda, 
 b.nome AS livro, b.genero
FROM clientes c
LEFT JOIN vendas s
ON c.id = s.identificacao_cliente
INNER JOIN livros b
ON s.identificacao_livro = b.id;
idprimeiro_nomesobrenomevendalivrogenero
2EricBezerra2019-10-01O Senhor dos Anéisfantasia
3DianaTeles2019-09-02Lolitaromance

Como você pode ver, agora temos apenas dois registros em vez de cinco. Quando realizamos a junção usando um INNER JOIN, perdemos um registro correspondente à compra do livro que não estava na tabela de livros. Também perdemos as informações sobre os dois clientes sem nenhuma compra recente - os registros que precisávamos manter utilizando o LEFT JOIN - ao juntar a tabela vendas. Isto porque unimos a terceira tabela usando um campo comum com a segunda, e esta coluna é NULL para todas as linhas da primeira tabela não encontradas na segunda. Como resultado, estes registros não possuem correspondências na terceira tabela, e são posteriormente descartados pelo INNER JOIN na última parte da nossa consulta.

Hora de praticar o uso de LEFT JOINs!

Você aprendeu muito sobre LEFT JOINs! Agora você conhece até mesmo as particularidades de se utilizar LEFT JOINs com várias tabelas em uma consulta SQL. Que tal colocar esses novos conhecimentos em prática?

  • Nosso curso Cláusulas JOIN em SQL fornece materiais práticos completos para diferentes tipos de junções, incluindo LEFT JOINs, INNER JOINs, SELF JOINs, JOINs não-equis e, claro, junções de várias tabelas em uma única consulta.
  • Nossa Trilha de Práticas em SQL oferece diversos cursos interativos em SQL para praticar diferentes cláusulas e funções, como JOINs, GROUP BY, agregação, e muito mais.

Obrigada pela leitura, e bons estudos!