domingo, 26 de agosto de 2012

Um Pouco Sobre Joins


Olá pessoal, espero que estejam todos bem.

Hoje vou atender a um pedido de um colega que confessou não ter entendido como funciona um Join.
Primeiramente devo mencionar que a teoria de banco de dados é, em grande parte, retirada da teoria de conjuntos matemáticos. Um join (junção) é utilizado na consulta de tabelas em conjunto, serve para que possamos fazer consultas comparativas entre tabelas relacionadas.

Certo, então como funciona um Join?

Fazemos isso todos os dias e se tornou tão natural para nós q não paramos mais para pensar em com é 
feito.
Se tivermos três conjuntos numéricos, “Números de 1 a 10”, “Números pares” e “Números impares” e eu quiser saber quais são os números pares, podemos fazer um Join.


Funcionará da seguinte forma. Verificaremos quais números estão no conjunto dos pares e em seguida compararemos esses números para ver quais se encontram na tabela dos números de 1 a 10.


Desta forma através de comparação entre os conjuntos chegamos a um resultado que não é nem a 1ª e nem a 2ª tabela, mas sim uma nova tabela temporária para nossa pesquisa.
Imaginemos agora que não são conjuntos e sim tabelas e que elas não possuem apenas um dado, mas sim PKs e Fks, digamos que é temos três tabelas:
Funcionários {Cod_Func(PK), Nome, Telefone}
Gerentes{Cod_Func(PK e FK), Cod_Departamento(FK)}
Departamentos{Cod_Departamento(PK), Nome}


Então quero saber o nome e o número de telefone dos funcionários que são gerentes e somente destes. Na tabela funcionários não há essa indicação e na tabela de gerentes não tenho o nome nem número de telefone. Nesse caso devo fazer um join que me gerará uma tabela temporária com essa informação.
Então seleciono os nomes e telefones da tabela funcionário onde o código de funcionário da tabela funcionário seja igual ao código de funcionário da tabela gerentes.
Em SQL:

 select FUNCIONARIOS.NOME, FUNCIONARIOS.TELEFONE
from FUNCIONARIOS, GERENTES
where FUNCIONARIOS.COD_FUNC=GERENTES.COD_FUNC;
O será gerado através da comparação entre os campos relacionados, e serão mostrados somente os campos pedidos na seleção.


Existem três tipos de Join:
·        Inner Join: Que trará somente os resultados que  atenderem as condições nas duas
tabelas.
select  FUNCIONARIOS .NOME, FUNCIONARIOS .TELEFONE
from FUNCIONARIOS inner join GERENTES
on FUNCIONARIOS.COD_FUNC=GERENTES.COD_FUNC;
O resultado desta pesquisa será igual ao do join simples.


·        Right Join: Que irá trazer como resposta todos os resultados da tabela da direita, mesmo que não atendam a ou as condições informadas e mais os dados que atenderem as condições e estiverem na tabela da esquerda.
select FUNCIONARIOS.NOME, FUNCIONARIOS.TELEFONE
from FUNCIONARIOS right join GERENTES
on FUNCIONARIOS.COD_FUNC=GERENTES.COD_FUNC;


·        Left Join: Que irá trazer como resposta todos os resultados da tabela da esquerda, mesmo que não atendam a  ou as condições informadas  e mais os dados que atenderem essas condições e estiverem na tabela da direita.
select  GENRETES.COD_FUNCIONARIO, GENRETES.COD_DEPARTAMENTO
from FUNCIONARIOS left join GENRETES
on GENRETES.COD_FUNCIONARIO=FUNCIONARIOS.COD_FUNCIONARIO;


Repare que tanto em Rigth Join quanto em Left Join ocorre repetição de elementos da tabela para evitar isso devemos usar a clausula group by no final da sintaxe e assim agrupar os resultados.

Obrigado pela visita. Espero ter elucidado um pouco sobre o Join!
Até o próximo post.

Bibliografia: