Você está na página 1de 16

Introduo ao SQL/Junes

Introduo
Em um banco de dados podemos ter duas ou mais tabelas relacionadas. comum ao elaborarmos uma consulta termos a necessidade de trazer dados de diferentes tabelas. Para criarmos esta seleo devemos definir os critrios de agrupamento para trazer estes dados. Estes critrios so chamados de Junes. Uma juno de tabelas criar uma pseudo-tabela derivada de duas ou mais tabelas de acordo com as regras especificadas, e que so parecidas com as regras da teoria dos conjuntos.

Juno de produto cartesiano


Uma juno de produto cartesiano uma juno entre duas tabelas que origina uma terceira tabela constituda por todos os elementos da primeira combinadas com todos os elementos da segunda. Para trazer apenas os campos necessrios da consulta:
No SELECT utilizamos em vez do nome do campo simples, o nome_tabela_campo.nome_campo; Em FROM utilizamos os nomes das tabelas que possuem os campos que queremos trazer; Em WHERE determinamos a dependncia das tabelas, lembrando que a relao entre as tabelas efetuada pela chave estrangeira.Desta forma o WHERE sempre especifica as chaves estrangeiras que ligam as tabelas.

Juno de produto cartesiano


Como exemplo, vamos imaginar que possumos duas tabelas relacionadas: Cliente e Profissao. A tabela Profisso contm o cdigo e profisso armazenado:
CREATE TABLE Profissao ( Codigo INT NOT NULL AUTO_INCREMENT, Cargo VARCHAR (60) NOT NULL, PRIMARY KEY (Codigo) );

Juno de produto cartesiano


A tabela Cliente armazena os dados pessoais do Cliente:
CREATE TABLE Cliente ( Codigo INT NOT NULL AUTO_INCREMENT, Nome VARCHAR (60) NOT NULL, Data_Nascimento DATE, Telefone CHAR (8), Profissao INT, PRIMARY KEY (Codigo) )

Juno de produto cartesiano


Agora inserimos dados nestas tabelas. Em Profissao vamos inserir trs profisses bsicas:
INSERT INTO profissao (Cargo) VALUES ('Programador'),('Analista de BD'),('Suporte')

Juno de produto cartesiano


Possumos agora trs profisses com respectivos cdigos. Agora vamos inserir dados na tabela Cliente:
INSERT INTO Cliente (Nome,Data_Nascimento,Telefone,Profissao) VALUES ('Joo Pereira',19820606,'12345678',1), ('Jos Manuel',19750801,'21358271',2), ('Maria Mercedes',19851001,'85412587',3)

Juno de produto cartesiano


Para visualizarmos todos os dados contidos nas duas tabelas aps a insero dos dados, podemos utilizar:
SELECT * FROM Cliente,Profissao;

Juno de produto cartesiano


Porm, se quisermos trazer apenas o Nome do Cliente e o seu Cargo, podemos fazer uma juno de produto cartesiano:
SELECT Cliente.Nome,Profissao.Cargo FROM Cliente,Profissao WHERE Cliente.Profissao=Profissao.Codigo;

Nesta seleo, trazemos um campo de cada tabela aps o SELECT, mencionamos as tabelas de quais elas se originam no FROM, e no WHERE especificamos a ligao entre as tabelas. Note que Cliente.Profissao a chave estrangeira da tabela Cliente, que referencia diretamente a chave primria da tabela Profissao.

Juno Interna (Inner Join)


Uma Juno Interna caracterizada por uma seleo que retorna apenas os dados que atendem s condies de juno, isto , quais linhas de uma tabela se relacionam com as linhas de outras tabelas. Para isto utilizamos a clusula ON, que semelhante clusula WHERE. Podemos especificar duas formas diferentes de expressar esta juno: a explcita utiliza a palavra JOIN, enquanto a implcita utiliza ',' para separar as tabelas a combinar na clusula FROM do SELECT. Ento sempre gerado o produto cruzado do qual so selecionadas as combinaes que cumpram a clusula WHERE.

Juno Interna (Inner Join)


necessrio ter algum cuidado quando se combinam colunas com valores nulos (NULL), j que o valor nulo no se combina com outro valor, ou outro valor nulo, exceto quando se agregam predicados como IS NULL ou IS NOT NULL. Como exemplo, a consulta seguinte traz todos os registros da tabela Cliente e encontra todas as combinaes com a tabela Profissao. A clusula JOIN compara os valores da coluna Profissao de Cliente com a coluna Codigo da Profissao. Quando no existe aos dados no atendem as condies especificadas, eles no so retornados. SELECT cliente.Nome,profissao.Codigo, profissao.Cargo FROM cliente INNER JOIN profissao ON cliente.Codigo = profissao.Codigo

Juno Externa (Outer Join)


Uma Juno Externa uma seleo que no requer que os registros de uma tabela possuam registros equivalentes em outra. O registro mantido na pseudo-tabela se no existe outro registro que lhe corresponda. Este tipo de juno se subdivide dependendo da tabela do qual admitiremos os registros que no possuem correspondncia: a tabela esquerda, a direita ou ambas.

Left Outer Join


O resultado desta seleo sempre contm todos os registros da tabela esquerda (isto , a primeira tabela mencionada na consulta), mesmo quando no exista registros correspondentes na tabela direita. Desta forma, esta seleo retorna todos os valores da tabela esquerda com os valores da tabela direita correspondente, ou quando no h correspondncia retorna um valor NULL. Se por exemplo inserimos na tabela Cliente um Cliente que no possua valor em seu campo Profissao, ou possua um valor que no tem correspondente no Codigo na tabela Profisso, e efetuarmos a seleo com LEFT OUTER JOIN a seleo ser efetuada trazendo todos os dados da tabela Cliente, e os correspondentes na tabela Profissao, e quando no houver estes correspondentes, trar o valor NULL. SELECT DISTINCT * FROM cliente LEFT OUTER JOIN profissao ON cliente.profissao = profissao.codigo;

Right Outer Join


Esta operao inversa anterior e retorna sempre todos os registros da tabela direita (a segunda tabela mencionada na consulta), mesmo se no existir registro correspondente na tabela esquerda. Nestes casos, o valor NULL retornado quando no h correspondncia. Como exemplo, imaginemos que possumos diversas Profisses com respectivos cdigos que no possuem correspondentes na tabela Clientes. Esta consulta traz todas estas Profisses mesmo que no haja esta correspondncia:
SELECT * FROM cliente RIGHT OUTER JOIN profissao ON cliente.profissao = profissao.codigo;

Full Outer Join


Esta operao apresenta todos os dados das tabelas esquerda e direita, mesmo que no possuam correspondncia em outra tabela. A tabela combinada possuir assim todos os registros de ambas as tabelas e apresentar valores nulos para os registros sem correspondncia. SELECT * FROM Cliente FULL OUTER JOIN Profissao ON Cliente.Profissao=Profissao.Codigo; Ou ainda: SELECT * FROM Cliente LEFT JOIN Profissao ON Cliente.Profissao=Profissao.Codigo UNION SELECT * FROM Cliente RIGHT JOIN Profissao ON Cliente.Profissao=Profissao.Codigo WHERE Cliente.Profissao IS NULL

Lembrando...
Juno de produto cartesiano uma juno entre duas tabelas que origina uma terceira tabela constituda por todos os elementos da primeira combinadas com todos os elementos da segunda. Juno Interna todas linhas de uma tabela se relacionam com todas as linhas de outras tabelas se elas tiverem ao menos 1 campo em comum Juno Externa uma seleo que no requer que os registros de uma tabela possuam registros equivalentes em outras Left Outer Join todos os registros da tabela esquerda mesmo quando no exista registros correspondentes na tabela direita. Right Outer Join todos os registros da tabela direita mesmo quando no exista registros correspondentes na tabela esquerda. Full Outer Join Esta operao apresenta todos os dados das tabelas esquerda e direita, mesmo que no possuam correspondncia em outra tabela

Você também pode gostar