CodeGym /Cursos /SQL SELF /Usando LEFT JOIN: incluindo todos os dados da tabela da ...

Usando LEFT JOIN: incluindo todos os dados da tabela da esquerda

SQL SELF
Nível 11, Lição 2
Disponível

Imagina que tu tem duas tabelas: uma lista de estudantes e uma lista das inscrições deles nos cursos. Nem todo estudante tá inscrito em algum curso, e tu quer ver a lista completa de todos os estudantes, incluindo quem ainda não escolheu nenhum curso. Se tu usar INNER JOIN, só vai ver quem tá inscrito em algum curso, mas e o resto dos estudantes? É aí que entra o LEFT JOIN.

LEFT JOIN retorna todas as linhas da tabela da esquerda (a que vem primeiro na query) e as linhas correspondentes da tabela da direita. Se não tiver correspondência, as colunas da tabela da direita vão vir com valor NULL.

Sintaxe do LEFT JOIN

SELECT
    tabela1.coluna1,
    tabela1.coluna2,
    tabela2.coluna1,
    tabela2.coluna2    
FROM 
    tabela1 LEFT JOIN tabela2
ON 
    tabela1.coluna_comum = tabela2.coluna_comum;
  • tabela1 — é a "tabela da esquerda".
  • tabela2 — é a "tabela da direita".
  • coluna_comum — a coluna que é igual nas duas, usada pra juntar.

Exemplo bem simples

Se a tabela students for assim:

student_id name
1 Otto
2 Anna
3 Peter

E a tabela enrollments for assim:

enrollment_id student_id course
1 1 Matemática
2 1 Física
3 2 Biologia

Aí a query:

SELECT
    students.name, 
    enrollments.course
FROM 
    students LEFT JOIN enrollments
ON 
    students.student_id = enrollments.student_id;

vai dar:

name course
Otto Matemática
Otto Física
Anna Biologia
Peter NULL

Como tu pode ver, o resultado mostra todos os estudantes, até o Peter, que ainda não se inscreveu em nenhum curso. Pro Peter, na coluna course aparece NULL.

Exemplos de uso do LEFT JOIN

Exemplo 1: Pegando a lista de todos os estudantes e seus cursos

Vamos ver o seguinte: a gente precisa pegar a lista completa dos estudantes junto com os cursos em que eles estão inscritos, se tiver. Se o estudante ainda não escolheu curso, isso também tem que aparecer.

Mesma query:

SELECT
    students.name, 
    enrollments.course
FROM 
    students LEFT JOIN enrollments
ON 
    students.student_id = enrollments.student_id;

Resultado:

name course
Otto Matemática
Otto Física
Anna Biologia
Peter NULL

Esse é o exemplo clássico de LEFT JOIN.

Exemplo 2: Mostrando produtos e suas vendas

Imagina que tu tem duas tabelas:

Tabela products, com todos os produtos:

product_id product_name
1 Smartphone
2 Tablet
3 Notebook

Tabela sales, com os dados das vendas:

sale_id product_id quantity
1 1 5
2 1 3
3 2 2

Agora tu quer ver todos os produtos e a quantidade vendida de cada um, incluindo os que ainda não foram vendidos.

SELECT
    products.product_name, 
    SUM(sales.quantity) AS total_vendido
FROM 
    products LEFT JOIN sales
    ON 
    products.product_id = sales.product_id
GROUP BY 
    products.product_name;

Resultado:

product_name total_vendido
Smartphone 8
Tablet 2
Notebook NULL

Peculiaridades e problemas ao usar LEFT JOIN

Sempre precisa de NULL?
Às vezes o LEFT JOIN coloca NULL onde tu não esperava. Nesses casos, tu pode trocar o NULL por um valor mais amigável usando a função COALESCE().

SELECT
    students.name, 
    COALESCE(enrollments.course, 'Curso não escolhido') AS course
FROM 
    students LEFT JOIN enrollments
ON 
    students.student_id = enrollments.student_id;

Resultado:

name course
Otto Matemática
Otto Física
Anna Biologia
Peter Curso não escolhido

Duplicatas desnecessárias
Se os dados da tabela da direita tiverem registros duplicados, o resultado da query pode ter mais linhas do que tu esperava. Fica de olho nos dados que tu tá usando e usa DISTINCT se não quiser duplicatas.

2
Tarefa
SQL SELF, nível 11, lição 2
Bloqueado
Lista completa de estudantes e seus cursos
Lista completa de estudantes e seus cursos
2
Tarefa
SQL SELF, nível 11, lição 2
Bloqueado
Lista completa de produtos e suas vendas
Lista completa de produtos e suas vendas
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION