Uma pequena introdução sobre o inner join em SQL

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:

  1. Sua sintaxe ser mais organizada e facíl de compreender;
  2. 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, CategoryNameDescription, 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!

Diego Cardoso

Mais artigos deste autor »

Atualmente trabalhando com C# + ASP.NET, cursando o ultimo ano de Sistemas de Informação pela UNIBAN. Nas horas vagas dedicando-se ao estudo de Java e PHP.


11 Comentários

Lucas
1

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 =

Diego Cardoso
2

@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!

Carlos Eduardo
3

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!

Diego Cardoso
4

@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!

Djeison
6

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?

Diego Cardoso
7

@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 !

Daniel Tibúrcio
8

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?

bradock
9

olá, eu particularmente nao gosto muito de usar WHERE
utilizo assim
INNER JOIN Product
ON
Category.CategoryID=Product.CategoryID &&
Product.UnitPrice > 200

Pesquisador de Inner JOIN
10

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. =)

Deixe seu comentário

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