Introdução

LEFT JOIN retorna todos os registros da tabela à esquerda (Tabela 1) e os registros correspondentes da tabela à direita (Tabela 2). O resultado é NULL do lado direito, se não houver correspondência, como ilustra a Figura 1.

Selecionando todos os dados que são comuns as duas tabelas
Figura 1. Selecionando todos os dados que são comuns às duas tabelas e todo conteúdo da tabela à esquerda

Considere a estrutura de tabelas abaixo, onde temos uma tabela chamada produto (Tabela 1), responsável por armazenar todos os produtos do estoque do cliente, a tabela categoria_produto (Tabela 2), responsável por armazenar todas as categorias existentes no banco de dados, e a tabela venda_produto (Tabela 3), que relaciona os produtos que foram vendidos.

id nome preco Id_categoria
1 Bola 35.00 1
2 Patinete 120.00 1
3 Carrinho 15.00 1
4 Skate 296.00 1
5 Notebook 3500.00 2
6 Monitor LG 19 450.00 2
7 O Diário de Anne Frank 45.00 3
8 O dia do Curinga 65.00 3
9 O mundo de Sofia 48.00 3
10 Através do Espelho 38.00 3
11 Bicicleta Mormai NULL NULL
Tabela 1. Tabela produto
id nome
1 Infantil
2 Informatica
3 Educacional
Tabela 2. Tabela categoria_produto
id id_produto valor data
1 1 35.00 2018-05-15
2 1 35.00 2018-06-15
3 1 35.00 2018-07-15
4 2 120.00 2018-07-15
5 2 120.00 2018-07-14
6 3 15.00 2018-07-15
7 7 45.00 2018-07-15
8 8 65.00 2018-07-15
9 8 65.00 2018-07-16
10 9 48.00 2018-07-16
11 5 3500.00 2018-07-16
12 5 3500.00 2018-07-16
13 6 450.00 2018-07-16
Tabela 3. Tabela venda_produto

Considere que seja necessário trazer em uma consulta todos os produtos com as informações relacionadas as suas categorias. Como visto anteriormente, se utilizarmos o INNER JOIN para resolver essa consulta, serão trazidos somente produtos que tenham uma categoria vinculada. Para trazer todos os produtos com a informação da categoria referente, independente se há ou não categoria vinculada, podemos utilizar o LEFT JOIN, conforme trecho de código abaixo:

SELECT
    P.nome as Produto,
    C.nome as Categoria
FROM 
  produto P
LEFT JOIN categoria_produto C
ON C.id = P.id_categoria

No trecho de código acima, nas linhas 1 a 3 selecionamos o nome do produto, nomeado de Produto, o nome da categoria, nomeado de Categoria e, em seguida, na linha 5 informamos que a consulta será feita na tabela produto, nomeada de P e, em seguida, nas linhas 6 e 7 realizamos um LEFT JOIN com a tabela categoria_produto, nomeada de C, informando que o ID da categoria deve ser o mesmo nas duas tabelas.

Com a query acima obtivemos o resultado que pode ser visto na Tabela 4.

Produto Categoria
Bola infantil
Patinete infantil
Carrinho infantil
Skate infantil
Notebook Informatica
Monitor LG 19 Informatica
O Diário de Anne Frank Educacional
O dia do Curinga Educacional
O mundo de Sofia Educacional
Através do Espelho Educacional
Bicicleta Mormai NULL
Tabela 4. Busca de todos os produtos e suas categorias

Observe que no resultado acima, o último registro, produto Bicicleta Mormai veio com a categoria NULL, ou seja, mesmo sem a referência, esse valor foi retornado.

Sintaxe

SELECT
  [ tabela1.coluna1, tabela1.coluna2, ... | N.coluna1, N.coluna2, … ]
FROM
  [ tabela1 | tabela1 F ]
LEFT JOIN 
  [ tabelaX | tabelaX N] 
ON 
  [ tabelaX.coluna1 = tabela1.coluna1 | N.coluna1 = F.coluna1 ]

Na prática

Exemplo 1

Outro ponto importante é que não há limites para o uso de JOINS, podemos por exemplo adicionar mais uma tabela a essa consulta, trazendo agora a informação de produtos que foram vendidos, independente se o produto teve ou não uma saída.

Podemos utilizar o trecho de código abaixo:

SELECT
    P.nome as Produto,
    C.nome as Categoria,
    COUNT(VP.id_produto) as TOTAL_VENDIDOS
FROM 
    produto P
LEFT JOIN 
    categoria_produto C
ON C.id = P.id_categoria
LEFT JOIN 
    venda_produto VP
ON VP.id_produto = P.id
GROUP BY
    P.id

No trecho de código acima, nas linhas de 1 a 4 selecionamos o nome do produto, nomeado de Produto, o nome da categoria, nomeado de Categoria, e o total de ID produto na tabela venda_produto, chamado de TOTAL_VENDIDOS.

Em seguida, nas linhas 7 a 9 realizamos o primeiro LEFT JOIN, esse com a tabela categoria_produto, nomeada de C, onde definimos que o ID da categoria deve ser o mesmo nas duas tabelas (produto e categoria_produto).

Logo após nas linhas 10 a 12 realizamos o segundo LEFT JOIN, esse na tabela venda_produto, nomeada de VP, onde o ID de produto deve ser o mesmo nas duas tabelas (produto e venda_produto).

Por fim, agrupamos o resultado da consulta por ID do produto.

O resultado da query acima pode ser visto na Tabela 5.

Produto Categoria TOTAL_VENDIDOS
Bola infantil 3
Patinete infantil 2
Carrinho infantil 1
Skate infantil 0
Notebook Informatica 2
Monitor LG 19 Informatica 1
O Diário de Anne Frank Educacional 1
O dia do Curinga Educacional 2
O mundo de Sofia Educacional 1
Através do Espelho Educacional 0
Bicicleta Mormai NULL 0
Tabela 5. Busca de todos os produtos, sua categoria e suas vendas

Observe que no resultado acima, os dois últimos registros não tinham vendas e o resultado veio como 0. Lembrando que o produto Bicicleta Mormai além de não ter venda (0) também não possui categoria vinculada (NULL).

Exemplo 2

Para o exemplo a seguir, considere a estrutura de tabelas abaixo, onde temos a tabela projeto (Tabela 6), responsável por manter todos os projetos da empresa, e a tabela comentario (Tabela 7), responsável por manter todos os comentários referentes aos projetos cadastrados no banco de dados.

ID Titulo Data
7 Criando uma aplicação com React 2018-04-10
8 API RestFUL com Lumen 2018-05-10
9 Consumindo uma API RestFUL com Laravel 2018-05-20
10 Documentação SQL 2018-05-21
Tabela 6. Estrutura da tabela projeto
ID Comentario Data id_projeto
1 Muito legal essa aplicação! Adorei usar o React 2018-04-10 7
2 React é muito simples! Curti o projeto! parabéns! 2018-05-10 7
3 Muito top! 2018-05-20 9
4 Parabéns aos envolvidos! 2018-05-20 9
5 Muito legal, sempre gostei do Laravel. 2018-05-20 9
6 Interessante a forma de recuperar as informações. Não sabia. Gostei! 2018-05-21 9
7 Consigo fazer o mesmo com CodeIgniter? 2018-05-22 9
8 React é apenas JavaScript, há uma API bem pequena para aprender, apenas algumas funções e como usá-las. Depois disso, suas habilidades em JavaScript serão o que te farão um melhor desenvolvedor React 2018-05-23 7
Tabela 7. Estrutura da tabela comentario

Suponha que seja necessário trazer todos os projetos e, caso haja, trazer também o comentário recebido para cada um deles. Para isso podemos utilizar a query abaixo:

SELECT
    P.id,
    P.titulo,
    C.comentario
FROM
  projetos P
LEFT JOIN
  comentario C
ON 
  C.id_projeto = P.id

Observe que no trecho de código acima, nas Linhas 2 a 4 selecionamos o id e titulo da tabela projetos, e o comentario da tabela comentario. Em seguida, na Linha 7 realizamos o vínculo entre as duas tabelas utilizando LEFT JOIN, fazendo com que o SQL traga todos os projetos e caso haja comentário, também trará essa informação. Para projetos sem comentário, o SQL traz um valor NULL.

O resultado da query pode ser visto abaixo, na Tabela 8.

ID Titulo Comentario
7 Criando uma aplicação com React Muito legal essa aplicação! Adorei usar o React
7 Criando uma aplicação com React React é muito simples! Curti o projeto! parabéns!
9 Consumindo uma API RestFUL com Laravel Muito top!
9 Consumindo uma API RestFUL com Laravel Parabéns aos envolvidos!
9 Consumindo uma API RestFUL com Laravel Muito legal, sempre gostei do Laravel.
9 Consumindo uma API RestFUL com Laravel Interessante a forma de recuperar as informações. Não sabia. Gostei!
9 Consumindo uma API RestFUL com Laravel Consigo fazer o mesmo com CodeIgniter?
7 Criando uma aplicação com React React é apenas JavaScript, há uma API bem pequena para aprender, apenas algumas funções e como usá-las. Depois disso, suas habilidades em JavaScript serão o que te farão um melhor desenvolvedor React
8 API RestFUL com Lumen NULL
10 Documentação SQL NULL
Tabela 8. Lista de projetos e seus comentários