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 |
VENDEDORES | |
identificacao | nome |
10 | Marcelo |
20 | Kátia |
30 | Thiago |
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 |
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 |
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ão | 2 | 2 |
João | 1 | 3 |
João | 7 | 4 |
João | 7 | 5 |
João | 1 | 6 |
João | 1 | 7 |
Ana | 1 | 1 |
Ana | 2 | 2 |
Ana | 1 | 3 |
Ana | 7 | 4 |
Ana | 7 | 5 |
Ana | 1 | 6 |
Ana | 1 | 7 |
Maria | 1 | 1 |
Maria | 2 | 2 |
Maria | 1 | 3 |
Maria | 7 | 4 |
Maria | 7 | 5 |
Maria | 1 | 6 |
Maria | 1 | 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ávio | 2 | 2 |
Flávio | 1 | 3 |
Flávio | 7 | 4 |
Flávio | 7 | 5 |
Flávio | 1 | 6 |
Flávio | 1 | 7 |
Renato | 1 | 1 |
Renato | 2 | 2 |
Renato | 1 | 3 |
Renato | 7 | 4 |
Renato | 7 | 5 |
Renato | 1 | 6 |
Renato | 1 | 7 |
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.
LEFT OUTER JOIN - são incluídas todas as linhas da tabela do primeiro nome de tabela (a tabela mais à esquerda da expressão)
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)
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ã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 |
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 |
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 |
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 |
Um comentário:
05_-_join.sql (resolvido)
http://rapidshare.com/files/64744490/05_-_join.sql
bdJOIN.sql (Banco de Dados)
http://rapidshare.com/files/64744601/bdJOIN.sql
Teoria_-_23_10_07.sql (Matéria passada em classe 23/10/2007)
http://rapidshare.com/files/64743729/Teoria_-_23_10_07.sql
Postar um comentário