JOINS - Uma introdução a JOINS em bancos de dados de forma didática

Tentei simplificar ao máximo os conceitos de JOINS em bancos de dados, tirei referências de alguns lugares da internet e posto o conhecimento para vocês, lembrando que o texto está aberto para retificações.

[ Hits: 19.084 ]

Por: §ShadowGreg§ em 18/11/2010


Introdução a JOINS - SQL



Caríssimos. Como sou fã de uma didática bem simples, estive pesquisando na Internet e encontrei no blog do Luis a melhor explicação possível para quem quer entender Joins (ou junção de tabelas, em bancos de dados).
  • Os códigos utilizados foram retirados do blog do Luis, efetivando o cunho didático do autor;
  • Alguns comentários / alterações / adaptações mais singelas são de minha autoria =)

Criação das tabelas para os testes: 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)
);

Populando as tabelas:

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',2004,'prata');
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');

Analisando os dados contidos nas duas tabelas através do query analizer:

select * from marcas;
select * from carros;

Analisando os joins:

1) CROSS JOIN

O Cross Join (ou Junção Cruzada) é conhecida também produto cartesiano de tabelas, por não haver uma condição de junção. Na prática a saída de um Cross Join é um resultado de todas as combinações possíveis do primeiro registro de uma tabela, com os demais registros da segunda tabela. Dá para deduzir que um Cross Join utilizando-se as duas tabelas acima, teremos o total de 84 linhas (6x14), pois seria:

1ª linha da tabela marca ... 1ª linha da tabela carros
1ª linha da tabela marca ... 2ª linha da tabela carros
...
6ª linha da tabela marca ... última linha da tabela carros

Um exemplo da query seria:

select m.nome, c.modelo from marcas m cross join carros c

* Quando escrevemos "marcas m" simplesmente estamos apelidando a tabela marcas como m, para ficar mais fácil de referenciar.

2) INNER JOIN

O Inner Join (ou junção interna) faz junção de tabelas baseando-se em uma condição de junção (ou ponto em comum). Em nosso caso o ponto em comum será o campo marca, que se faz presente tanto na tabela marca quanto na tabela carro.

* Note que aqui já possuímos a condição para a junção das tabelas, onde o campo c.marca será igual a m.marca.

3) LEFT JOIN (Também chamado de LEFT OUTER JOIN)

O Left Join (ou seja junção à esquerda) fará junção entre as tabelas dando preferência (privilegiando) os registros da tabela mais à esquerda do código, ou seja, à tabela marcas (em nosso exemplo abaixo). Assim, todos os registros da tabela marcas serão mostrados, independentemente de haver correspondência na tabelas carros ou não. Quando não houver correspondência na tabela carros, será mostrado o valor NULL ou nulo. Veremos o exemplo mais abaixo comparando com right join.

4) RIGHT JOIN (Também chamado de RIGHT OUTER JOIN)

O Right Join (ou seja junção à direita) fará junção entre as tabelas dando preferência (privilegiando) os registros da tabela mais à direita do código, ou seja, à tabela carros (em nosso exemplo abaixo). Assim, todos os registros da tabela carros serão mostrados, independentemente de haver correspondência na tabelas marcas ou não. Quando não houver correspondência na tabela marcas, será mostrado o valor NULL ou nulo. Veremos o exemplo abaixo.

Exemplos de left join e do right join:
Muitos autores dizem que a única diferença em se utilizar ou left/right join, somando com o "OUTER" é a maneira como se escreve o código. Quando o SGBD for rodar a query, se não houver o comando opcional "OUTER" no left/right join, o próprio inserirá o "OUTER" quando ocorrer a busca no banco de dados. Então:

LEFT JOIN = LEFT OUTER JOIN
RIGHT JOIN = RIGHT OUTER JOIN

5) LEFT EXCLUDING JOIN

Este join trará todos os registros da tabela à esquerda (marcas) que não correspondem com qualquer registro da tabela à direita (ou seja, as entradas que terão NULL ou nulos). Abaixo temos um comparativo do LEFT OUTER JOIN e o LEFT EXCLUDING JOIN.

6) RIGHT EXCLUDING JOIN

Este join trará todos os registros da tabela à direita (carros) que não correspondem com qualquer registro da tabela à esquerda (ou seja, as entradas que terão NULL ou nulos). Abaixo temos um comparativo do RIGHT OUTER JOIN e o RIGHT EXCLUDING JOIN.

**Note que é inserida a cláusula de exclusão com o where.

6) FULL JOIN (Também chamado de FULL OUTER JOIN)

O Full Outer Join (ou seja, junção externa completa) seria o mesmo que o left join + o right join juntos em um mesmo resultado. Em nosso exemplo seriam privilegiadas as tabelas à esquerda (marcas) e à direita (carros) ao mesmo tempo, e é claro para os registros que não haver correspondência, serão preenchidos com NULOS ou null. Segue um exemplo abaixo:
Muitos autores dizem que a única diferença em se utilizar ou full join, somando com o "OUTER", é a maneira como se escreve o código. Quando o SGBD for rodar a query, se não houver o comando opcional "OUTER" no full join, o próprio inserirá o "OUTER" quando ocorrer a busca no banco de dados. Então:

FULL JOIN = FULL OUTER JOIN

7) OUTER EXCLUDING JOIN

O OUTER EXCLUDING JOIN retornará todos os registros da tabela à esquerda e todos os registros da tabela da direita que não tenham correspondentes, ou seja, nulos ou NULL.
Note que é inserida a cláusula de exclusão com o where.

Retirado da Internet também, que foi encontrado em:
A imagem que resume tudo o que foi mostrado aqui, pois como dizem: "Uma imagem vale mais que mil palavras". Fiz algumas adaptações é claro:
DICA: Não fique só na teoria e vá para a prática, crie uma base de dados, as tabelas, faça os inserts, os selects e veja você mesmo o que acontece.

No mais é isso, espero que seja de bom proveito e como diria meu amigo Welton Hebert: "É ensinando aos outros que se aprende mais".

Fica aberto para correções também.

Um abraço.
Att.

Referências bibliográficas:
   

Páginas do artigo
   1. Introdução a JOINS - SQL
Outros artigos deste autor

Configurando a internet e compartilhando a rede local, com o Kurumin 6 (IPs estáticos)

Leitura recomendada

Sphinx Search: Free open-source SQL full-text search engine (Parte 1 - Instalação)

Elasticsearch na saúde

Administrar um servidor MS SQL pelo Linux

Instalando o Interbase 7.5 no Debian Sarge

Instalando o Caché (banco de dados pós-relacional)

  
Comentários
[1] Comentário enviado por f_Candido em 18/11/2010 - 16:47h

Parabéns, um bom artigo!!

[2] Comentário enviado por giaco em 18/11/2010 - 16:57h

Parabéns! Bem explicado.

[3] Comentário enviado por vpteruel em 18/11/2010 - 17:27h

Mandou bem amigo. Valeu pela contribuição.

[4] Comentário enviado por everton_fuzz em 18/11/2010 - 19:57h

Bacana mesmo, quando estava querbrando a cabeça, deixei esta imagem (a ogirinal) no meu desktop....hehhe, funcionou!
Parabens pelo artigo...

[5] Comentário enviado por julianogpc em 20/11/2010 - 16:03h

Parabéns pela inciativa, só me tira uma dúvida no MySQL como ficaria assim o full outer join?

Utilizei a união de um left join com um rigth join, porém o resultado foi um pouco diferente, segue a query abaixo:

(select m.nome, c.modelo from marcas as m left join carros as c on m.marca = c.marca) UNION ALL (select m.nome, c.modelo from marcas as m right join carros as c on m.marca = c.marca where);

[6] Comentário enviado por gregcarleto em 29/11/2010 - 15:03h

Boa tarde JulianoQPC

Pelo que andei lendo, no mysql existem duas maneiras de se fazer o full outer join. Como o tempo é curto adaptei o primeiro trecho, espero que você teste, se quiser saber mais consulte a fonte: http://www.xaprb.com/blog/2006/05/26/how-to-write-full-outer-join-in-mysql/

1) Com 2 joins e um UNION ou seja:

select m.nome,
c.modelo
from marcas as m
left outer join carros as c on m.marca = c.marca
union
select m.nome,
c.modelo
from marcas as m
right outer join carros as c on m.marca = c.marca

2) Com um UNION ALL e um Excluding Join
3) Com uma tabela MUTEX


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts