You are on page 1of 20

Joins

Joins
At agora estamos trabalhando com a recuperao de dados sobre

uma nica tabela, mas o conceito de banco de dados rene, evidentemente, vrias tabelas diferentes.

Para que possamos recuperar informaes de um banco de dados,

temos, muitas vezes, a necessidade de acessar simultaneamente vrias tabelas relacionadas entre si. Algumas dessas consultas necessitam realizar uma juno (JOIN) entre tabelas.

Joins
As JOINS so criadas atravs da chave primaria de uma tabela com

a chave estrangeira na outra tabela;


Problema: Mostrar o nome de todos os cliente e seus respectivos

pedidos.
TBCliente CodCliente: INTEGER NomeCliente: VARCHAR(60) Endereco: VARCHAR(50) Cidade: VARCHAR(30) Estado: VARCHAR(2) CPF: VARCHAR(15) DataNascimento: DATE TBPedido CodPedido: INTEGER PrazoEntrega: INTEGER CodVendedor: INTEGER CodCliente: INTEGER

Joins
Select A.NomeCliente, B.codPedido From TBCliente A, TBPedido B Where A.CodCliente = B.CodCliente

Joins
Problema: Quantos clientes fizeram pedido com a vendedora

Rosana Reis'
TBCliente CodCliente: INTEGER NomeCliente: VARCHAR(60) Endereco: VARCHAR(50) Cidade: VARCHAR(30) Estado: VARCHAR(2) CPF: VARCHAR(15) DataNascimento: DATE TBPedido CodPedido: INTEGER PrazoEntrega: INTEGER CodVendedor: INTEGER CodCliente: INTEGER

TBVendedor CodVendedor: INTEGER NomeVendedor: VARCHAR(60) FaixaComissao: INTEGER Salario: DECIMAL(10,2)

Joins
Select Count(A.CodCliente) From TBPedido A, TBCliente B, TBVendedor C Where A.CodCliente = B.CodCliente and A.CodVendedor = C.CodVendedor and C.NomeVendedor = 'Rosana Reis'

Modelos de Joins
O trabalho com JOINS ponto primordial para manipulaes

de comandos SQL.
As Joins se dividem em dois grupos: OUTER JOIN INNER JOIN

OUTER JOIN
Liga as linhas da tabela baseado na condio de ligao,

porm retorna as linhas que no combinam entre si. Assim, mesmo as linhas que no se encontrou referncia no cruzamento das tabelas aparecero no resultado.

Temos dois tipos de pesquisas com OUTER JOIN: LEFT OUTER JOIN RIGTH OUTER JOIN

LEFT OUTER JOIN


Todas as linhas da tabela da esquerda sero retornadas,

independente se combinam ou no com a condio do identificador ON.


Problema: Mostrar todos os clientes e seus respectivos pedidos,

independente do cliente ter comprado ou no.


TBCliente CodCliente: INTEGER NomeCliente: VARCHAR(60) Endereco: VARCHAR(50) Cidade: VARCHAR(30) Estado: VARCHAR(2) CPF: VARCHAR(15) DataNascimento: DATE TBPedido CodPedido: INTEGER PrazoEntrega: INTEGER CodVendedor: INTEGER CodCliente: INTEGER

Tabela da Esquerda

Tabela da Direita

LEFT OUTER JOIN


select A.nomecliente, A.codcliente, B.codpedido from tbcliente A LEFT OUTER JOIN tbpedido B on A.codcliente = B.codcliente
Observe que a clusula WHERE substituda pela clusula ON

LEFT OUTER JOIN


O resultado trs todos os clientes que compraram e no compraram. Note que os clientes que no efetuaram pedido possuem o contedo NULL no campo CodigoPedido.

Poderia Identificar clientes que no compraram nada.

Como?????
VIEWS

LEFT OUTER JOIN


Problema: Mostrar o cdigo, nome e quantidade de vendas de

todos os vendedores, independente do vendedor ter vendido ou no.


TBPedido CodPedido: INTEGER

Tabela da Direita

PrazoEntrega: INTEGER CodVendedor: INTEGER CodCliente: INTEGER

TBVendedor

Tabela da Esquerda

CodVendedor: INTEGER NomeVendedor: VARCHAR(60) FaixaComissao: INTEGER Salario: DECIMAL(10,2)

LEFT OUTER JOIN


select A.codVendedor, A.nomeVendedor, COUNT(B.codpedido) from tbvendedor A LEFT OUTER JOIN tbpedido B on A.codVendedor = B.codVendedor group by A.codVendedor, A.nomeVendedor

LEFT OUTER JOIN

A vendedora Regina Reis no efetuou nenhuma venda. Porm, como o nosso select trs todas as referencias da tabela da esquerda ela aparece com o valor 0 no campo contador.

RIGHT OUTER JOIN


Todas as linhas da tabela da direita sero retornadas,

independente se combinam ou no com com a condio do identificador ON.


Problema: Exibir uma lista de todos os produtos e seus

respectivos pedidos. Inclusive produtos que no esto em nenhum pedido.


TBItensPedido TBProduto CodProduto: INTEGER Descricao: VARCHAR(50) Unidade: VARCHAR(2) ValorUnitario: DECIMAL(10,2)

Tabela da Esquerda

CodProduto: INTEGER CodPedido: INTEGER Quantidade: INTEGER

Tabela da Direita

RIGHT OUTER JOIN


select A.CodPedido, B.Descricao from tbitenspedido A RIGHT OUTER JOIN tbproduto B on A.CodProduto = B.codProduto

RIGHT OUTER JOIN


O resultado trs todos os produtos bem como o cdigo do pedido ao qual o produto faz parte. Note que os produtos que no esto em nenhum pedido aparecem com o valor campo codPedido igual a NULL.

INNER JOIN
Liga as linhas das tabelas baseado na condio da

ligao, e retorna somente as linhas que combinam entre si.


Problema: Exibir somente o nome dos vendedores que fizeram

venda.
TBVendedor CodVendedor: INTEGER
Tabela da Esquerda

TBPedido CodPedido: INTEGER PrazoEntrega: INTEGER CodVendedor: INTEGER CodCliente: INTEGER


Tabela da Direita

NomeVendedor: VARCHAR(60) FaixaComissao: INTEGER Salario: DECIMAL(10,2)

Somente Iguais

INNER JOIN
select Distinct A.NomeVendedor from tbvendedor A INNER JOIN tbpedido B on A.CodVendedor = B.CodVendedor

INNER JOIN
Importante: Joins com INNER JOIN so as mesmas Joins que

fizemos no incio.
select Distinct A.NomeVendedor from tbvendedor A INNER JOIN tbpedido B on A.CodVendedor = B.CodVendedor select Distinct A.NomeVendedor from tbvendedor A, tbpedido B where A.CodVendedor = B.CodVendedor

Mesma coisa

You might also like