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

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 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.




Veja também:





// Comentários

NEI // Osasco_SP // 11/06/2008 11:16:00

Parabéns pelo tutorial feito passo-a-passo, ele é bem esclarecedor muuito melhor que a explicação da Profº de BD da faculdade ,sanou minhas dúvidas.

luis.blog.br // Limeira/SP // 14/06/2008 01:25:00

Nei,

Obrigado pelo comentário. De fato left join, innner join e etc sempre geram confusão, mas na prática é bem tranquilo e útil.

Entender joins sempre exemplificar bem é complicado. Sou professor de SQL e sei disso.

Abs, Luis

Márcio // Londrina // 23/06/2008 09:47:00

Bastante clara e objetiva a explicação.

Abraço

Philipe // Belém // 31/08/2008 11:51:00

A melhor explicação de join e left join que eu já vi. Esse seu exemplo simples é perfeito. E olha que só acompanhei lendo, não pratiquei os exemplos.

Parabéns finalmente entendi a diferença.

Gabriel // Caxias do Sul/RS // 02/09/2008 16:01:00

Ótimo tutorial! parabens! muito facil e simples de intender, simplesmente uma das melhores explicações de left join que ja li! parabens mais uma vez!

Felipe // São Paulo // 07/10/2008 11:42:00

Cara..só não entendo uma coisa... por que você usa as letras P e E antes dos nomes das colunas?

Isso é algum padrão, ou pode ser qualquer letra? E pra que serve isso?

Aguardo, abraço!

fkmonteiro@yahoo.com.br

luis.blog.br // Limeira/SP // 08/10/2008 13:11:00

Felipe, o P, E e D são as iniciais de Pagamentos, Empregados e Descontos.

Ao invés de colocar pagamento.valor eu abreviei para p.valor. Isto é necessário para evitar confusão com duas colunas com o mesmo nome em tabelas diferentes. Como por exemplo codigo_empregado.

William Ferreira Souza // São Paulo // 16/10/2008 09:52:00

Gostei do exemplo, muito prático e simples

Valdinei Silva // Boa Vista - RR // 20/10/2008 15:00:00

Simples e objetivo. Confesso que fazia parte do grupo daqueles que sempre confundiam a utilização dos comandos. Parabéns e obrigado.

Francis // Vitória // 24/10/2008 02:20:00

Obrigado Luís por disponibilizar à todos nós que precisamos destes conhecimentos bem esclarecidos neste blog, espero em particular ,sempre poder continuar encontrando neste blog, novos ensinamentos sobre sql.Deus o abençoe!

Anderson // São Paulo // 01/11/2008 14:44:00

Olá. Gostaria de saber qual o nome desse programa que você usou para testar as querys.

Obrigado

luis.blog.br // Limeira/SP // 24/11/2008 11:12:00

Anderson:

Eu usei o Management Studio Express do SQL Server.

Veja em: http://www.luis.blog.br/instalando-o-sql-server-express.aspx

Bruno // São Paulo // 26/11/2008 11:01:00

Muito bom, além de bem ilustrado, obrigado pela contribuição de conhecimento.

klaus // pindamonhangaba // 04/12/2008 07:42:00

muito bom adorei este tutorial foi mto util

Marcia // Cascavel // 10/12/2008 08:01:00

Mto util e bem claro... Valeu tem ajudado bastante.

Abraço t+

Analistati // São Gabriel da Palha // 11/02/2009 16:06:00

Obrigado pelas informações, foram bm úteis para sanar minhas dúvidas.

analistati.com

Ricardo // Amparo/SP // 20/03/2009 09:16:00

Mando bem cara, muito bem explicado, aprendi mais nesse artigo do q em meses na facul....vlws pela ajuda!

William // niteroi // 27/04/2009 08:48:00

Muito boa a explicação gostaria de saber qual junção usuária se fosse um caso de tabela 1 fosse lista de clientes e tabela 2 lista de telefones de clientes e eu quisesse que na consulta so retornasse um telefone al invés de todos os telefones dos clientes.

Ex.: cliente tel

aaa 22222222

aaa 11111111

bbb 33333333

ficasse assim.

aaa 22222222

bbb 33333333

Leandro Morelato // Limeira // 11/05/2009 11:52:00

Parabéns! Sensacional!!! =)

Floriwma // santo amaro // 22/05/2009 11:38:00

Adorei, foi simples, claro e objetivo.

Adriano // Boa Esperança -Pr // 22/05/2009 20:49:00

Muitoo Bomm estava com umas duvidas akii e graças a esse artigoo ta tudo resolvidoo.. Vlw mesmo

=D

Everaldo Torres // Feira de Santana - BA // 31/05/2009 12:31:00

Excelente ter pessoas que se capacitam e ajudam com informações que são adquiridos na pratica e que em certos cursos a isto faz vista grossa e não detalha o assunto neste quesito, Parabens

Grazi // PB - Pr // 08/06/2009 17:16:00

Oi!

Muito bom os exemplos, como ficaria com 4 tabelas?

AURI JUNIOR // TUCURUI-PA // 21/06/2009 07:14:00

Prezado,

Sinceramente você tem uma excelente DIDÁTICA, parabéns mesmo. Ajudou a gerar uma nova expressão apartir do conteudo.

Jacson Nonato // São Paulo // 24/06/2009 16:27:00

Opa beleza.!!?

Gostei muito da explicacao,, clara e objetiva.

Me ajudou bastante. Valleu.

Natalia // Belo Horizonte // 08/07/2009 00:42:00

Seu tutorial ficou perfeito, consegui finalmente retirar todas as minhas duvidas sobre joins e insert.

Parabens

marcos // brasília // 15/07/2009 10:48:00

qual a diferença entre LEFT OUTER JOIN PARA LEFT JOIN

Vander // POA // 27/07/2009 14:58:00

Parebéns,

muito bom o exemplo!

[ ]

adriano galvao serafim // tres coraçoes // 23/08/2009 20:14:00

eu tenho um programa de contas a pagar que busca o nome do fornecedor porem na hora de salvar ele salva somente o codigo e isso para o usuario do programa e complicado na hora de listar o nome do fornecedor em uma dbgrid. gostaria de saber como faço para que salve o nome e nao o codigo.

André Araújo // Martinho Campos // 24/08/2009 14:09:00

Objetivo e direto ao ponto...

Mto obrigado, ajudou pakas...

Mateus // Maringá // 01/10/2009 15:36:00

Obrigado me ajudou.

thiago // petropolis // 15/10/2009 16:29:00

Show de bola o tutu quebro um galho pra mim vlw msm

Cezar Lopes // Estância Velha // 26/10/2009 18:11:00

Muito bom. Didático. Parabéns.

Luciano Basso Buzzacaro // Curitiba - PR // 16/11/2009 06:35:00

Parabéns, excelente! Rápido e objetivo.

Joao // SAO PAULO // 25/11/2009 13:42:00

Luis uma dúvida no Oracle Database Express Edition não funciona esses comando de select para fazer o inner join? eu consegui criar as tabelas com sucesso porém quando tento fazer o select abaixo da erro.

select e.nome, p.valor as pagamento

from empregados as e INNER JOIN pagamentos as p

ON e.codigo_empregado = p.codigo_empregado

Júlio // Belo Horizonte // 28/11/2009 20:33:00

Oi pessoal, é uma coisa bem simples mas estou tendo algumas dúvidas... Tenho 3 tabelas: USUARIOS, CIDADES e ESTADOS, sendo que a tabela USUARIOS tem id_usuario,nome_usuario,id_cidade,id_estado. Em id_estado o dado é do tipo numérico num. Teria como eu fazer aparecer o nome do estado ao invés de parecer o número? Porque na tabela ESTADOS tem id_estado, sigla_estado e nome_estado. Como eu realizo um recordset ou consulta que faça aparecer o nome do estado? Eu conseguindo fazer isso, naturalmente eu saberia como fazer com cidade. Estou levando uma surra aqui do sql rsrs... Alguém pode me ajudar? Obrigado, parabéns pelo site!

Ricardo // São Caetano do Sul // 10/12/2009 15:59:00

Se todas as explicações fossem assim, eu seria um sábio !!! rsss

Quando eu for professor em Universidade quero explicar assim. Entendi de primeira...

Obrigado plea ajuda !!!

Diego // Porto Alegre // 19/02/2010 10:14:00

Parabéns pela didática utilizada!

Muito esclarecedor!!

Obrigado!!

Renato Cunha // Jandira // 26/05/2010 13:15:00

Cara, salvou minha pele. Você é muito fera, além disso tem boa didática. Seu texto e exemplos são de facil entendimento. Muito obrigado.

Um abraço e continua assim. Pessoas como você só tem a ganhar na vida.

Abração.

Allan Massahud de Carvalho // Contagem - MG // 24/06/2010 18:05:00

Show de Bola fio ! Foi de muita serventia pra mim ! VLWWWW

joel marroquim // sofala // 29/06/2010 07:55:00

foi gudji a ideia

mas tambem deu pa notar que fazendo full outer join nao tem diferenca com inner join xD

peace!!!!!!!

accoplero // // 29/06/2010 15:07:00

Very similar.

maria // jf // 26/08/2010 16:30:00

OTIMOOO!PARABENS!

Fábio Roseno // Fortaleza // 31/08/2010 04:08:00

Realmente está magnifico.

Rodrigo Lamar // Belo Horizonte // 08/10/2010 10:49:00

Simples, rápido e objetivo. Entendi em segundos coisa que já tentaram me explicar várias vezes!

Parabens!

Daniel Alves // são paulo // 12/10/2010 19:04:00

Muito boa a eplicação....

Anderson Vieira // sao paulo // 16/10/2010 14:54:00

A forma exemplificada esta perfeita e ajuda principalmente os iniciantes em SQL.

Parabens!

Igor // Bh // 11/11/2010 10:29:00

Entendiiii d+++!!! Vlw....

Mas e o Right?????

Geraldo // Francisco Morato SP // 17/11/2010 13:27:00

Pessoal, este blog é D +.

Mas gostaria de saber se existe uma maneira de fazer uma consulta em SQL onde ao final da coluna, apareça o total?

Estudante da Unisantanna // São Paulo/SP // 21/11/2010 19:47:00

Luis, muito boa a sua explicação... Estou no segundo semestre de redes de computadores, e na minha faculdade temos aulas de SQL com um professor arrogante, muito ruim de didática, e que parece ter um ovo na boca, resumindo, ninguem assimila nada do que ele tenta explicar.

Amanha tenho prova de SQL, e encontrei o seu blog. Me ajudou muito este esclarecimento de INNER JOIN implementando a exibição de outro nome na coluna da tabela.

Resolveu o meu problema. parabéns pela iniciativa e por sua ótima comunicação escrita.

Forte abraço.

claudineia // tupã // 21/11/2010 23:07:00

gostei muito das esplicações me ajudou nas duvidas

Oscar Eugenio Nabinger // NITERÓI // 03/12/2010 12:15:00

Prezado Luís,

Parabéns pelo conteúdo. Tenho uma duvida sôbre a seguinte situação:

Select a.cod_empresa,

a.num_ordem,

a.num_pedido,

b.num_pedido

from ordens_fabric a left join pedidos b

on (a.num_pedido = b.num_pedido)

where a.cod_empresa = b.cod_empresa

(eu agora preciso selecionar apenas os registros da tabela pedidos que pertençam a mesma empresa da tabela ordens_fabric).

Esta construção acima estaria correta?

Muito obrigado pelo retôrno.

Marcos // Rio Verde - GO // 27/12/2010 18:02:00

Parabéns. Em dois minutos li seu tutorial e consegui a consulta que eu queria utilizando inner e left join.

Obrigado.

André Luiz Murta Borges // bh // 20/01/2011 12:46:00

obrigado muito bom, precisava relembrar alguns detalhes !!! obrigado feliz 2011

Vinicius // Santos // 01/02/2011 00:21:00

Fantástico... é isso que nós iniciantes precisamos... exemplos assim arroz com feijão... obrigado!!

Márcio // São Paulo // 09/02/2011 00:20:00

Parabéns pelo ótimo tutorial, simples, direto e muito bem explicado, entendi muito bem parabéns!

Marcos Freitas // São Paulo // 14/04/2011 15:57:00

Parabéns!! Excelente tutorial, me ajudou muito!!

Victor // santa luzia // 20/04/2011 12:33:00

Muito grato pela excelente explicação. Meus parabéns sua didática é muito eficaz. . . .

Felipe Ferreira Campos // São Paulo // 09/08/2011 23:01:00

Oi Luis muito obrigado pelo informação do curso tecnico em informatica para internet eu vou começar a cursar dia 15 de agosto de 2011 eu so queria saber pra quer ilustrator nesse curso o flash o fireworks e o dreamweaver e photoshop já não é necessario abraçosss Felipe

Gilson // Posse-Go // 02/11/2011 22:23:00

Tenho uma tabela MOTOCICLETAS e outra CORRIDAS, como faço para filtrar e mostrar em um DBLOOKCOMBOBOX o resultado de uma consulta mostrando apenas as motocicletas com Situação ATIVO na tabela MOTOCICLETAS e Status diferente de ANDAMENTO na tabela CORRIDAS?????

Victor // Rio de Janeiro // 29/06/2012 16:06:00

A abreviação das tabelas e capos em apelidos como: e,s,a torna muito confuso o comando SQL e difícil acompanhar o raciocínio do INNER JOIN, de qualquer forma é um dos melores artigos sobre o tema.d

fd

df

fd

Handel M. Lopes // Goiânia // 22/11/2012 13:59:00

Fantástico ! Parabéns ! Continue nos abençoando com esses tutoriais !

Lisiane Morais // Porto Alegre // 11/02/2014 08:45:00

Excelente explicação, me ajudou muito a entender melhor as diferenças entre LEFT JOIN e INNER JOIN! Obrigada!





 

2007-2012   //   Blog do Luis   //   Política de Privacidade   //   Eu creio em Deus