Neste post, veremos como utilizar o JOIN para listar(recuperar) registros de duas ou mais tabelas de um banco de dados, se baseando no relacionamento entre certas colunas destas tabelas.
Os comandos aqui apresentados são SQL “padrão”, e servem para qualquer SGBD.
A palavra reservada JOIN é utilizada para listar(recuperar) registros de duas ou mais tabelas de um banco de dados.
Para utilizar o JOIN, as tabelas precisam ser relacionadas.
Em Bancos de Dados, as tabelas são relacionadas umas com as outras através de chaves primárias e estrangeiras.
Uma chave primária é uma coluna (ou combinação de colunas) com um valor único em cada linha. Cada valor de uma chave primária precisa ser único para toda a tabela. O propósito é buscar, de uma única vez, os dados de forma conjunta, que estão divididos entre várias tabelas.
Veja a tabela “pessoa”:
| id | sobrenome | nome | endereco | cidade |
|---|---|---|---|---|
| 1 | Silva | Luis | Rua Lauro | Florianopolis |
| 2 | Souza | Pedro | Rua Schmidt | Rio de Janeiro |
| 3 | Santos | João | Rua Nono | São Paulo |
| 4 | Alves | Silvano | Rua Margarida | Salvador |
| 5 | Souza | Jack | Rua das Araras | Florianopolis |
A coluna ‘id’ é a chave primária da tabela ‘pessoa’. Isto significa que duas linhas NÃO podem ter o mesmo valor de id. O id distingue duas pessoas, mesmo que elas tenham o mesmo nome.
Agora, temos também a tabela de “compra”:
| id_compra | numero | id_pessoa |
|---|---|---|
| 1 | 77895 | 3 |
| 2 | 44678 | 3 |
| 3 | 22456 | 1 |
| 4 | 24562 | 1 |
| 5 | 34764 | 5 |
A coluna ‘id_compra’ é a chave primária da tabela ‘compra’, e a coluna ‘id_pessoa’ se refere a tabela de pessoa, sem utilizar o nome da pessoa em si, mas sim o seu valor de id.
Perceba que o relacionamento entre as duas tabelas acima se faz através da coluna ‘id_pessoa’.
É através deste relacionamento que podemos “juntar” duas tabelas e buscar valores que estão em duas (ou mais) ao mesmo tempo, com apenas uma SQL.
Esta junção se faz através do INNER JOIN (ou simplesmente JOIN)
Sintaxe do INNER JOIN
SELECT coluna(s) FROM tabela1 INNER JOIN tabela2 ON tabela1.coluna=tabela2.column_name
Exemplo:
Para o nosso exemplo, então, queremos buscar o nome e o sobrenome de pessoas que possuem compra cadastrada, junto com o número da compra. Devemos então, utilizar a seguinte instrução:
SELECT pessoa.nome, pessoa.sobrenome, compra.numero FROM pessoa INNER JOIN compra ON pessoa.id=compra.id_pessoa
ou
SELECT pessoa.nome, pessoa.sobrenome, compra.numero FROM pessoa JOIN compra ON pessoa.id=compra.id_pessoa
Nota: A instrução JOIN (sem especificar seu tipo) é, implicitamente, um INNER JOIN.
O ResultSet da instrução acima será:
| Nome | Sobrenome | Numero |
|---|---|---|
| João | Santos | 77895 |
| João | Santos | 44678 |
| Luis | Silva | 22456 |
| Luis | Silva | 24562 |
| Jack | Souza | 34764 |
A palavra reservada INNER JOIN (ou simplesmente JOIN) retorna linhas onde exista o valor do seu relacionamento (no caso, o id da pessoa) nas duas tabelas. Se existem linhas na tabela de pessoas que não tem registro na tabela de compra, estas linhas NÃO SERÃO LISTADAS.
Referências: