Escolar Documentos
Profissional Documentos
Cultura Documentos
Aula 9
2011 / 01
Mdulo/Semestre: 3 SEMESTRE
SENAC
Aula Banco de Dados I
Para os exemplos se utilizar uma estrutura de trs tabelas simples com alguns dados inseridos. O
diagrama abaixo representa o relacionamento entre as tabelas:
Tabela Cidade
codigo
cidade
subregiao
Curitiba
Sao Paulo
Guarulhos
Buenos Aires
Aula 9
2011 / 01
Mdulo/Semestre: 3 SEMESTRE
La Plata
Cordoba
Los Angeles
San Francisco
Orlando
10
Miami
11
Siena
12
Florenca
13
Milao
14
Yokohama
Null
Tabela Subregiao
codigo
subregiao
pais
Parana
Sao Paulo
Buenos Aires
Cordoba
California
Florida
Toscana
Lombardia
10
Aquitania
Mdulo/Semestre: 3 SEMESTRE
11
Borgonha
12
Calabria
13
Massachussetts
14
Chiapas
Null
Tabela Pas
codigo
pais
Brasil
Argentina
Estados Unidos
Italia
Franca
Noruega
Aula 9
2011 / 01
Aula 9
2011 / 01
Mdulo/Semestre: 3 SEMESTRE
Aula 9
2011 / 01
Mdulo/Semestre: 3 SEMESTRE
Aula 9
2011 / 01
Mdulo/Semestre: 3 SEMESTRE
Cada linha de Tabela1 ir combinar-se com todas as linhas de Tabelas2. Para cada combinao de
linhas de Tabela1 e Tabela2, a tabela derivada conter uma linha com todas as colunas de Tabela1
seguidas por todas as colunas de Tabela2. O nmero de linhas retornadas por esta consulta sempre
ser o nmero de linhas de Tabela1 multiplicado pelo nmero de linha de Tabela2. Por exemplo, se
Tabela1 possuir 20 linhas e Tabela2 possuir 10 linhas, ser retornado 200 linhas. A consulta
SELECT * FROM cidade CROSS JOIN subregiao de nosso exemplo retornar 196 linhas.
Destas 196 linhas retornadas a maioria pode ser considerada intil, portanto, deve-se selecionar os
nossos dados atravs de condies para nossa consulta. Essas condies so adicionadas atravs de
clusula WHERE.
SELECT * FROM cidade CROSS JOIN subregiao WHERE cidade.codigo_subregiao =
subregiao.codigo_subregiao
O uso de CROSS JOIN permite a juno de apenas duas tabelas. No entanto, nosso exemplo precisa
juntar trs tabelas, para isso, teremos que primeiro unir duas tabelas, para que o resultado desta
juno seja utilizado com a terceira tabela.
SELECT * FROM cidade CROSS JOIN (subregiao CROSS JOIN pais).
Utilizar SELECT * FROM cidade CROSS JOIN subregiao equivale a utilizar SELECT * FROM
cidade, subregiao, tanto uma como outra retornar as mesmas 196 linhas e utilizar SELECT *
FROM cidade CROSS JOIN (subregiao CROSS JOIN pais) equivale a SELECT * FROM cidade,
subregiao, pais, ambas retornaro as mesmas 1176 linhas.
SELECT * FROM cidade, subregiao where cidade.codigo_subregiao = subregiao.codigo_subregiao
Junes Qualificadas
As junes qualificadas trazem um pouquinho mais de complexidade e so divididas em junes
internas e externas. Na utilizao de juno qualificada, se no for especificado como juno interna
ou externa, por padro o PostgreSQL considera como sendo interna.
Junes internas
A utilizao da clusula INNER o que caracteriza o comando para uma juno interna, porm, ele
no obrigatrio. Pode parecer primeira vista que as junes internas se equiparam com as
junes cruzadas vistas anteriormente, at por que as duas consultas a seguir so equivalentes:
SELECT * FROM cidade CROSS JOIN subregiao
SELECT * FROM cidade INNER JOIN subregiao ON TRUE
Mas nas junes internas sempre obrigatria a especificao de condio de juno, ou seja, quais
linhas de uma tabela tm alguma ligao com a linha de outra tabela. Para isso podemos utilizar
uma das clusulas ON ou USING ou utilizar a palavra NATURAL no nosso comando.
A clusula ON o mais comumente utilizado por se assemelhar com a clusula WHERE, ou seja,
um par de linhas de Tabela1 e Tabela2 so correspondentes, se a expresso da clusula ON produz
Aula 9
2011 / 01
Mdulo/Semestre: 3 SEMESTRE
nome_
cidade
codigo_
subregiao
codigo_
subregiao_1
nome_subregiao
codigo_pais
Curitiba
Parana
Sao Paulo
Sao Paulo
Guarulhos
Sao Paulo
Buenos
Aires
Buenos Aires
La Plata
Buenos Aires
Cordoba
Cordoba
San
Francisco
California
Los
Angeles
California
Orlando
Florida
10
Miami
Florida
11
Siena
Toscana
12
Florenca
Toscana
13
Milao
Lombardia
Aula 9
2011 / 01
Mdulo/Semestre: 3 SEMESTRE
A clusula USING traz alguma semelhana com o ON, por tambm retornar um valor verdadeiro ou
falso para aquele conjunto de linhas, no entanto, ele uma forma mais rpida e abreviada de criao
da consulta. Passando um nome de coluna, a execuo desta consulta ir procurar nas tabelas a
coluna especificada e comparar as duas. Por exemplo, t1 INNER JOIN t2 USING (a, b, c) equivale
a t1 INNER JOIN t2 ON (t1.a = t2.a AND t1.b = t2.b AND t1.c = t2.c). Portanto, a consulta anterior
equivale consulta abaixo:
SELECT * FROM subregiao INNER JOIN cidade USING (codigo_subregiao)
Para facilitar mais, existe a utilizao de NATURAL, que nada mais abreviao de USING. Com
NATURAL, a consulta encontrar todas as colunas que tem nomes iguais nas duas tabelas e far a
comparao de igualdade. O exemplo de USING acima equivale ao seguinte:
SELECT * FROM subregiao NATURAL INNER JOIN cidade
Mas cuidado com a utilizao de NATURAL, pois, ele vai comparar todas as colunas com nomes
iguais, o que pode trazer resultados inesperados quando houver duas colunas com o mesmo nome e
estas no tenham nenhuma relao.
Compare
SELECT * FROM subregiao NATURAL INNER JOIN cidade
where nome_subregiao = 'California'
Junes Externas
Para representar uma juno externa utiliza-se a clusula OUTER, no entanto, ela no obrigatria.
O que caracteriza realmente as junes externas so as clusulas LEFT, RIGHT e FULL. As
clusulas ON, USING e NATURAL valem da mesma forma nas junes internas e externas.
LEFT OUTER JOIN
Primeiro, uma juno interna realizada. Depois, para cada linha de T1 que no satisfaz a condio
de juno com nenhuma linha de T2, uma linha juntada adicionada com valores nulos nas colunas
de T2. Portanto, a tabela juntada possui, incondicionalmente, no mnimo uma linha para cada linha
de
T1.
SELECT * FROM subregiao LEFT OUTER JOIN cidade USING (codigo_subregiao)
codigo_subregiao
nome_subregiao
codigo_pais
codigo_cidade
nome_cidade
Parana
Curitiba
Sao Paulo
Sao Paulo
Sao Paulo
Guarulhos
Aula 9
2011 / 01
Mdulo/Semestre: 3 SEMESTRE
Rio G. do Sul
Null
Null
Buenos Aires
Buenos Aires
Buenos Aires
La Plata
Cordoba
Cordoba
California
Los Angeles
California
San Francisco
Florida
Orlando
Florida
10
Miami
Toscana
11
Siena
Toscana
12
Florenca
Lombardia
13
Milao
10
Aquitania
Null
Null
11
Borgonha
Null
Null
12 Calabria
Null Null
13 Massachussetts
Null Null
Reparem nas linhas destacadass acima. As sub-regies Rio Grande do Sul, Aquitania, Borgonha,
Calabria e Massachussets no possuem nenhuma cidade registrada. Em uma consulta normal eles
seriam ignorados. Com o uso de LEFT todos as linhas das tabelas da esquerda que no possuem
correspondentes na tabela da direita so acrescidas no resultado da consulta.
RIGHT OUTER JOIN
Primeiro, uma juno interna realizada. Depois, para cada linha de T2 que no satisfaz a condio
de juno com nenhuma linha de T1, uma linha juntada adicionada com valores nulos nas colunas
Aula 9
2011 / 01
Mdulo/Semestre: 3 SEMESTRE
de T1. o oposto da juno esquerda: a tabela resultante possui, incondicionalmente, uma linha
para cada linha de T2.
SELECT * FROM subregiao RIGHT OUTER JOIN pais USING (codigo_pais)
codigo_pais
codigo_subregiao
nome_subregiao
nome_cidade
Sao Paulo
Brasil
Brasil
Parana
Brasil
Buenos Aires
Argentina
Cordoba
Argentina
13
Massachussetts
Estados Unidos
California
Estados Unidos
Florida
Estados Unidos
Lombardia
Italia
Toscana
Italia
10
Aquitania
Franca
11
Borgonha
Franca
12
Calabria
Franca
Null
Null
Noruega
Basicamente, a diferena entre RIGHT e LEFT est na escolha da tabela em que os elementos que
no possuem correspondentes sero escolhidos para ser acrescidos no resultado da consulta. Neste
exemplo, Noruega no tem nenhuma sub-regio cadastrada, mas mesmo assim ele entra no
Aula 9
2011 / 01
Mdulo/Semestre: 3 SEMESTRE
resultado final.
FULL OUTER JOIN
Primeiro, uma juno interna realizada. Depois, para cada linha de T1 que no satisfaz a condio
de juno com nenhuma linha de T2, uma linha juntada adicionada com valores nulos nas colunas
de T2. Tambm, para cada linha de T2 que no satisfaz a condio de juno com nenhuma linha de
T1, uma linha juntada com valores nulos nas colunas de T1 adicionada.
SELECT * FROM subregiao FULL OUTER JOIN cidade USING (codigo_subregiao)
codigo_sub nome_subregia codigo_p codigo_c nome_cidad
regiao
o
ais
idade
e
1 Parana
1 Curitiba
2 Sao Paulo
2 Sao Paulo
2 Sao Paulo
3 Guarulhos
3 Rio G. do Sul
4 Buenos Aires
4 Buenos Aires
5 La Plata
5 Cordoba
6 Cordoba
6 California
6 California
7 Los Angeles
7 Florida
9 Orlando
7 Florida
10 Miami
8 Toscana
11 Siena
Null Null
Buenos
Aires
San
Francisco
Mdulo/Semestre: 3 SEMESTRE
8 Toscana
12 Florenca
9 Lombardia
13 Milao
10 Aquitania
Null Null
11 Borgonha
Null Null
12 Calabria
Null Null
13 Massachussetts
Null Null
Null Null
Aula 9
2011 / 01
Null
14 Yokohama
O uso de FULL no nada mais que a utilizao de RIGHT e LEFT juntos. Neste exemplo, foram
acrescidos 5 sub-regies que no posuem nenhum correspondente na tabela de cidade e nesta
consulta apareceu a cidade de Yokohama que no possui uma sub-regio.
Para buscarmos todos os dados de nossas tabelas utilizando JOIN podemos usar o seguinte
comando:
SELECT * FROM cidade FULL JOIN (subregiao FULL JOIN pais USING (codigo_pais)) USING
(codigo_subregiao)
ou
SELECT * FROM cidade FULL JOIN subregiao FULL JOIN pais USING (codigo_pais) USING
(codigo_subregiao)
codigo_ codigo_
subregiao cidade
nome_cidade
codigo_
pais
nome_subregiao
nome_pais
Curitiba
Parana
Brasil
Sao Paulo
Sao Paulo
Brasil
Guarulhos
Sao Paulo
Brasil
Null
Null
Rio G. do Sul
Brasil
Buenos Aires
Buenos Aires
Argentina
Aula 9
2011 / 01
Mdulo/Semestre: 3 SEMESTRE
La Plata
Buenos Aires
Argentina
Cordoba
Cordoba
Argentina
San Francisco
California
Estados
Unidos
Los Angeles
California
Estados
Unidos
Orlando
Florida
Estados
Unidos
10
Miami
Florida
Estados
Unidos
11
Siena
Toscana
Itlia
12
Florenca
Toscana
Itlia
13
Milao
Lombardia
Itlia
Null
14
Yokohama
Null
Null
Null
10
Null
Null
Aquitania
Franca
11
Null
Null
Borgonha
Franca
12
Null
Null
Calabria
Franca
13
Null
Null
Massachussets
Estados
Unidos
14
Null
Null
Null
Chiapas
Null
Null
Null
Null
Null
Noruega
Compare
Aula 9
2011 / 01
Mdulo/Semestre: 3 SEMESTRE
SELECT * FROM cidade FULL JOIN (subregiao FULL JOIN pais USING (codigo_pais))
USING (codigo_subregiao) where nome_subregiao = 'Florida'
descricao_1
Curitiba
Null
Sao Paulo
Null
Guarulhos
Null
Buenos Aires
Null
La Plata
Null
Cordoba
Null
San Francisco
Null
Los Angeles
Null
Orlando
Null
Miami
Null
Siena
Toscana
Florenca
Toscana
Milao
Null
Yokohama
Null
Aula 9
2011 / 01
Mdulo/Semestre: 3 SEMESTRE
descricao_1
Null
Parana
Null
Sao Paulo
Null
Null
Buenos Aires
Null
Cordoba
Null
California
Null
Florida
Siena
Toscana
Florenca
Toscana
Null
Lombardia
Null
Aquitania
Null
Borgonha
Null
Calabria
Null
Massachussetts
Null
Chiapas
Aula 9
2011 / 01
Mdulo/Semestre: 3 SEMESTRE
Compare
SELECT nome_cidade, nome_subregiao FROM cidade LEFT OUTER JOIN subregiao
ON cidade.codigo_subregiao = subregiao.codigo_subregiao AND nome_subregiao = 'Toscana'
O mais correto para esta consulta utilizar
SELECT nome_cidade, nome_subregiao FROM cidade INNER JOIN subregiao
USING (codigo_subregiao) WHERE nome_subregiao = 'Toscana'
ou
SELECT nome_cidade, nome_subregiao FROM cidade INNER JOIN subregiao
ON cidade.codigo_subregiao = subregiao.codigo_subregiao AND nome_subregiao = 'Toscana'
que retornaro o mesmo resultado:
nome_cidade
nome_subregiao
Siena
Toscana
Florenca
Toscana