quarta-feira, 24 de outubro de 2007

Banco de Dados II

Recuperando Dados de Várias Tabelas (JOINS)

Para que possamos recuperar informações de um banco de dados, muitas vezes temos a necessidade de acessar simultaneamente várias tabelas relacionadas entre si. Algumas dessas consultas necessitam realizar uma junção (JOIN) entre tabelas, para que dessa junção possa extrair as informações necessárias à consulta formulada.

Exemplo:

CLIENTES



codigo
nome
cidade
estado
1
João
Jundiaí
SP
2
Ana
Jundiaí
SP
3
Maria
Campinas
SP
4
José
Jundiaí
SP
5
Flávio
Jundiaí
SP
6
Renato
Campinas
SP
6 rows

VENDEDORES

identificacao
nome
10
Marcelo
20
Kátia
30
Thiago
3 rows

PEDIDOS



numero
VENDEDORES_identificacao
CLIENTES_codigo
data_hora
1
10
1
2007-05-21 00:00:00.000
2
10
2
2007-05-20 00:00:00.000
3
20
1
2007-05-19 00:00:00.000
4
30
7
2007-05-18 00:00:00.000
5
10
7
2007-05-21 00:00:00.000
6
50
1
2007-05-21 00:00:00.000
7
10
1
2007-05-17 00:00:00.000
7 rows

Inner Joins

Quando usamos INNER JOIN como tipo de join, serão incluídas somente as linhas que satisfazem a condição do join.


Exemplo:

SELECT nome, CLIENTES_codigo, numero
FROM CLIENTES INNER JOIN PEDIDOS
ON codigo = CLIENTES_codigo


nome
CLIENTES_codigo
numero
João
1
1
Ana
2
2
João
1
3
João
1
6
João
1
7
5 rows

Nesta junção são apresentados os pedidos de cada cliente, pois a condição de join restringe e qualifica a junção dos dados entre as tabelas. A equação apresentada na cláusula WHERE é chamada de equação de junção.


Cross Joins

Quando usamos CROSS JOIN, incluímos cada uma das combinações de todas as linhas entre as tabelas.



Exemplo:

SELECT nome, CLIENTES_codigo, numero
FROM CLIENTES CROSS JOIN PEDIDOS

nome
CLIENTES_codigo
numero
João
1
1
João2
2
João1
3
João7
4
João7
5
João1
6
João1
7
Ana
1
1
Ana2
2
Ana1
3
Ana7
4
Ana7
5
Ana1
6
Ana1
7
Maria
1
1
Maria2
2
Maria1
3
Maria7
4
Maria7
5
Maria1
6
Maria1
7
José
1
1
José2
2
José1
3
José7
4
José7
5
José1
6
José1
7
Flávio
1
1
Flávio2
2
Flávio1
3
Flávio7
4
Flávio7
5
Flávio1
6
Flávio1
7
Renato
1
1
Renato2
2
Renato1
3
Renato7
4
Renato7
5
Renato1
6
Renato1
7
42 rows

Podemos observar que não existe muito proveito do resultado desse tipo de join, executando-se quando queremos fazer referência cruzada entre as duas tabelas e suas linhas todas.

Outer Join

Quando usamos OUTER JOIN, incluímos as linhas que satisfazem a condição de join e as linhas restantes de uma das tabelas do join.
É a seleção em que são restritas as linhas que interessam em uma tabela, mas são consideradas todas as linhas de outra tabela.
Ou seja, queremos ver as linhas de uma tabela que estão relacionadas com as de outra tabela e quais linhas não estão.

Exemplificando no mundo real, poderíamos dizer que queremos ver quais clientes têm pedidos e quais não têm nenhum pedido.
É de muita utilidade quando queremos verificar se existem membros órfãos em um banco de dados, ou seja, chave primária e chave estrangeira sem sincronia ou simetria.

Um OUTER JOIN somente pode ser realizado entre duas tabelas, não mais que duas tabelas.

Possui três tipos de qualificador para o OUTER JOIN.

http://www.riovaa.com/design/arrow_right.gif LEFT OUTER JOIN - são incluídas todas as linhas da tabela do primeiro nome de tabela (a tabela mais à esquerda da expressão)

http://www.riovaa.com/design/arrow_right.gif RIGHT OUTER JOIN - são incluídas todas as linhas da tabela do segundo nome de tabela da expressão (tabela mais à direita da expressão)

http://www.riovaa.com/design/arrow_right.gif FULL OUTER JOIN - são incluídas as linhas que não satisfazem a expressão tanto da primeira quanto da segunda tabelas.

Exemplos:

1. Quais os clientes que têm pedido e os que não têm pedido

SELECT nome, CLIENTES_codigo, numero
FROM CLIENTES LEFT OUTER JOIN PEDIDOS
ON codigo = CLIENTES_codigo

nome
CLIENTES_codigo
numero
João
1
1
João1
3
João1
6
João1
7
Ana
2
2
Maria
NULL
NULL
José
NULL
NULL
Flávio
NULL
NULL
Renato
NULL
NULL
9 rows

2. Quais os pedidos que têm cliente e os que não têm cliente

SELECT nome, CLIENTES_codigo, numero
FROM CLIENTES RIGHT OUTER JOIN PEDIDOS
ON codigo = CLIENTES_codigo


nome
CLIENTES_codigo
numero
João
1
1
Ana
2
2
João
1
3
NULL
7
4
NULL
7
5
João
1
6
João
1
7
7 rows

3. Quais os clientes que têm pedido e os que não têm pedido e quais os pedidos que têm cliente e os que não têm cliente

SELECT nome, CLIENTES_codigo, numero
FROM CLIENTES FULL OUTER JOIN PEDIDOS
ON codigo = CLIENTES_codigo


nome
CLIENTES_codigo
numero
João
1
1
João
1
3
João
1
6
João
1
7
Ana
2
2
Maria
NULL
NULL
José
NULL
NULL
Flávio
NULL
NULL
Renato
NULL
NULL
NULL
7
4
NULL
7
5
11 rows

Podemos utilizar as cláusulas LIKE, NOT LIKE, IN, NOT IN, NULL, NOT NULL e misturá-las com os operadores AND, OR e NOT, dentro de uma cláusula WHERE na junção de tabelas.


Exemplo:

SELECT nome, CLIENTES_codigo, numero
FROM CLIENTES INNER JOIN PEDIDOS
ON codigo = CLIENTES_codigo
WHERE nome LIKE 'J%' AND DAY(data_hora) = 21

nome
CLIENTES_codigo
numero
João
1
1
João
1
6
2 rows