SQL/Junções: diferenças entre revisões

[revisão pendente][revisão pendente]
Conteúdo apagado Conteúdo adicionado
m <source> -> <syntaxhighlight> (phab:T237267)
 
Linha 7:
 
Como exemplo, vamos imaginar que possuímos duas tabelas relacionadas: Cliente e Profissao. A tabela Profissão contém o código e profissão armazenado:
<sourcesyntaxhighlight lang="sql">
CREATE TABLE profissao
(
Linha 14:
PRIMARY KEY (codigo)
);
</syntaxhighlight>
</source>
 
A tabela Cliente armazena os dados pessoais do Cliente:
<sourcesyntaxhighlight lang="sql">
CREATE TABLE cliente
(
Linha 29:
);
 
</syntaxhighlight>
</source>
Agora inserimos dados nestas tabelas. Em Profissao vamos inserir três profissões básicas:
<sourcesyntaxhighlight lang="sql">
INSERT INTO profissao
VALUES (1,
Linha 43:
VALUES (3,
'Suporte');
</syntaxhighlight>
</source>
Possuímos agora três profissões com respectivos códigos. Agora vamos inserir dados na tabela Cliente:
<sourcesyntaxhighlight lang="sql">
INSERT INTO cliente
VALUES (1,
Linha 66:
'85412587',
3);
</syntaxhighlight>
</source>
 
As inserções podem ser feitas de outras formas como:
<sourcesyntaxhighlight lang="sql">
INSERT INTO Profissao (Codigo,cargo) VALUES
(1,'Programador'),
(2,'Analista de BD'),
(3,'Suporte');
</sourcesyntaxhighlight>Agora vamos inserir dados na tabela Cliente, utilizando a mesmo modelo de inserção:
<sourcesyntaxhighlight lang="sql">
INSERT INTO Cliente (Codigo,Nome,Data,Telefone,Profissao) VALUES
(1,'João Pereira',19820606,'12345678',1),
(2,'José Manuel',19750801,'21358271',2),
(3,'Maria Mercedes',19851001,'85412587',3);
</syntaxhighlight>
</source>
 
Para visualizarmos todos os dados contidos nas duas tabelas após a inserção dos dados, podemos utilizar:
<sourcesyntaxhighlight lang="sql">
SELECT * FROM Cliente,Profissao;
</syntaxhighlight>
</source>
Porém, se quisermos trazer apenas o Nome do Cliente e o seu Cargo, podemos fazer uma junção de produto cartesiano utilizando a Cláusula WHERE :
<sourcesyntaxhighlight lang="sql">
SELECT Cliente.Nome,Profissao.Cargo
FROM Cliente,Profissao
WHERE Cliente.Profissao=Profissao.Codigo;
</syntaxhighlight>
</source>
Nesta seleção, trazemos um campo de cada tabela após o SELECT, mencionamos as tabelas de quais elas se originam no FROM, e no WHERE especificamos a ligação entre as tabelas. Note que Cliente.Profissao é a chave estrangeira da tabela Cliente, que referencia diretamente a chave primária da tabela Profissao.
 
Linha 102:
 
Como exemplo, a consulta seguinte traz todos os registros da tabela Cliente e encontra todas as combinações com a tabela Profissao. A cláusula JOIN compara os valores da coluna Profissao de Cliente com a coluna Codigo da Profissao. Quando não existe aos dados não atendem as condições especificadas, eles não são retornados.
<sourcesyntaxhighlight lang="sql">
SELECT Cliente.nome,Pedido.cod_cliente,Pedido.num_pedido
FROM Cliente INNER JOIN Pedido
ON Cliente.Cod_cliente = Pedido.Cod_cliente
 
</syntaxhighlight>
</source>
 
==Junção Externa (Outer Join)==
Linha 116:
Se por exemplo inserimos na tabela Cliente um Cliente que não possua valor em seu campo Profissao, ou possua um valor que não tem correspondente no Codigo na tabela Profissão, e efetuarmos a seleção com LEFT OUTER JOIN a seleção será efetuada trazendo todos os dados da tabela Cliente, e os correspondentes na tabela Profissao, e quando não houver estes correspondentes, trará o valor NULL.
 
<sourcesyntaxhighlight lang="sql">
SELECT distinct *
FROM Cliente
LEFT OUTER JOIN Profissao
ON Cliente.Profissao=Profissao.Codigo;
</syntaxhighlight>
</source>
===Right Outer Join===
Esta operação é inversa à anterior e retorna sempre todos os registros da tabela à direita (a segunda tabela mencionada na consulta), mesmo se não existir registro correspondente na tabela à esquerda. Nestes casos, o valor NULL é retornado quando não há correspondência.
 
Como exemplo, imaginemos que possuímos diversas Profissões com respectivos códigos que não possuem correspondentes na tabela Clientes. Esta consulta traz todas estas Profissões mesmo que não haja esta correspondência:
<sourcesyntaxhighlight lang="sql">
SELECT *
FROM Cliente
RIGHT OUTER JOIN Profissao
ON Cliente.Profissao = Profissao.Codigo;
</syntaxhighlight>
</source>
===Full Outer Join===
Esta operação apresenta todos os dados das tabelas à esquerda e à direita, mesmo que não possuam correspondência em outra tabela. A tabela combinada possuirá assim todos os registros de ambas as tabelas e apresentará valores nulos para os registros sem correspondência.
 
<sourcesyntaxhighlight lang="sql">
SELECT *
FROM Cliente
FULL OUTER JOIN Profissao
ON Cliente.Profissao=Profissao.Codigo;
</syntaxhighlight>
</source>
 
Ou ainda:
 
<sourcesyntaxhighlight lang="sql">
SELECT *
FROM Cliente
Linha 155:
ON Cliente.Profissao=Profissao.Codigo
WHERE Cliente.Profissao IS NULL;
</syntaxhighlight>
</source>
 
==Resumo==