Olá galera,
Recentemente fiquei pensando em um artigo que fosse útil e, acompanhando as aulas da faculdade, percebi as dificuldades do pessoal em assimilar o conceito sobre do Inner Join em banco de dados.
O Inner Join tem como objetivo aglutinar duas ou mais tabelas mediante atributos comuns que estão presentes nas mesmas, onde para realizarmos esta junção, utilizamos as chaves primárias / estrangeiras.
Dentre as vantagens de se utilizar o Inner Join, podemos considerar:
- Sua sintaxe ser mais organizada e facíl de compreender;
- Facilidade para se achar o melhor plano de ação para realizar consultas.
Sintaxe:
select <campos> from <tabela 1> inner join <tabela 2> on <campo tabela 1> = <campo tabela 2>
Para facilitar o entendimento, vamos utilizar um modelo do Northwind para exemplificar alguns casos:
No modelo acima, vamos supor em fazer uma junção da tabela Category com a Product, para retornar no resultado alguns campos como CategoryID, CategoryName, Description, ProductID, ProductName e UnitPrice, onde para realizar a junção da tabela vamos utilizar a chave primária CategoryID da tabela Category com a chave estrangeira CategoryID da tabela Product.
Podemos montar o join de duas maneiras e ambas retornarão o mesmo resultado, mas acredito que o primeiro as vezes seja até o melhor a ser utilizado para auxiliar no entendimento de views grandes e complexas.
Bem vamos lá:
select Category.CategoryID,Category.CategoryName,Category.Description, Product.ProductID,Product.ProductName,Product.UnitPrice from Category inner join Product on (Category.CategoryID = Product.CategoryID)
Ou
select c.CategoryID, c.CategoryName, c.Description, p.ProductID, p.ProductName, p.UnitPrice from Category c inner join Product p on (c.CategoryID = p.CategoryID)
A diferença das duas queries que montei acima é que na primeira utilizamos o nome da tabela seguido do ponto mais o campo desejado e no segundo exemplo eu utilizei um álias que coloquei logo após as tabelas.
Complementando estas queries, podemos acrescentar a cláusula where no final para realizar uma filtragem dos registros que vão ser retornados da base de dados, onde no exemplo abaixo apenas vou retornar os registos que o preço unitário for maior do que 200.
select Category.CategoryID,Category.CategoryName,Category.Description, Product.ProductID,Product.ProductName,Product.UnitPrice from Category inner join Product on (Category.CategoryID = Product.CategoryID) where Product.UnitPrice > 200
Bem galera, espero que o artigo seja realmente útil 🙂
Se alguém tiver algo a complementar, deixe seu comentário!
Um grande abraço a todos!
11 Comentários
Importante no inner join é saber a diferença pro outer join e também que diferenças teriam se o inner join fosse da tabela 2 para tabela 1 e não da 1 para a 2. E também que diferença teria se não fosse feito nada disso e ficasse só no select from , where =
@Lucas,
Realmente o ponto principal da questão é o outer join, mas desenvolvi esse artigo com base nas experiências que obtive no ano passado em sala de aula, observando as dificuldades que alguns colegas de sala demonstravam sobre o assunto. Acredito que seja essencial entender o funcionamento do inner join primeiro para depois partir para o outer join.
Quanto a ordem das tabelas no inner join não importa, devido a utilização da chave primária e estrangeira, porque elas que vão ser responsáveis pela junção das tabelas, o máximo que pode mudar é a ordem de exibição das colunas das mesmas, se você não informar quais os campos que gostaria de obter o retorno na query.
E a diferença em relação a só a utilização do where, é que o inner join possui uma sintaxe mais organizada e fácil de compreender do que você ficar realizando as vezes vários selects dentro de selects ou o famoso “select interno”.
Para o próximo artigo, vou argumentar sobre a utilização do outer join.
Obrigado pelo comentário,
Abraços!
Uma outra questão no caso de estar usando Orientação a objetos, caso tenha minhas querys em classes. Por exemplo DAOprofessor e DAOaluno e eu resolvesse unir essas duas tabelas, como eu poderia fazer isso? Criar um terceira classe para fazer a junção, profissionalmente qual a melhor forma de fazer isso?
Parabéns pelo artigo, muito bom!
@CarlosEduardo
Obrigado pelo comentário, não sei se é a melhor maneira profissionalmente para se fazer isso, mas eu particularmente trabalho com a construção de view´s para realizar os joins e filtrar quais as colunas que desejo q sejam exibidas para determinada função.
Agora se você deseja apenas realizar filtragem de alguns dados, o ideal seria a construção de métodos genéricos, onde você possa passar parâmetros para a montagem destas query´s (ex: determinar quantos alunos são respectivos a professor ” x “, utilize a DAO Alunos).
Abraços!
Galera, apenas complementando …
Existe um excelente artigo da Paulinha Winter sobre outer joins, o link está inserido no meu artigo, mas mesmo assim estou postando aqui também:
http://www.profissionaisti.com.br/2009/06/entendendo-outer-joins-sql-parte-1-produto-cartesiano/
Abraços a todos !!
Excelente post Diego, só queria destacar uma dúvida, é verdade que a utilização de Alias no Select melhora a performance da Consulta no Banco?
@Djeison
Obrigado pelo comentário, sinceramente não conheço e não lembro de ter lido algum artigo que falasse a respeito disso, mas acredito que não acrescente diferença de performance.
De qualquer maneira, se eu descobrir alguma coisa posteriormente, volto a postar a resposta aqui.
Abraços !
Preciso de uma tabela juntando duas outras, sendo que uma é um cadastro de códigos e outra das ocorrências destes códigos em uma determinada condição. Só que preciso de uma tabela contendo todos os códigos, mesmo os códigos que não existam na segunda tabela. O que me sugerem?
olá, eu particularmente nao gosto muito de usar WHERE
utilizo assim
INNER JOIN Product
ON
Category.CategoryID=Product.CategoryID &&
Product.UnitPrice > 200
Muito obrigado pela explicação meu jovem, me ajudou muito, assim como deve ter ajudado muitos outros, são de pessoas assim que o mundo precisa. Agradeço de coração, belo trabalho.
Valeu e fica com Deus. =)
Muito bom, bem explicado.
me fez entender, oq a faculdade nao fez em 1 ano HAHA