Free CSS Button Css3Menu.com

Tutoriais » SQL » Junção Natural (ou fechada) »
Definindo:
Este comando coloca lado-a-lado as tuplas de duas tabelas que atendam a uma condição de comparação de campos. Em livros o termo 'lado-a-lado' pode ser escrito: EMPARELHAR.
CUIDADO!
Também já foi visto em livros a definição: 'Junção é um Produto Cartesiano condicionado', ou pior: 'Junção é um Produto Cartesiano como qual se faz uma seleção'.
Olha! Eu entendo a intenção dos autores destas pérolas... mas é melhor ficar com a primeira definição!

A junção natural é um comando que passou por versões no Padrão SQL.
Se tivermos as tabelas:
Pedidos (NumPedido, ValorTotal, Dat_Pedido, Cod_Cliente)
Clientes(Cod_Cliente, Nome_Cli, Logradouro)
Na primeira versão se implementou o comando:
Clientes [[Clientes.CodCliente=Pedidos.CodCliente]] Pedidos
Em SQL este comando fica assim:
       SELECT * FROM Clientes, Pedidos WHERE Clientes.Cod_Cliente=Pedidos.Cod_Cliente;     
Na AR já existia o conceito de junção aberta, daí tinha-se que implementar este conceito...
Então surgiu a especificação do comando JOIN
O comando JOIN veio com 4 complementos: LEFT, RIGHT, INNER e FULL OUTER (para junções abertas para ESQUERDA, DIRETA, NATURAL e COMPLETA).
Podemos implementar a Junção Natural com o operador INNER JOIN, assim:
       SELECT * FROM Clientes INNER JOIN Pedidos ON Clientes.Cod_Cliente=Pedidos.Cod_Cliente;     
Veja esta característica do SQL: COMBINAR COMANDOS DA Álgebra Relacional
Vamos fazer uma JUNÇÃO e uma PROJEÇÃO
       SELECT Clientes.* FROM Clientes, Pedidos WHERE Clientes.Cod_Cliente=Pedidos.Cod_Cliente;     
Neste comando o SQL faz a junção e a seguir a projeção de todos os campos da tabela Clientes (somente de Clientes).

CUIDADO!
O SQL permite fazer em um comando a junção de três ou mais tabelas.
POR EXEMPLO. Se tivermos as tabelas:
Pedidos (NumPedido, ValorTotal, Dat_Pedido, Cod_Cliente)
Clientes(Cod_Cliente, Nome_Cli, Logradouro)
ItensPedidos(NumPedido,CodProduto,QtdItemPedido,ValUnitario) e
Produtos(CodProduto,Nome_Pro)

Podemos fazer a junção destas 4 tabelas assim:
     SELECT * FROM Clientes, Pedidos, ItensPedidos, Produtos
              WHERE
                 Clientes.Cod_Cliente=Pedidos.Cod_Cliente AND
                 Pedidos.NumPedido=ItensPedido.NumPedido AND
                 ItensPedido.CodProduto=Produtos.CodProduto;     

Podemos criar uma tabela no banco de dados com o comando create table, copiando a estrutura de uma tabela e as tuplas que são resultado de um comando SQL
Por exemplo, fazemos uma Junção e depois criamos a tabela com o resultado, desta forma
       CREATE TABLE atua01 AS (SELECT Clientes.* FROM Clientes, Pedidos WHERE Clientes.Cod_Cliente=Pedidos.Cod_Cliente);     
Estas tabelas ficam GRAVADAS no disco rígido e passam a constar no dicionário de dados da base.
Podemos também criar uma tabela 'temporária' (fica em memória RAM somente enquanto se executa a sessão de conexão com o SGBD).
Este 'tipo de tabela' é implementado em vários SGBDs.
Criando uma tabela temporária e a seguir mostrando seu conteúdo
       CREATE TEMPORARY TABLE atua01 AS (SELECT Clientes.* FROM Clientes, Pedidos WHERE Clientes.Cod_Cliente=Pedidos.Cod_Cliente);
       SELECT * FROM atua01;     
CUIDADO!
A criação de tabelas (temporárias ou não), em alguns SGBDs exige que as estruturas das tabelas NÃO tenham nomes de campos repetidos.
Mas... e SE as tabelas envolvidas na Junção tiverem campos com o mesmo nome? Como fazemos?
Pode-se combinar a Junção com a operação de PROJEÇÃO, fazendo gerar uma tabela sem nomes de campos repetidos.
Uma outra alternativa seria NÃO atribuir nomes iguais em campos distintos em diferentes tabelas. Assim se um campo em uma tabela for Chave Primária o nome do campo pode ser: PK_NomeDoCampo... e um campo correspondente seria FK_NomeDoCampo.