INNER JOIN é uma cláusula que permite a junção entre duas ou mais tabelas, desde que hajam entrelaçamento entre todas.
Guia do artigo:
Visão geral
Essa cláusula trará em sua consulta os dados que são comuns às duas tabelas, conforme ilustra a Figura 1.
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 |
id | nome |
1 | Infantil |
2 | Informatica |
3 | Educacional |
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 |
Sintaxe
SELECT
[ tabela1.coluna1, tabela1.coluna2, ... | N.coluna1, N.coluna2, … ]
FROM
[ tabela1 | tabela1 F ]
LEFT 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 |
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 |
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 |
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 |
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 |
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 |