INNER JOIN é uma cláusula que permite a junção entre duas ou mais tabelas, desde que hajam entrelaçamento entre todas.

Visão geral

Essa cláusula trará em sua consulta os dados que são comuns às duas tabelas, conforme ilustra a Figura 1.

Selecionando todos os dados que são comuns as duas tabelas
Figura 1. Selecionando todos os dados que são comuns as duas tabelas

Para os exemplos a seguir considere a estrutura de tabelas abaixo, onde temos uma tabela chamada produto (Tabela 1), responsável por armazenar todos os produtos do estoque do cliente, a tabela categoria_produto (Tabela 2), responsável por armazenar todas as categorias existentes no banco de dados, e a tabela venda_produto (Tabela 3), que relaciona os produtos que foram vendidos.

id nome preco Id_categoria
1 Bola 35.00 1
2 Patinete 120.00 1
3 Carrinho 15.00 1
4 Skate 296.00 1
5 Notebook 3500.00 2
6 Monitor LG 19 450.00 2
7 O Diário de Anne Frank 45.00 3
8 O dia do Curinga 65.00 3
9 O mundo de Sofia 48.00 3
10 Através do Espelho 38.00 3
Tabela 1. Tabela produto
id nome
1 Infantil
2 Informatica
3 Educacional
Tabela 2. Tabela categoria_produto
id id_produto valor data
1 1 35.00 2018-05-15
2 1 35.00 2018-06-15
3 1 35.00 2018-07-15
4 2 120.00 2018-07-15
5 2 120.00 2018-07-14
6 3 15.00 2018-07-15
7 7 45.00 2018-07-15
8 8 65.00 2018-07-15
9 8 65.00 2018-07-16
10 9 48.00 2018-07-16
11 5 3500.00 2018-07-16
12 5 3500.00 2018-07-16
13 6 450.00 2018-07-16
Tabela 3. Tabela venda_produto

Sintaxe

SELECT
  [ tabela1.coluna1, tabela1.coluna2, ... | N.coluna1, N.coluna2, … ]
FROM
  [ tabela1 | tabela1 F ]
INNER JOIN 
  [ tabelaX | tabelaX N] 
ON 
  [ tabelaX.coluna1 = tabela1.coluna1 | N.coluna1 = F.coluna1 ]

Na prática

Exemplo 1

Para este exemplo, suponha que seja necessário trazer as informações de todos os produtos da tabela produto, e também trazer o nome da sua respectiva categoria no resultado. Para isso, podemos utilizar o trecho de código abaixo:

SELECT
    P.nome,
    P.preco,
    C.nome as Categoria
FROM 
    produto P
INNER JOIN 
  categoria_produto C
ON P.id_categoria = C.id

No trecho de código acima, nas linhas 1 a 4 selecionamos a coluna nome e a coluna preco da tabela produto, e em seguida, selecionamos a coluna categoria da tabela categoria.

Em seguida, nas linhas 5 e 6 definimos que a consulta será feita na tabela produto, nomeada de P, e em seguida, nas linhas 7 e 8 realizamos um INNER JOIN na tabela categoria_produto, nomeada de C, e logo na linha 9 informamos que a condição para a junção das duas tabelas é o ID da categoria ser o mesmo nas duas tabelas.

O resultado da query pode ser visto na Tabela 4.

nome preco categoria
Bola 35.00 infantil
Patinete 120.00 infantil
Carrinho 15.00 infantil
Skate 296.00 infantil
Notebook 3500.00 Informatica
Monitor LG 19 450.00 Informatica
O Diário de Anne Frank 45.00 Educacional
O dia do Curinga 65.00 Educacional
O mundo de Sofia 48.00 Educacional
Através do Espelho 38.00 Educacional
Tabela 4. Consulta de produtos com o nome das categorias

Exemplo 2

Neste exemplo adicionaremos mais um JOIN a essa tabela. Poderíamos incluir nessa consulta acima, o total de produtos que foram vendidos. Para isso, podemos utilizar a query abaixo:

SELECT
    P.nome,
    P.preco,
    C.nome as Categoria,
    COUNT(V.id_produto) TOTAL_VENDIDOS
FROM 
    produto P
INNER JOIN 
  categoria_produto C
ON P.id_categoria = C.id
INNER JOIN 
  venda_produto V
ON V.id_produto = P.id
GROUP BY P.id

No trecho de código acima, nas linhas 1 a 5 selecionamos a coluna nome e a coluna preco da tabela produto, selecionamos a coluna categoria da tabela categoria e, em seguida, selecionamos o total de ID_PRODUTO na tabela de venda_produto, nomeada de V.

Em seguida, nas linhas 6 e 7 definimos que a consulta será feita na tabela produto, nomeada de P, e em seguida, nas linhas 8 e 9 realizamos um INNER JOIN na tabela categoria_produto, nomeada de C, e logo na linha 10 informamos que a condição para a junção das duas tabelas é o ID da categoria ser o mesmo nas duas tabelas. Nas linha 11 e 12 adicionamos mais uma tabela, a tabela venda_produto, nomeada de V. Em seguida, na linha 13 informamos que essa tabela só será adicionada se o id do produto for o mesmo na tabela de produto e venda_produto. Por fim, agrupamos o resultado por produto, na linha 14.

O resultado da query pode ser visto na Tabela 5.

nome preco categoria TOTAL_VENDIDOS
Bola 35.00 infantil 3
Patinete 120.00 infantil 2
Carrinho 15.00 infantil 1
Notebook 3500.00 Informatica 2
Monitor LG 19 450.00 Informatica 1
O Diário de Anne Frank 45.00 Educacional 1
O dia do Curinga 65.00 Educacional 2
O mundo de Sofia 48.00 Educacional 1
Tabela 5. Listagem de produtos com o nome da categoria e total de vendidos

A palavra-chave INNER JOIN seleciona todas as linhas das duas tabelas, desde que haja correspondência entre as colunas. Se houver algum registro em uma das tabelas que não tenha correspondência na outra tabela, esses registros não serão exibidos.

Exemplo 3

Para o exemplo a seguir, considere a estrutura de tabelas abaixo, onde temos a tabela projeto (Tabela 6), responsável por manter todos os projetos da empresa, e a tabela comentario (Tabela 7), responsável por manter todos os comentários referentes aos projetos cadastrados no banco de dados.

ID Titulo Data
7 Criando uma aplicação com React 2018-04-10
8 API RestFUL com Lumen 2018-05-10
9 Consumindo uma API RestFUL com Laravel 2018-05-20
10 Documentação SQL 2018-05-21
Tabela 6. Estrutura da tabela projeto

ID Comentario Data id_projeto
1 Muito legal essa aplicação! Adorei usar o React 2018-04-10 7
2 React é muito simples! Curti o projeto! parabéns! 2018-05-10 7
3 Muito top! 2018-05-20 9
4 Parabéns aos envolvidos! 2018-05-20 9
5 Muito legal, sempre gostei do Laravel. 2018-05-20 9
6 Interessante a forma de recueprar as informações. Não sabia. Gostei! 2018-05-21 9
7 Consigo fazer o mesmo com CodeIgniter? 2018-05-22 9
8 React é apenas JavaScript, há uma API bem pequena para aprender, apenas algumas funções e como usá-las. Depois disso, suas habilidades em JavaScript serão o que te farão um melhor desenvolvedor React 2018-05-23 7
Tabela 7. Estrutura da tabela comentario

Suponha que seja necessário trazer todos os projetos que tenham algum comentário cadastrado. Para isso podemos utilizar a query abaixo:

SELECT
    P.id,
    P.titulo
FROM
  projetos P
INNER JOIN
  comentario C
ON 
  C.id_projeto = P.id
GROUP BY
  P.id

Observe que selecionamos o id e o titulo do projeto e logo na Linha 6 utilizamos INNER JOIN para relacionar as duas tabelas. Na Linha 9 realizamos o vinculo entre as duas tabelas, onde a coluna id_projeto da tabela comentario é o mesmo que a coluna id da tabela projeto.

O resultado obtido pode ser visto na abaixo, na Tabela 8:

ID Titulo
7 Criando uma aplicação com React
9 Consumindo uma API RestFUL com Laravel
Tabela 8. Lista de projetos com comentários