Você está na página 1de 16

Eixo Tecnolgico: GESTO

Curso: Superior de Tecnologia em Anlise e Desenvolvimento de Sistemas


Unidade Curricular / Unidade de Estudo: BANCO DE DADOS I - Manh

Docente: Fbio Giulian Marques

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

Eixo Tecnolgico: GESTO


Curso: Superior de Tecnologia em Anlise e Desenvolvimento de Sistemas
Unidade Curricular / Unidade de Estudo: BANCO DE DADOS I - Manh

Docente: Fbio Giulian Marques

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

Rio Grande do Sul

Buenos Aires

Cordoba

California

Florida

Toscana

Lombardia

10

Aquitania

Eixo Tecnolgico: GESTO


Curso: Superior de Tecnologia em Anlise e Desenvolvimento de Sistemas
Unidade Curricular / Unidade de Estudo: BANCO DE DADOS I - Manh

Docente: Fbio Giulian Marques

Mdulo/Semestre: 3 SEMESTRE

11

Borgonha

12

Calabria

13

Massachussetts

14

Chiapas

Null
Tabela Pas

codigo

pais

Brasil

Argentina

Estados Unidos

Italia

Franca

Noruega

Script SQL para criao das tabelas


Tabela cidade
CREATE TABLE "public"."cidade" (
"codigo_cidade" SERIAL,
"nome_cidade" VARCHAR(50),
"codigo_subregiao" INTEGER,
CONSTRAINT "cidade_pkey" PRIMARY
KEY("codigo_cidade")
) WITH OIDS;
Tabela subregiao
CREATE TABLE "public"."subregiao" (
"codigo_subregiao" SERIAL,
"nome_subregiao" VARCHAR(50),
"codigo_pais" INTEGER,

Aula 9
2011 / 01

Eixo Tecnolgico: GESTO


Curso: Superior de Tecnologia em Anlise e Desenvolvimento de Sistemas
Unidade Curricular / Unidade de Estudo: BANCO DE DADOS I - Manh

Docente: Fbio Giulian Marques

CONSTRAINT "subregiao_pkey" PRIMARY


KEY("codigo_subregiao")
) WITH OIDS;
Tabela pas
CREATE TABLE "public"."pais" (
"codigo_pais" SERIAL,
"nome_pais" VARCHAR(50),
CONSTRAINT "pais_pkey" PRIMARY
KEY("codigo_pais")
) WITH OIDS;
Insero de dados
INSERT INTO pais (nome_pais) VALUES ('Brasil');
INSERT INTO pais (nome_pais) VALUES ('Argentina');
INSERT INTO pais (nome_pais) VALUES ('Estados
Unidos');
INSERT INTO pais (nome_pais) VALUES ('Italia');
INSERT INTO pais (nome_pais) VALUES ('Franca');
INSERT INTO pais (nome_pais) VALUES ('Noruega');
INSERT INTO subregiao ( nome_subregiao, codigo_pais)
VALUES ( 'Parana', 1);
INSERT INTO subregiao ( nome_subregiao, codigo_pais)
VALUES ( 'Sao Paulo', 1);
INSERT INTO subregiao ( nome_subregiao, codigo_pais)
VALUES ( 'Rio Grande do Sul', 1);
INSERT INTO subregiao ( nome_subregiao, codigo_pais)
VALUES ( 'Buenos Aires', 2);
INSERT INTO subregiao ( nome_subregiao, codigo_pais)
VALUES ( 'Cordoba', 2);
INSERT INTO subregiao ( nome_subregiao, codigo_pais)
VALUES ( 'California', 3);
INSERT INTO subregiao ( nome_subregiao, codigo_pais)
VALUES ( 'Florida', 3);
INSERT INTO subregiao ( nome_subregiao, codigo_pais)
VALUES ( 'Toscana', 4);
INSERT INTO subregiao ( nome_subregiao, codigo_pais)
VALUES ( 'Lombardia', 4);
INSERT INTO subregiao ( nome_subregiao, codigo_pais)

Aula 9
2011 / 01

Mdulo/Semestre: 3 SEMESTRE

Eixo Tecnolgico: GESTO


Curso: Superior de Tecnologia em Anlise e Desenvolvimento de Sistemas
Unidade Curricular / Unidade de Estudo: BANCO DE DADOS I - Manh

Docente: Fbio Giulian Marques

Aula 9
2011 / 01

Mdulo/Semestre: 3 SEMESTRE

VALUES ( 'Aquitania', 5);


INSERT INTO subregiao ( nome_subregiao, codigo_pais)
VALUES ( 'Borgonha', 5);
INSERT INTO subregiao ( nome_subregiao, codigo_pais)
VALUES ( 'Calabria', 5);
INSERT INTO subregiao ( nome_subregiao, codigo_pais)
VALUES ( 'Massachussetts', 3);
INSERT INTO subregiao ( nome_subregiao, codigo_pais)
VALUES ( 'Chiapas', NULL);
INSERT INTO cidade (nome_cidade, codigo_subregiao)
VALUES ('Curitiba', 1);
INSERT INTO cidade (nome_cidade, codigo_subregiao)
VALUES ('Sao Paulo', 2);
INSERT INTO cidade (nome_cidade, codigo_subregiao)
VALUES ('Guarulhos', 2);
INSERT INTO cidade (nome_cidade, codigo_subregiao)
VALUES ('Buenos Aires', 4);
INSERT INTO cidade (nome_cidade, codigo_subregiao)
VALUES ('La Plata', 4);
INSERT INTO cidade (nome_cidade, codigo_subregiao)
VALUES ('Cordoba', 5);
INSERT INTO cidade (nome_cidade, codigo_subregiao)
VALUES ('Los Angeles', 6);
INSERT INTO cidade (nome_cidade, codigo_subregiao)
VALUES ('San Francisco', 6);
INSERT INTO cidade (nome_cidade, codigo_subregiao)
VALUES ('Orlando', 7);
INSERT INTO cidade (nome_cidade, codigo_subregiao)
VALUES ('Miami', 7);
INSERT INTO cidade (nome_cidade, codigo_subregiao)
VALUES ('Siena', 8);
INSERT INTO cidade (nome_cidade, codigo_subregiao)
VALUES ('Florenca', 8);
INSERT INTO cidade (nome_cidade, codigo_subregiao)
VALUES ('Milao', 9);
INSERT INTO cidade (nome_cidade, codigo_subregiao)
VALUES ('Yokohama', NULL);
A juno de tabelas ocasiona uma tabela derivada de outras duas tabelas (reais ou derivadas), de
acordo com as regras do tipo de juno. No PostgreSQL as junes so classificadas como sendo
qualificadas ou cruzadas.
Junes cruzadas
SELECT * FROM Tabela1 CROSS JOIN Tabela2

Eixo Tecnolgico: GESTO


Curso: Superior de Tecnologia em Anlise e Desenvolvimento de Sistemas
Unidade Curricular / Unidade de Estudo: BANCO DE DADOS I - Manh

Docente: Fbio Giulian Marques

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

Eixo Tecnolgico: GESTO


Curso: Superior de Tecnologia em Anlise e Desenvolvimento de Sistemas
Unidade Curricular / Unidade de Estudo: BANCO DE DADOS I - Manh

Docente: Fbio Giulian Marques

Aula 9
2011 / 01

Mdulo/Semestre: 3 SEMESTRE

um resultado verdade (true) para este par de linhas.


SELECT * FROM cidade INNER JOIN subregiao ON
cidade.codigo_subregiao = subregiao.codigo_subregiao
SELECT * FROM cidade, subregiao where cidade.codigo_subregiao = subregiao.codigo_subregiao
codigo_
cidade

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

Eixo Tecnolgico: GESTO


Curso: Superior de Tecnologia em Anlise e Desenvolvimento de Sistemas
Unidade Curricular / Unidade de Estudo: BANCO DE DADOS I - Manh

Docente: Fbio Giulian Marques

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

Eixo Tecnolgico: GESTO


Curso: Superior de Tecnologia em Anlise e Desenvolvimento de Sistemas
Unidade Curricular / Unidade de Estudo: BANCO DE DADOS I - Manh

Docente: Fbio Giulian Marques

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

Eixo Tecnolgico: GESTO


Curso: Superior de Tecnologia em Anlise e Desenvolvimento de Sistemas
Unidade Curricular / Unidade de Estudo: BANCO DE DADOS I - Manh

Docente: Fbio Giulian Marques

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

Rio Grande do Sul

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

Eixo Tecnolgico: GESTO


Curso: Superior de Tecnologia em Anlise e Desenvolvimento de Sistemas
Unidade Curricular / Unidade de Estudo: BANCO DE DADOS I - Manh

Docente: Fbio Giulian Marques

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

Eixo Tecnolgico: GESTO


Curso: Superior de Tecnologia em Anlise e Desenvolvimento de Sistemas
Unidade Curricular / Unidade de Estudo: BANCO DE DADOS I - Manh

Docente: Fbio Giulian Marques

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

Eixo Tecnolgico: GESTO


Curso: Superior de Tecnologia em Anlise e Desenvolvimento de Sistemas
Unidade Curricular / Unidade de Estudo: BANCO DE DADOS I - Manh

Docente: Fbio Giulian Marques

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

Eixo Tecnolgico: GESTO


Curso: Superior de Tecnologia em Anlise e Desenvolvimento de Sistemas
Unidade Curricular / Unidade de Estudo: BANCO DE DADOS I - Manh

Docente: Fbio Giulian Marques

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'

Ateno nas condies da consulta


Quando se usa juno externa deve-se ter muito cuidado com as condies utilizadas na consulta,
pois, lembre-se que nestas consultas mesmo que a condio no satisfaa uma linha em comparao
com linhas da outra tabela, elas sero retornadas acompanhadas de valores nulos. Vejam um
exemplo:
Se acaso quiser saber quais so as cidades registradas como sendo da regio de Toscana, as
consultas abaixo podem no ser as mais apropriadas:
SELECT cidade.descricao, subregiao.descricao FROM cidade LEFT OUTER JOIN subregiao ON
cidade.codigo_subregiao = subregiao.codigo_subregiao AND subregiao.descricao = "Toscana"
descricao

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

Eixo Tecnolgico: GESTO


Curso: Superior de Tecnologia em Anlise e Desenvolvimento de Sistemas
Unidade Curricular / Unidade de Estudo: BANCO DE DADOS I - Manh

Docente: Fbio Giulian Marques

Siena

Toscana

Florenca

Toscana

Milao

Null

Yokohama

Null

Aula 9
2011 / 01

Mdulo/Semestre: 3 SEMESTRE

SELECT nome_cidade, nome_subregiao FROM cidade RIGHT OUTER JOIN subregiao


ON cidade.codigo_subregiao = subregiao.codigo_subregiao AND nome_subregiao = 'Toscana'
descricao

descricao_1

Null

Parana

Null

Sao Paulo

Null

Rio Grande do Sul

Null

Buenos Aires

Null

Cordoba

Null

California

Null

Florida

Siena

Toscana

Florenca

Toscana

Null

Lombardia

Eixo Tecnolgico: GESTO


Curso: Superior de Tecnologia em Anlise e Desenvolvimento de Sistemas
Unidade Curricular / Unidade de Estudo: BANCO DE DADOS I - Manh

Docente: Fbio Giulian Marques

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

Você também pode gostar