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.
GO TO FULL VERSION