quinta-feira, 28 de maio de 2009

SQL: Uso do JOIN em cláusulas SELECT

O SQL (Structured Query Language, ou Linguagem de Consulta Estruturada) é a linguagem padrão para recuperação de informações em banco de dados relacionais. Ela é uma linguagem muito fácil de usar e ao mesmo tempo poderosa, já que permite combinar informações obtidas a partir de diversas tabelas e usar uma diversidade muito grande de filtros de seleção.

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

Pessoa

idPessoa

nomePessoa

5

Cinconegue

10

Dezembrino

12

Dozeario

14

Quatorzeano

15

Quinzenio

17

Dezessetino

Automovel

idAuto

idPessoa

descAuto

B

(null)

Fusca branco

E

14

Opala bege

F

(null)

Passat amarelo

H

(null)

DKW

J

5

Gordini marrom

K

(null)

Brasília branca

M

17

Passat cinza

N

12

Belina verde

P

(null)

Fiat 147

Q

14

Fusca azul

R

12

Brasília preta

T

14

Opala vermelho

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.

7 comentários:

  1. Muito boa a explicação. Nota 10!

    ResponderExcluir
  2. muito bom!

    Fiquei na dúvida com relação a fazer o contrário, por exemplo: selecionar todos os elementos da tabela A que NÃO existam na tabela B.

    É possível fazer isso com JOIN? Ou existe outro comando para isso?

    ResponderExcluir
  3. Basta acrescentar um WHERE ao LEFT JOIN:

    SELECT Pessoa.idPessoa, nomePessoa, idAuto, Automovel.idPessoa, descAuto
    FROM Pessoa LEFT JOIN Automovel ON Pessoa.idPessoa = Automovel.idPessoa
    WHERE idAuto IS NULL
    ORDER BY 1, 3;

    ResponderExcluir
  4. Muito bom! Explicação simples e objetiva! Parabéns!

    ResponderExcluir
  5. Sinceramente eu não tenho palavras para expressar a minha gratidão, venho tentando entender o por que de usar o tal join a mais de 6 meses quando fiz a disciplina de banco de dados na faculdade, já procurei em todos os cantos do mundo e não entendi, mas vc com essa didática simples consegui fazer entender como funcionam essas tranqueiras.
    Meus humildes parabéns e muito obrigado pelo conhecimento, simplesmente extraordinário.

    ResponderExcluir
  6. A melhor explicação, de qualquer curso que eu tenha feito ou de pessoas que trabalhei junto. Parabens Cara!

    ResponderExcluir
  7. Estava relembrando o que aprendi na faculdade, e essa explicação é sensacional, simples e direta.

    ResponderExcluir