sexta-feira, 2 de abril de 2010

Utilizando JOINS em SQL

Salve, salve

Para aqueles que tinham dúvidas quanto ao funcionamento dos JOIN's das tabelas no SQL, desenvolvi um pequeno tutorial de apoio, que segue abaixo:

Tabelas e seus registros:
TABELA_A
--------------------
|CODIGO | NOME |
--------------------
| 1 | UM |
| 2 | DOIS |
| 3 | TRES |
| 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.|TRES | 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.|TRES | 7.000|
7.|QUATRO | |
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.|TRES | 7.000|
7.|CINCO | 4.000|
8.| | 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.|TRES | 7.000|
7.|QUATRO | |
8.|CINCO | 4.000|
9.| | 7.000|
-------------------


// Deixe seu comentário


Take care

Nenhum comentário: