Left join e inner join: junção em consultas SQL
Tutorial que mostra passo a passo como funcionam os operadores de join: left join e inner join, usados para fazer junção de dados de duas ou mais tabelas em SQL Tutorial passo-a-passo de join em SQL. Aprenda as diferenças entre as junções cross, inner, left, right e full outer join.
Índice deste artigo
- Alguns exemplos de left join e inner join.
- Agora que já temos os dados populados na tabela, vamos ver um exemplo de Inner Join.
- Vamos a outro exemplo de Inner join
- Agora veremos os exemplos de Left join
- Vamos incluir os descontos para entender melhor o left join.
- Indo além
- Cross Join
- Inner Join
- Left Join
- Right Join
- Full Outer Join
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.
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 pagamentofrom empregados as e INNER JOIN pagamentos as p
ON e.codigo_empregado = p.codigo_empregado
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 descontofrom 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
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 pagamentofrom empregados as e LEFT JOIN pagamentos as p
ON e.codigo_empregado = p.codigo_empregado
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 descontofrom 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
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.
Indo além
Join ou junção em SQL é um assunto que provoca muitas dúvidas, afinal, sempre que juntamos duas ou mais tabelas, poderemos ter resultados bem diferentes dependendo do tipo de junção que estamos fazendo. Escrevi o artigo acima e pelo visto o pessoal gostou da abordagem, agora, quero ir além e vou incluir além do left e inner, o right join, cross join e o full outer join.
Primeiro vou criar duas tabelas simples no banco de dados: Marcas e Carros.
create table carros(marca varchar(100),
modelo varchar(100),
ano int,
cor varchar(100)
)
create table marcas(marca varchar(50),
nome varchar(50)
)
Com as tabelas criadas, vou inserir alguns dados nelas:
insert into marcas values('VW','Volkswagem')insert into marcas values('Ford','Ford')
insert into marcas values('GM','General Motors')
insert into marcas values('Fiat','Fiat')
insert into marcas values('Renault','Renault')
insert into marcas values('MB','Mercedes Bens')
insert into carros values('VW','Fox',2005,'preto');insert into carros values('VW','Fox',2008,'preto');
insert into carros values('Ford','Ecosport',2009,'verde');
insert into carros values('Ford','KA',2008,'prata');
insert into carros values('Fiat','Punto',2008,'branco');
insert into carros values('Fiat','Uno',2007,'preto');
insert into carros values('Fiat','Stilo',200,'4prata');
insert into carros values('Fiat','Uno',2005,'prata');
insert into carros values('Fiat','Stilo',2008,'verde');
insert into carros values('Fiat','Uno',2009,'branco');
insert into carros values('Peugeot','207',2010,'prata');
insert into carros values('Peugeot','207',2010,'prata');
insert into carros values('Peugeot','207',2007,'azul');
insert into carros values('Chrysler','300 C',2008,'verde');
Vamos analisar como ficaram as duas tabelas:
select * from marcasselect * from carros
Perceba que temos 6 registros na tabela Marcas e 14 registros na tabela Carros. Agora com os dados inseridos, vamos aos exemplos de cross join, inner join, left join, right join e full outer join.
Cross Join
A junção cross join irá juntar todos os registros da tabela marcas com todos os registros da tabela carros, formando um produto cartesiano. Veja o exemplo abaixo:
select m.nome, c.modelofrom marcas as m cross join carros as c
Inner Join
A junção inner join irá juntar os registros da tabela marca que tiver um correspondente na tabela carros. Essa correspondência é feita pelos campos marca que está presente nas duas tabelas. Embora não esteja explícito, mas o campo marca seria a chave primária (na tabela marcas) e chave estrangeira (na tabela carros). Veja o exemplo:
select m.nome, c.modelofrom marcas as m inner join carros as c
on c.marca = m.marca
Apenas 10 registros satisfazem o inner join. Podemos dizer que 10 carros estão associados a alguma marca, enquanto que os demais não.
Left Join
O left join irá fazer a junção das duas tabelas “dando preferência” aos registros da tabela marcas. Assim, todos os registros da tabela marcas serão mostrados, independente de haver correspondência na tabela carros. Quando não houver correspondência na tabela carros, será mostrado o valor NULL ou nulo. Exemplo:
select m.nome, c.modelofrom marcas as m left join carros as c
on c.marca = m.marca
As marcas General Motors, Renault e Mercedes Bens não tem nenhum carro cadastrado, mesmo assim elas apareceram no resultado.
Right Join
A junção right join funciona de forma inversa ao left join. Aplica-se o mesmo conceito, porém, de forma invertida. Com o right join será mostrado todos os carros, mesmo aqueles que não estejam associados a nenhum registro da tabela marcas. Exemplo:
select m.nome, c.modelofrom marcas as m right join carros as c
on c.marca = m.marca
207 e 300 C são modelos que estão cadastrados em carros, mas não estão associados a nenhuma marca.
Full Outer Join
A junção full outer join seria o mesmo que left join e right join juntas, ou seja, ela irá mostrar todas as marcas e todos os carros, independente de existir valores correspondente na tabela oposta. Veja um exemplo:
select m.nome, c.modelofrom marcas as m full outer join carros as c
on c.marca = m.marca
Os exemplos mostrados foram feitos no SQL Server 2008 versão Express.
Veja também
- 10 itens sobre a barra de tarefas do Windows: Atalhos, ícones e mais
- 10 itens sobre as versões do Windows: da versão 3.1 ao Windows 11
- 20 dicas de segurança e privacidade no Facebook que você deve conhecer
- Consulta de processo trabalhista pela internet. Veja como fazer
- Curso Técnico em Hemoterapia. Senac e Fiocruz
- Cursos de graduação gratuitos: faculdades e universidades de São Paulo
- O que é o EJA - Educação de Jovens e Adultos. Antigo Supletivo?
- Estácio: terceira maior universidade EAD, segundo o MEC
- Grandes discursos: Martin Luther King, Steve Jobs, Charles Chaplin, outros
- Melhores faculdades de Administração, Economia em SP e no Brasil