Left join e inner join: junção em consultas SQL

Left join é uma operação em consultas SQL para retornar todos os dados da coluna esquerda, independente de haver ou não dados na coluna da direita.

Imagine que você deseja listar todos os clientes de uma empresa, os valores de compras dentro do mês. Se você deseja que apareça todos os clientes, independente de terem feito compras ou não, então o Left join é a junção ideal para esta consulta SQL.

A junção Inner join é um pouco diferente do left join, se aplicarmos ao exemplo anterior veremos que ela só retornaria os clientes que tiveram compras no mês.

Alguns exemplos de left join e inner join.

Primeiro vamos criar três tabelas no banco de dados: empregados, pagamentos e descontos.

create table empregados(
codigo_empregado int,
nome varchar(50)
)
create table pagamentos(
codigo_pagto int,
codigo_empregado int,
valor decimal(10,2)
)
create table descontos(
codigo_desconto int,
codigo_empregado int,
valor decimal(10,2)
)

Agora vamos inserir alguns dados nas tabelas criadas a fim de podermos reproduzir nossos exemplos.

</pre>
insert into empregados(codigo_empregado,nome) values(1,'Luis')
insert into empregados(codigo_empregado,nome) values(2,'Marina')
insert into empregados(codigo_empregado,nome) values(3,'Letícia')
insert into empregados(codigo_empregado,nome) values(4,'Gustavo')
insert into empregados(codigo_empregado,nome) values(5,'Mateus')
insert into pagamentos(codigo_empregado,valor) values(1,100)
insert into pagamentos(codigo_empregado,valor) values(1,200)
insert into pagamentos(codigo_empregado,valor) values(3,300)
insert into pagamentos(codigo_empregado,valor) values(5,400)
insert into pagamentos(codigo_empregado,valor) values(5,500)
insert into descontos(codigo_empregado,valor) values(1,50)
insert into descontos(codigo_empregado,valor) values(2,20)
insert into descontos(codigo_empregado,valor) values(5,30)

Agora que já temos os dados populados na tabela, vamos ver um exemplo de Inner Join.

select e.nome, p.valor as pagamento
from empregados as e INNER JOIN pagamentos as p
ON e.codigo_empregado = p.codigo_empregado

Exemplo de inner join

Apesar de termos cinco empregados na tabela, ele mostrou apenas três, o motivo é que apenas estes três tem pagamentos. Veja que o inner join fez uma junção entre empregados e pagamentos e desconsiderou os empregado sem pagamentos.

Vamos a outro exemplo de Inner join

select e.nome, p.valor as pagamento, d.valor as desconto
from empregados as e INNER JOIN pagamentos as p
ON e.codigo_empregado = p.codigo_empregado
INNER JOIN descontos as d
ON e.codigo_empregado = d.codigo_empregado

Exemplo de inner join

Neste caso apenas dois empregados foram mostrados já que incluímos na consulta os descontos, ou seja, a leitura que esta consulta fez é: mostrar empregados quem tem pagamentos e descontos.

Agora veremos os exemplos de Left join

select e.nome, p.valor as pagamento
from empregados as e LEFT JOIN pagamentos as p
ON e.codigo_empregado = p.codigo_empregado

Exemplo de leff join

Os empregados 3 e 5 não tem pagamentos, mas ainda assim eles apareceram na consulta, já que a função Left Join considera apenas a coluna da esquerda e retorna Null (nulo) quando a coluna da direita não tiver um valor correspondente.

Vamos incluir os descontos para entender melhor o left join.

select e.nome, p.valor as pagamento, d.valor as desconto
from empregados as e LEFT JOIN pagamentos as p
ON e.codigo_empregado = p.codigo_empregado
LEFT JOIN descontos as d
ON e.codigo_empregado = d.codigo_empregado

Exemplo de leff join

O que fizemos foi uma espécie de left join em cascata e é útil quando queremos partir de uma base (empregados) e listar todas as correspondências ou não das tabelas (pagamentos e descontos) a ela relacionadas.

Bom, espero que estes pequenos e simples exemplos de consultas SQL possa ter ajudado na compreensão do Left join e Inner join, já que tenho percebido que muita gente tem dificuldade de compreender as diferenças entre eles.

Veja também Join ou Junções SQL | Inner, left, right e full outer join que explora de forma mais ampla o assunto de joins.

Deixe sua resposta