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: