Tutoriais » SQL » Junção » 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. Simbologia AR: A [[ condição ]] B ou A ⋈ B Sintaxe:
Citam-se a sintaxe de 87 e a de 92 SELECT * FROM tabela1, tabela2 WHERE [[ Condição ]]; [ANSI/87] SELECT * FROM tabela1 INNER JOIN tabela2 ON [[ Condição ]]; [ANSI/92] Notas:
Em AR, a expressão para representar a operação de junção é a mesma para as duas sintaxes da SQL, ou seja: <tabela1>[[condição]]<tabela2>
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 é 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; [ANSI/87]
Na Realidade de processamento de dados, já existia o conceito de junção aberta.
'Encontrar linhas que NÃO participam de uma junção, daí tinha-se que implementar este conceito...
Então surgiu a especificação do comando JOIN
O comando JOIN veio com 5 complementos: CROSS, LEFT, RIGHT, INNER e FULL OUTER (para produto cartesiano, junções abertas para ESQUERDA, DIRETA, NATURAL e COMPLETA).
Podemos implementar a Junção com o operador INNER JOIN, assim: SELECT * FROM Clientes INNER JOIN Pedidos ON Clientes.Cod_Cliente=Pedidos.Cod_Cliente; [ANSI/92]
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 (usando a notação ANSI/87) assim: SELECT * FROM Clientes, Pedidos, ItensPedidos, Produtos
WHERE Clientes.Cod_Cliente=Pedidos.Cod_Cliente AND
Pedidos.NumPedido=ItensPedido.NumPedido AND
ItensPedido.CodProduto=Produtos.CodProduto; [ANSI/87]
Ou usando a notação ANSI/92 (note que o comando 'evoca' 3 vezes o INNER JOIN - e cada um com seu 'ON'): SELECT * FROM Clientes INNER JOIN Pedidos ON Clientes.Cod_Cliente=Pedidos.Cod_Cliente
INNER JOIN ItensPedidos ON Pedidos.NumPedido=ItensPedido.NumPedido
INNER JOIN Produtos ON ItensPedido.CodProduto=Produtos.CodProduto; [ANSI/92]