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.
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 |
id | nome |
1 | Infantil |
2 | Informatica |
3 | Educacional |
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 |
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 |
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 |
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 |
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 |
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 |