Blogger templates

Comunidade java aberto - Participe da nossa comunidade no facebook (clique aqui)

Visitas

sexta-feira, 19 de outubro de 2012

SQL - Cross, Inner, Left, Right e Full Outer Join

,

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
Join: junção em SQL
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
Cross join

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
Inner join
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
left join
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
Right join
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
Full outer join
Fonte(luis)

2 comentários to “SQL - Cross, Inner, Left, Right e Full Outer Join”

  • 17 de dezembro de 2012 às 18:57
    Anônimo says:

    No caso do Inner Join, sempre devo linkar uma chave estrangeira em uma primária?

    delete
  • 18 de dezembro de 2012 às 07:04
    Anônimo says:

    Não necessariamente, você pode linkar qualquer campo, porém é usado as chaves primarias no link, porque retornarão somente um registro relacionado (é mais confiável por questão de integridade).

    Por exemplo

    Carros
    **********************
    id---descricao---motor
    1----Fiesta------1.0
    2----Gol---------1.0
    3----Fiesta------1.5

    Vendas
    ****************************
    id_venda--id--descricao_carro
    1---------1---Fiesta
    1---------2---Gol
    1---------3---Fiesta

    SELECT v.id_venda,
    c.id AS id_carro
    FROM Vendas v
    INNER JOIN carros c
    ON c.descricao_carro = v.descricao
    WHERE v.id = 1
    ORDER BY c.decricao ASC

    Resultado:

    id_venda----id_carro
    1-----------1
    1-----------3
    1-----------2

    delete

Postar um comentário

Insira seu comentário

 

Java Aberto Copyright © 2011 -- Template created by O Pregador -- Powered by Blogger