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);
4 Comentários
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.
Oi Silas,
Obrigada. Sem dúvida é fundamental, uma query mal montada pode derrubar o banco!!
Abraços
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
Olá, parabéns pelo post. Só queria fazer uma observação e dúvida. Sempre usei os operadores *= e =* para left outer join e right outer join, mas ao instalar o sql 2012 simplesmente estes operadores não funcionam. Consegui utilizar =+ para right outer join mas para left outer join não deu certo. Alguém saberia me informar o que mudou referente a estes operadores no sql 2012?
Valeu.
Meu e-mail: [email protected]