SQL – Entendendo JOINS

Primeiramente vamos a uma:

Uma breve explicação sobre Inner, Left, Right, Outer/Full e Cross Join

Vamos tomar por base estas duas tabelas:

Usando ambas em todos os exemplos, vamos ilustrar os tipos mais comuns de join.

Inner Join

Esse é um formato comum de join, que retorna dados apenas quando as duas tabelas tem chaves correspondentes na cláusula ON do join.

Query:

SELECT TabelaA.*, TabelaB.* FROM TabelaA INNER JOIN TabelaB ON TabelaA.Chave = TabelaB.Chave

Resultado:

Inner join faz uma junção entre duas tabelas A e B onde a projeção serão todos os elementos de A que estão em B.

Ex.: Quero todos os clientes de um banco e suas determinadas agencias:

select * from Clientes inner join Agencias on Cliente.idAgencia = Agencias.idAgencia

Um outer join pode ser Left, Rigth e Center (ou Cross).

Um left join faz uma junção entre A e B onde a projeção serão todos os elementos de A, independente se estão ou não em B.

Ex.: Quero todos os clientes do banco e a quantidade de movimentaçãoes efetuadas em abril de 2013:

select nomeCliente, count(idMovimentacao) from Clientes left outer join Movimentacoes on Clientes.idCliente = Movimentacoes.idCliente where Movimentacao.dtCompetencia = ’04/2013′

Na query acima nós utilizamos o left join para que todos os clientes sejam impressos, mesmo que não tenham feito nenhuma movimentação.

O Rigth join é equivalente ao left join, mas com a ordem trocada.

O Center (Ou Cross) join cruza os dados de A e B, ou seja, imprime todos os elementos de A e os de B, independente de um estar ligado ao outro.

Ex.: Quero imprimir uma relação de Resutados de Analise Quimica de um determinado elemento e a data da analise.

select * from ResultadosAnalisesQuimicasElementos center join DatasAnalises on AnaliseQuimica.idAnalise = DatasAnalises.idAnalise

A consulta acima irá imprimir todas as datas de analise juntamente com o resultado da analise quimica caso exista alguma analise associada à data em questão e Todas as analises juntamente com a data da analise em questão. Também serão impressas todas as datas em que não ocorreram analises e todos os elementos cujo não foram feitas nenhuma analise.

Left Join

É um dos formatos mais usados de join, que retorna a Tabela A inteira e apenas os registros que coincidirem com a igualdade do join na TabelaB (ou campos nulos para os campos sem correspondência).

Query:

SELECT TabelaA., TabelaB. FROM TabelaA LEFT JOIN TabelaB ON TabelaA.Chave = TabelaB.Chave

Resultado:

Right Join

Segue o mesmo raciocínio do Left Join, mas se aplicando à tabela B em vez da A:

Query:

SELECT TabelaA., TabelaB. FROM TabelaA RIGHT JOIN TabelaB ON TabelaA.Chave = TabelaB.Chave

Resultado:

Full Outer Join

Conhecida como OUTER JOIN ou simplesmente FULL JOIN, este retorna todos os registros de ambas as tabelas.

Query:

SELECT TabelaA., TabelaB. FROM TabelaA FULL OUTER JOIN TabelaB ON TabelaA.Chave = TabelaB.Chave

Resultado:

Cross Join

Basicamente é o produto cartesiano entre as duas tabelas. Para cada linha de TabelaA, são retornadas todas as linhas de TabelaB.

É mais fácil entender o Cross Join como um “Join sem cláusula ON”, ou seja, todas as combinações de linhas de A e B são devolvidas.

Inclusive, se você fizer um Cross Join com cláusla ON, ele “vira” um mero Inner Join.

Query:

SELECT TabelaA., TabelaB. FROM TabelaA CROSS JOIN TabelaB

Ou ainda:

SELECT TabelaA., TabelaB. FROM TabelaA, TabelaB

Resultado:

Notar que todos os campos pedidos no select sempre retornam (desde que existam na tabela, obviamente), independente de existirem para aquela linha específica.

O que acontece no caso de uma linha ser retornada para apenas uma das tabelas é que os campos da outra vêm com conteúdo null.

Usualmente, caso você precise diferenciar um nulo que realmente exista na tabela de um nulo por falta de correspondência, basta ver se os campos usados na condição do ON não retornaram null também.

Uma tabela mais interessante e explicativa

Espero que esta pequena explicação seja bastante útil. 

Ramos de Souza Janones

Janones, é um empreendedor brasileiro apaixonado por empreendedorismo e tecnologia. Ao longo dos anos trabalhando com o desenvolvimento de softwares desktop desde a linguagem Clipper, passando pelo Delphi e atualmente com Java.

Optou pela formação de Publicidade e Marketing por sua segunda empresa de tecnologia ter participado do "boom" da internet nos anos 90 e na procura de melhorar seus conhecimentos em negócios.

Em razão da principal formação e profundos conhecimentos em programação e banco de dados, é capaz de realizar o desenvolvimento de aplicativos web, desktop e mobile com maior criatividade e inovação que profissionais de desenvolvimento com uma formação única e mais especifica, dedicada somente ao desenvolvimento de softwares.

Com toda sua experiência com empresas de software, sua formação e paixão por negócios escreveu o livro "Marketing para Empresas e Profissionais de Software", publicado pela editora carioca Ciência Moderna em 2012. Além de outros livros sobre programação.

Últimos posts por Ramos de Souza Janones (exibir todos)

Share this post

scroll to top