Join ou Junções SQL | Inner, left, right e full outer join
Home » Tecnologia
Tutorial passo-a-passo de join em SQL. Aprenda as diferenças entre as junções cross, inner, left, right e full outer join.
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 um post sobre o left join e inner join e pelo visto o pessoal gosto 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 marcas
select * 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.modelo
from 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.modelo
from 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.modelo
from 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.modelo
from 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 todos as marcas e todos os carros, independente de existir valores correspondente na tabela oposta. Veja um exemplo:
select m.nome, c.modelo
from 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.
Cadastre seu EMAIL e receba artigos no seu EMAIL
Participe do Simulado de HTML
Veja também:
Compartilhe com seus amigos:
// Comentários
Ricardo // S.B.Campo // 28/04/2010 11:40:00
Obrigado pela explicação ajudou muito
Anderson Silva // São Paulo // 30/04/2010 12:58:00
Parabens pela explicação...
Gustavo // RJ // 12/05/2010 09:45:00
José Júnior // Goiânia-GO // 31/05/2010 22:18:00
Muito bom, esclareceu todas Joins com uma explicação simples e prática.
Parabéns!
Hiram Pereira // Fort Lauderdale, Florida // 03/06/2010 23:38:00
You nailed it to the point. Very good!
Lucas Colferai // Coronel Vivida/PR // 04/06/2010 00:41:00
Parabéns, explorou muito bem o assunto e deu explicações muito claras.
Suéllen Meira // Campinas/SP // 06/06/2010 19:34:00
Ótima explicação! Entendi em meia hora o que não havia absorvido em um bimestre na facul..
Valeu!!
Alex Barbosa // Batatais / SP // 06/06/2010 21:25:00
Exemplo perfeito, parabéns pela didática.
www.alexbarbosa.wordpress.com
vinicius // bh // 09/06/2010 10:30:00
muito bom o conteudo ! parabens
Felipe Volpatto // Bento Gonçalves - RS // 16/06/2010 09:35:00
Parabéns pela explicação!
Tinha muitas dúvidas a respeito mas agora consegui resolve-las.
Muito obrigado mesmo!
Abraços.
Luis // SP // 11/08/2010 10:32:00
Luiz valeu, ficou muito claro com essa explicação
Muito Obrigado!
PABLO // // 01/09/2010 21:12:00
ÓTIMO POST, ME ESCLARECEU MUITO
MArcelo // Fortaleza CE // 07/09/2010 16:44:00
Muito bom....
Bem resumido e explicativo.
Estava com dificuldades de entender, ams ficou bem simples agora...
Arthur Ciurilli // São caetano do sul // 16/09/2010 11:27:00
Edu // Santo André // 09/10/2010 11:13:00
Bom exemplo de Full outer join.
Parabens pelo artigo e pela iniciativa.
Anderson Vieira // sao paulo // 16/10/2010 14:53:00
Boa garoto. Bela explicação desmistificando estes comandos JOINs da vida.
Parabéns!
Nathan // Jundiaí // 04/11/2010 11:51:00
A Explicação está excelente. Parabéns.
Valbert Leonel Leal // Campina Grande // 11/11/2010 21:38:00
Parabéns!!!
Desejo muito sucesso proffisional a vc!!!
Ramon // Goiania // 07/12/2010 00:22:00
Muito bom cara!!!
Me ajudou.
Tiago Leite // João Pessoa // 09/12/2010 12:09:00
Muito boa explicação. A melhor que encontrei na net. Já ta adicionado nos Favoritos do navegador. Continue postando e esclarecendo nossas dúvidas.
Abraço
thiago daditz // pouso alegre // 19/12/2010 15:44:00
muito obrigado pela explicação ajudou demais mesmo!!!!
Leandro S. // Campinas // 12/01/2011 01:15:00
Obrigado!
muito bem explicado, me ajudou bastante :)
Douglas A.B. // Campo Grande - MS // 04/04/2011 12:58:00
Obrigado, exemplo muito prático e funcional.
Anderson de Sousa Brasil // Estado: DF // 04/09/2011 17:41:00
Estou estudando para a Oracle 11g e até o momento estas direneças não estavam muito claras.Vlw.
sophos // florianópolis // 13/09/2011 16:01:00
Parabéns pelo explicativo, tirou minhas dúvidas sobre a utilização do Join. Abraços
IvanTchoo // Curitiba/ Pr // 27/09/2011 14:04:00
Cara a melhor explicação que eu já vi até hoje...Parabéns mesmo!continue postando excelente exemplos como este.Abço
Não achei interessante este campo pra deixar o comentário, 200 caracteres são muito, da quase pra escrever uma redação.
Caio Ferreiro // São Paulo // 05/10/2011 16:19:00
Parabéns pelo seu post, explicação muito boa que me ajudou a clarear essa questão que para mim ainda era confusa, certamente ajudará muitos!
Abraços obs: Essa validação de no mínimo 200 caracteres realmente não faz sentido!
Luiz // Manaus // 16/05/2012 09:22:00
Muito bom, obrigado por dedicar esse tempo a escrever o post. Muito simples as diferenças entre os joins, uma vez esclarecidas, e o post deixou claro de forma simples.
Continue o bom trabalho, assim você não apenas ajuda, mas também inspira nós profissionais a compartilharmos nossa experiência.