O funcionamento do SQL é baseado na teoria de conjuntos, ou seja, as tabelas são consideradas conjuntos de dados e o resultado das pesquisas são subconjuntos que podem ser obtidos, por exemplo, através da interseção ou união dos conjuntos originais.
Tendo isso em mente, é fácil usar as cláusulas SQL para realizar pesquisas mais complexas. Para isso, o SQL disponibiliza o comando JOIN, que permite combinar dados de tabelas diferentes.
Para mostrar como o JOIN funciona, eu vou dar um exemplo bem básico, mas, que pode ser facilmente extrapolado para situações mais complexas, desde que se tenha o conceito em mente.
Imagine um banco de dados que possua apenas duas tabelas, cujos layout e conteúdo estão detalhados abaixo:
- Modelo de dados e conteúdo das tabelas
|
|
Se representarmos o conteúdo deste banco de dados em forma de conjunto, ele ficaria assim:
Feito isso, nós podemos entender melhor o efeito do JOIN quando aplicado a este conjunto de dados. Veja os exemplos abaixo:
- INNER JOIN
O INNER JOIN retorna o sub-conjunto interseção dos conjuntos envolvidos na pesquisa.
SELECT Pessoa.idPessoa, nomePessoa, idAuto, Automovel.idPessoa, descAuto
FROM Pessoa INNER JOIN Automovel ON Pessoa.idPessoa = Automovel.idPessoa
ORDER BY 1, 3;
Pessoa.idPessoa | nomePessoa | idAuto | Automovel.idPessoa | descAuto |
5 | Cinconegue | J | 5 | Gordini marrom |
12 | Dozeario | N | 12 | Belina verde |
12 | Dozeario | R | 12 | Brasília preta |
14 | Quatorzeano | E | 14 | Opala bege |
14 | Quatorzeano | Q | 14 | Fusca azul |
14 | Quatorzeano | T | 14 | Opala vermelho |
17 | Dezessetino | M | 17 | Passat cinza |
Ou seja só são exibidos elementos que estão nos dois conjuntos. Esta é a utilização mais comum do JOIN nas pesquisas que envolvem mais de uma tabela.
O INNER JOIN pode ser escrito também no formato abaixo (chamado de implícito) e o resultado é exatamente o mesmo:
SELECT Pessoa.idPessoa, nomePessoa, idAuto, Automovel.idPessoa, descAuto
FROM Pessoa, Automovel
WHERE Pessoa.idPessoa = Automovel.idPessoa
ORDER BY 1, 3;
- LEFT JOIN
O LEFT JOIN retorna todos os elementos que estão no conjunto da esquerda (a primeira tabela), mais os elementos que estão na interseção.
SELECT Pessoa.idPessoa, nomePessoa, idAuto, Automovel.idPessoa, descAuto
FROM Pessoa LEFT JOIN Automovel ON Pessoa.idPessoa = Automovel.idPessoa
ORDER BY 1, 3;
Pessoa.idPessoa | nomePessoa | idAuto | Automovel.idPessoa | descAuto |
5 | Cinconegue | J | 5 | Gordini marrom |
10 | Dezembrino | (null) | (null) | (null) |
12 | Dozeario | N | 12 | Belina verde |
12 | Dozeario | R | 12 | Brasília preta |
14 | Quatorzeano | E | 14 | Opala bege |
14 | Quatorzeano | Q | 14 | Fusca azul |
14 | Quatorzeano | T | 14 | Opala vermelho |
15 | Quinzenio | (null) | (null) | (null) |
17 | Dezessetino | M | 17 | Passat cinza |
- RIGHT JOIN
O RIGHT JOIN, ao contrário, retorna todos os elementos que estão no conjunto da direita (a segunda tabela), mais os elementos que estão na interseção.
SELECT Pessoa.idPessoa, nomePessoa, idAuto, Automovel.idPessoa, descAuto
FROM Pessoa RIGHT JOIN Automovel ON Pessoa.idPessoa = Automovel.idPessoa
ORDER BY 1, 3;
Pessoa.idPessoa | nomePessoa | idAuto | Automovel.idPessoa | descAuto |
(null) | (null) | B | (null) | Fusca branco |
(null) | (null) | F | (null) | Passat amarelo |
(null) | (null) | H | (null) | DKW |
(null) | (null) | K | (null) | Brasília branca |
(null) | (null) | P | (null) | Fiat 147 |
5 | Cinconegue | J | 5 | Gordini marrom |
12 | Dozeario | N | 12 | Belina verde |
12 | Dozeario | R | 12 | Brasília preta |
14 | Quatorzeano | E | 14 | Opala bege |
14 | Quatorzeano | Q | 14 | Fusca azul |
14 | Quatorzeano | T | 14 | Opala vermelho |
17 | Dezessetino | M | 17 | Passat cinza |
Os exemplos acima, apesar de muito simples, podem ser facilmente extrapolados para a maioria das pesquisas onde é necessária a pesquisa em mais de uma tabela, pois, apesar de ser possível existir mais complexidade nas cláusulas, o raciocínio básico é exatamente o mesmo.