domingo, 8 de maio de 2011

Tutorial para iniciante sobre JOIN's


Para aqueles que tinham dúvidas quanto ao funcionamento dos JOIN's das tabelas no SQL, desenvolvi um pequeno tutorial de apoio...
Tabelas e seus registros:

TABELA_A
Codigo
Nome
1
um
2
dois
3
três
4
quatro
5
cinco

TABELA B
Lanca
Codigo
Valor
1
1
1.000
2
1
2.000
3
1
5.000
4
2
4.000
5
2
9.000
6
3
7.000
7
5
4.000
8
8
7.000

Para a relação entre as tabelas temos:
3 registros para a empresa 1 (que existe na tabela de empresas);
2 registros para a empresa 2 (que existe na tabela de empresas);
1 registros para a empresa 3 (que existe na tabela de empresas);
0 registros para a empresa 4 (que existe na tabela de empresas);
1 registros para a empresa 5 (que existe na tabela de empresas);
1 registros para a empresa 8 (que NÃO existe na tabela de empresas);

Agora vamos ver como ficariam as pesquisas* (SELECT's) com os JOIN's ( INNER, [ LEFT | RIGHT | FULL ] OUTER ):


* Para tais pesquisas vamos usar a seguinte linguagem:

SELECT [CAMPOS]
FROM "TABELA_DA_ESQUERDA"
[INNER] JOIN | {LEFT | RIGHT | FULL } [OUTER]} JOIN "TABELA_DA_DIREITA"

1) INNER JOIN:

SELECT A.NOME "A.NOME",
B.VALOR "B.VALOR"
FROM TABELA_A A
INNER JOIN TABELA_B B ON B.CODIGO = A.CODIGO
 


A.NOME
B.VALOR
1
UM
1.000
2
UM
2.000
3
UM
5.000
4
DOIS
4.000
5
DOIS
9.000
6
TRÊS
7.000
7
CINCO
4.000


Nas pesquisas com INNER JOIN o resultado trará somente as linhas que sejam comum nas 2 tabelas, ligadas pelos campos das tabelas em questão na pesquisa.


2) LEFT OUTER JOIN:

SELECT A.NOME "A.NOME",
B.VALOR "B.VALOR"
FROM TABELA_A A
LEFT OUTER JOIN TABELA_B B ON B.CODIGO = A.CODIGO
 


A.NOME
B.VALOR
1
UM
1.000
2
UM
2.000
3
UM
5.000
4
DOIS
4.000
5
DOIS
9.000
6
TRÊS
7.000
7
QUATRO
NULL
8
CINCO
4.000

Nas pesquisas com LEFT OUTER JOIN o resultado trará todas os registros que estejam na tabela da esquerda do JOIN (neste caso é a TABELA_A) ao menos 1 vez, mesmo que não tenham registros na tabela da direita do JOIN (neste caso é a TABELA_B) ligadas à tabela da esquerda, como é o caso da linha 7.

3) RIGHT OUTER JOIN:
SELECT A.NOME "A.NOME",
B.VALOR "B.VALOR"
FROM TABELA_A A
RIGHT OUTER JOIN TABELA_B B ON B.CODIGO = A.CODIGO


A.NOME
B.VALOR
1
UM
1.000
2
UM
2.000
3
UM
5.000
4
DOIS
4.000
5
DOIS
9.000
6
TRÊS
7.000
7
CINCO
4.000
8
NULL
7.000

Nas pesquisas com RIGHT OUTER JOIN o resultado trará todas os registros que estejam na tabela da direita do JOIN (neste caso é a TABELA_B) ao menos 1 vez, mesmo que não tenham registros na tabela da esquerda do JOIN (neste caso é a TABELA_A) ligadas à tabela da direita, como é o caso da linha 8.

4) FULL OUTER JOIN:
SELECT A.NOME "A.NOME",
B.VALOR "B.VALOR"
FROM TABELA_A A
FULL OUTER JOIN TABELA_B B ON B.CODIGO = A.CODIGO


A.NOME
B.VALOR
1
UM
1.000
2
UM
2.000
3
UM
5.000
4
DOIS
4.000
5
DOIS
9.000
6
TRÊS
7.000
7
QUATRO
NULL
8
CINCO
4.000
9
NULL
7.000

Nas pesquisas com FULL OUTER JOIN o resultado trará todas os registros, ao menos 1 vez, que estejam nas 2 tabelas, tanto a da esquerda do JOIN (neste caso é a TABELA_A) quanto a da direita do JOIN (neste caso é a TABELA_B), como é o caso das linhas 7 e 9. O FULL poderíamos dizer que é uma junção entre o LEFT OUTER JOIN e o RIGHT OUTER JOIN.

Um comentário: