sql junções

16
Introdução ao SQL/Junções

Upload: reuel-lopes

Post on 25-Jun-2015

2.481 views

Category:

Education


0 download

TRANSCRIPT

Page 1: Sql junções

Introdução ao

SQL/Junções

Page 2: Sql junções

Introdução

• 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 seleção devemos definir os critérios de

agrupamento para trazer estes dados. Estes critérios são

chamados de Junções. Uma junção de tabelas criar uma

pseudo-tabela derivada de duas ou mais tabelas de acordo

com as regras especificadas, e que são parecidas com as

regras da teoria dos conjuntos.

Page 3: Sql junções

Junção de produto cartesiano

• Uma junção de produto cartesiano é uma junção entre duas tabelasque origina uma terceira tabela constituída por todos os elementosda primeira combinadas com todos os elementos da segunda. Paratrazer apenas os campos necessários da consulta:

• No SELECT utilizamos em vez do nome do campo simples, onome_tabela_campo.nome_campo;

• Em FROM utilizamos os nomes das tabelas que possuem os camposque queremos trazer;

• Em WHERE determinamos a dependência das tabelas, lembrandoque a relação entre as tabelas é efetuada pela chaveestrangeira.Desta forma o WHERE sempre especifica as chavesestrangeiras que ligam as tabelas.

Page 4: Sql junções

Junção de produto cartesiano

• 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:

CREATE TABLE Profissao

( Codigo INT NOT NULL AUTO_INCREMENT,

Cargo VARCHAR (60) NOT NULL,

PRIMARY KEY (Codigo) );

Page 5: Sql junções

Junção 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) )

Page 6: Sql junções

Junção de produto cartesiano

• Agora inserimos dados nestas tabelas. Em Profissao vamos inserir três profissões básicas:

INSERT INTO profissao (Cargo)

VALUES

('Programador'),('Analista de BD'),('Suporte')

Page 7: Sql junções

Junção de produto cartesiano

• Possuímos agora três profissões com respectivos códigos. Agora vamos inserir dados na tabela Cliente:

INSERT INTO Cliente

(Nome,Data_Nascimento,Telefone,Profissao)

VALUES

('João Pereira',19820606,'12345678',1),

('José Manuel',19750801,'21358271',2),

('Maria Mercedes',19851001,'85412587',3)

Page 8: Sql junções

Junção de produto cartesiano

• Para visualizarmos todos os dados contidos nas duas tabelas após a inserção dos dados, podemos utilizar:

SELECT * FROM Cliente,Profissao;

Page 9: Sql junções

Junção de produto cartesiano

• Porém, se quisermos trazer apenas o Nome do Cliente e o seu Cargo, podemos fazer uma junção de produto cartesiano:

SELECT Cliente.Nome,Profissao.Cargo

FROM Cliente,Profissao

WHERE Cliente.Profissao=Profissao.Codigo;

• Nesta seleção, trazemos um campo de cada tabela após oSELECT, mencionamos as tabelas de quais elas se originam noFROM, e no WHERE especificamos a ligação entre as tabelas.Note que Cliente.Profissao é a chave estrangeira da tabelaCliente, que referencia diretamente a chave primária da tabelaProfissao.

Page 10: Sql junções

Junção Interna (Inner Join)

• Uma Junção Interna é caracterizada por uma seleção queretorna apenas os dados que atendem às condições de junção,isto é, quais linhas de uma tabela se relacionam com as linhasde outras tabelas. Para isto utilizamos a cláusula ON, que ésemelhante à cláusula WHERE.

• Podemos especificar duas formas diferentes de expressar estajunção: a explícita utiliza a palavra JOIN, enquanto a implícitautiliza ',' para separar as tabelas a combinar na cláusula FROMdo SELECT. Então sempre é gerado o produto cruzado do qualsão selecionadas as combinações que cumpram a cláusulaWHERE.

Page 11: Sql junções

Junção Interna (Inner Join)

• É necessário ter algum cuidado quando se combinam colunas comvalores nulos (NULL), já que o valor nulo não se combina com outrovalor, ou outro valor nulo, exceto quando se agregam predicadoscomo IS NULL ou IS NOT NULL.

• Como exemplo, a consulta seguinte traz todos os registros da tabelaCliente e encontra todas as combinações com a tabela Profissao. Acláusula JOIN compara os valores da coluna Profissao de Cliente coma coluna Codigo da Profissao. Quando não existe aos dados nãoatendem as condições especificadas, eles não são retornados.

SELECT

cliente.Nome,profissao.Codigo, profissao.Cargo

FROM cliente

INNER JOIN profissao

ON cliente.Codigo = profissao.Codigo

Page 12: Sql junções

Junção Externa (Outer Join)

• Uma Junção Externa é uma seleção que não requer que osregistros de uma tabela possuam registros equivalentes emoutra. O registro é mantido na pseudo-tabela se não existeoutro registro que lhe corresponda. Este tipo de junção sesubdivide dependendo da tabela do qual admitiremos osregistros que não possuem correspondência: a tabelaesquerda, a direita ou ambas.

Page 13: Sql junções

Left Outer Join

• O resultado desta seleção sempre contém todos os registros databela esquerda (isto é, a primeira tabela mencionada na consulta),mesmo quando não exista registros correspondentes na tabeladireita. Desta forma, esta seleção retorna todos os valores da tabelaesquerda com os valores da tabela direita correspondente, ouquando não há correspondência retorna um valor NULL.

• Se por exemplo inserimos na tabela Cliente um Cliente que nãopossua valor em seu campo Profissao, ou possua um valor que nãotem correspondente no Codigo na tabela Profissão, e efetuarmos aseleção com LEFT OUTER JOIN a seleção será efetuada trazendotodos os dados da tabela Cliente, e os correspondentes na tabelaProfissao, e quando não houver estes correspondentes, trará o valorNULL.

• SELECT DISTINCT * FROM cliente LEFT OUTER JOIN profissao ON cliente.profissao = profissao.codigo;

Page 14: Sql junções

Right Outer Join

• Esta operação é inversa à anterior e retorna sempre todos osregistros da tabela à direita (a segunda tabela mencionada naconsulta), mesmo se não existir registro correspondente natabela à esquerda. Nestes casos, o valor NULL é retornadoquando não há correspondência.

• Como exemplo, imaginemos que possuímos diversasProfissões com respectivos códigos que não possuemcorrespondentes na tabela Clientes. Esta consulta traz todasestas Profissões mesmo que não haja esta correspondência:

SELECT * FROM cliente RIGHT OUTER JOIN profissao

ON cliente.profissao = profissao.codigo;

Page 15: Sql junções

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 astabelas e apresentará valores nulos para os registros semcorrespondência.

• 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

Page 16: Sql junções

Lembrando...

• Junção de produto cartesiano é uma junção entre duas tabelas que origina umaterceira tabela constituída por todos os elementos da primeira combinadas comtodos os elementos da segunda.

• Junção Interna todas linhas de uma tabela se relacionam com todas as linhas deoutras tabelas se elas tiverem ao menos 1 campo em comum

• Junção Externa é uma seleção que não requer que os registros de uma tabelapossuam registros equivalentes em outras

• Left Outer Join todos os registros da tabela esquerda mesmo quando não existaregistros correspondentes na tabela direita.

• Right Outer Join todos os registros da tabela direita mesmo quando não existaregistros correspondentes na tabela esquerda.

• 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