Entendendo Outer Joins SQL – Parte 2 (Conexões Internas – INNER JOIN)

Leia a Parte 1 desta série!

2 – Conexões Internas

A conexão interna inicialmente faz a mesma coisa que a conexão cruzada, porém aplica restrições que podem ser de igualdade ou desigualdade, isso faz com que algumas linhas sejam eliminadas do resultado.

Vamos lá então, quem faz parte das conexões internas? INNER JOIN, NATURAL JOIN e STRAIGHT_JOIN.

Obs.: O modelo de dados utilizado neste post encontra-se em Entendendo Outer Joins SQL – Parte 1 (Produto Cartesiano)

Digamos que eu necessite fazer uma busca de todos os programadores e suas respectivas empresas, como resolvo?

SELECT * FROM programadores p INNER JOIN empresas e ON e.id_empresa = p.id_empresa;

Na consulta acima, fiz uma junção entre as duas tabelas que guardam as informações que preciso e fiz uma restrição (ON) comparando a chave da empresa existente nas duas tabelas.

A figura abaixo mostra o comportamento do banco, o qual relaciona cada linha de uma tabela com todos os registros da outra tabela, trazendo como resultado somente as linhas onde a chave da empresa é idêntica (linhas em vermelho).

Essa restrição (ON) não impede que eu utilize as outras opções da sintaxe do SELECT, por exemplo, o WHERE. Inclusive eu obteria o mesmo resultado com a consulta abaixo:

SELECT * FROM programadores p, empresas e WHERE e.id_empresa = p.id_empresa;

Vamos para uma segunda situação, na qual preciso de uma lista com todos os programadores que programam em pelo menos uma linguagem e saber quais são estas. Como mostra o modelo, temos um relacionamento n:m que originou a tabela programadores_linguagens, como resolvo?

SELECT p.nome, l.nome
FROM programadores p
INNER JOIN
programadores_linguagens pl
ON pl.id_programador = p.id_programador
INNER JOIN linguagens l
ON
l.id_linguagens = pl.id_linguagens;

Repare que os programadores Pinter e Gabriel não apareceram no resultado da consulta, isso porque ambos não estão relacionados à nenhuma linguagem de programação. Mas, e se fosse necessário a presença deles na listagem? Você resolveria utilizando conexões externas (item 3).

O NATURAL JOIN e o STRAIGHT_JOIN fazem exatamente a mesma coisa que o INNER JOIN em questão de resultado, porém, com suas particularidades:

NATURAL JOIN: com ele você não precisa identificar quais colunas serão comparadas, pois ele fará a comparação entre campos com mesmo nome.

SELECT * FROM programadores NATURAL JOIN empresas;

STRAIGHT_JOIN: faz com que a tabela a esquerda seja lida primeiro, isso é utilizado quando o otimizador do JOIN coloca as tabelas em ordem errada. Isto é muito pouco utilizado.

SELECT * FROM programadores p STRAIGHT_JOIN empresas e ON e.id_empresa = p.id_empresa;

Obs.:
1
Posso substituir o ON por USING quando o nome nas duas tabelas for idêntico.

Ex.: SELECT * FROM programadores p INNER JOIN empresas e USING(id_empresa);

2 – O uso do INNER é opcional.

Ex.: SELECT * FROM programadores p JOIN empresas e USING (id_empresa);

Continue lendo a série: Parte 3 ou Parte 1

Paulinha Winter

Mais artigos deste autor »

Analista de sistemas e desenvolvedora web. Formada em 2006 em Ciência da Computação e aluna da pós-graduação em Banco de Dados. Atualmente colaboradora da equipe de educação a distância por Internet (e-learning) do IEA, trabalha no desenvolvimento de sistemas e ferramentas voltadas ao EaD, comunidades e portais. Utilizando tecnologias como: PHP, MySQL, Cake, Webservices e metodologia Scrum. Blog: http://www.paulinhawinter.com


5 Comentários

Silas Lopes
1

Parabéns pelo post!!
Conhecer Sql queries é um requisito de qualquer programador e seu uso correto, facilita a programação e melhora o desempenho.
Vou acompanhar os outros artigos.

Jackson Caset
3

Complementando os comentários…já tive grandes problemas de performance de banco por não saber montar de forma adequada as consultas…pra ter uma ideia, até um ano (talvez dois) atrás não sabia utilizar joins. Depois que conheci fiquei pensando: “Pq não estudei isso antes, putz”…rsrs

Histórias da vida real de um PTI :)

Abraço

Deixe seu comentário

Seu endereço de e-mail não será publicado. Campos com * são obrigatórios!


3 − um =

Você pode usar estas tags e atributos de HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>