Você está na página 1de 61

CAPITULO 6

A lgebra relacional
6.1 INTRODUO
A parte de manipulao do modelo relacional evoluiu
consideravelmente desde a publicao dos artigos originais de
Codd sobre o assunto [5.1, 6.1]. Porm, ainda verdade que o
principal componente dessa parte de manipulao aquilo que
se denomina lgebra relacional, a qual basicamente apenas
um conjunto de operadores que tomam relaes como seus
operandos e retornam uma relao como seu resultado. No
Captulo 3, discutimos trs desses operadores restrio,
projeo e juno de modo muito breve; neste captulo,
examinaremos em profundidade esses operadores e muitos
outros.
Na referncia [6.1], Codd definiu aquilo que se considera
normalmente como a lgebra original, ou seja, o conjunto de
oito operadores mostrados simbolicamente na Figura 6.1. Codd
tinha em mente um propsito muito especfico, que
examinaremos no prximo captulo, ao definir com preciso
esses oito operadores. Porm, o leitor deve entender que
esses oito operadores no so, de modo algum, os nicos; na
verdade, qualquer nmero de operadores poderia ser definido
satisfazendo simples exigncia de relaes que entram,
relaes que saem e muitos desses operadores tm de fato
sido propostos por vrios autores diferentes (por exemplo,
consulte a referncia [6.10]). Neste captulo, descreveremos
primeiro os operadores originais de Codd (ou pelo menos nossa
verso deles) e os utilizaremos como base para a discusso de
uma grande variedade de idias de lgebra; em seguida,
consideraremos maneiras pelas quais esse conjunto original de
oito operadores poderia ser expandido de modo til.
Uma viso geral da lgebra original
Como foi dito antes, a lgebra original [6.1] consistia em
oito operadores, formando dois grupos de quatro:
1. Os operadores de conjuntos tradicionais unio, interseo,
diferena e produto cartesiano (todos eles um pouco
modificados para levar em conta o fato de que seus operandos
so, especificamente, relaes e no conjuntos arbitrrios).
2. Os operadores relacionais especiais de restrio (tambm
conhecido como seleo), projeo, juno e diviso.
Aqui esto definies simplificadas desses oito operadores
(consulte a Figura 6.1):
Restrio: retorna uma relao contendo todas as tuplas de
uma dada relao que satisfazem a uma condio especificada.
Projeo: retorna uma relao contendo todas as (sub)tuplas
que permanecem em uma relao dada aps terem sido removidos
os atributos especificados.
132
FIGURA 6.1 Os oito operadores originais (viso geral)
Produto: retorna uma relao contendo todas as tuplas
possveis que so uma combinao de duas tuplas, uma tupla
pertencente a cada uma de duas relaes especificadas.
retorna uma relao contendo todas as tuplas que pertencem a
ambas ou a cada uma de duas relaes especificadas.
Interseo: retorna uma relao contendo todas as tuplas que
pertencem s duas relaes especificadas ao mesmo tempo.
Diferena: retorna uma relao contendo todas as tuplas que
pertencem primeira e no segunda entre duas relaes
especificadas.
retorna uma relao contendo todas as tuplas possveis que
so combinaes de duas tuplas, uma tupla de cada uma entre
duas relaes especificadas, de tal modo que as duas tuplas
que contribuem para cada combinao dada tm um valor comum
para os atributos comuns das duas relaes (e esse valor
comum aparece apenas uma vez, e no duas, na tupla
resultante).
Diviso: toma duas relaes unrias e uma relao binria e
retorna uma relao contendo todas as tuplas de uma nica
relao unria que aparecem na relao binria, coincidindo
com todas as tuplas da outra relao unria.
Restrio
Projeo
b b
Produto Cartesiano
a x
a y
x
y
x
c y
Diferena
Unio
Interseo
gos
ssa onsulJito
Juno (natural)
a1 b1 b1 c1 a1 b1 c1
a2 b1 b2 c2 a2 b1 c1
a3 b2 b3 c3 a3 b2 c2
al, nte ses os entos
Diviso
a a1xi1
b a/y[]
bx
c/Y
rios
1110
iei Unio:
de
os Ite,
Juno:
133
Uma razo pela qual exigimos que toda relao resultante
tenha nomes de atributos corretos , naturalmente, a de nos
permitir fazer referncia a esses nomes de atributos em
operaes subsequentes em particular, em operaes que
surgem em outros lugares dentro da expresso aninhada geral.
Por exemplo, no poderamos sequer escrever de modo sensato
uma expresso como:

( F JOIN P ) WHERE CIDADE = Atenas
se no soubssemos que o resultado da avaliao da expresso
F JOIN P teria um atributo chamado ais.CIDADE.
Portanto, o que precisamos ter um conjunto de regras de
inferncia de tipos (de relaes) incorporado lgebra, tal
que, se soubermos o(s) tipo(s) (de relaes) da(s)
relao(es) de entrada para qualquer operao relacional
determinada, possamos inferir o tipo (de relao) da sada
dessa operao. Dadas essas regras, teremos que, uma
expresso relacional arbitrria, no importando o quanto ela
seja complexa, produzir um resultado que tambm ter um tipo
(de relao) bem definido e, em particular, um conjunto bem
definido de nomes de atributos.
Como passo preparatrio para alcanar esse objetivo,
introduzimos um novo operador, RENAME,
cuja finalidade basicamente renomear atributos dentro de
uma relao especificada. Mais precisamente, o operador
RENAME toma uma relao especificada e retorna outra relao
idntica primeira, exceto pelo fato de ao menos um de seus
atributos receber um nome diferente. (Naturalmente, a relao
dada especificada por meio de uma expresso relacional,
talvez envolvendo outras operaes relacionais.) Por exemplo,
poderamos escrever:
F RENAME CIDADE AS FCIDADE
Essa expresso observe que uma expresso, e no um
comando ou instruo, e portanto pode estar aninhada dentro
de outras expresses produz uma relao que tem o mesmo
cabealho e corpo da relao F, exceto pelo fato de que o
atributo da cidade chamado FCIDADE em vez de CIDADE:
Observe que essa expresso RENAME no alterou a varivel de
relao de fornecedores no banco de dados apenas uma
expresso, da mesma forma que (por exemplo) F JOIN FP e, como
qualquer outra expresso, simplesmente produz um certo
resultado (um resultado que, nesse caso particular, muito
semelhante ao valor atual da varivel de relao de
fornecedores).
Aqui est outro exemplo (dessa vez, uma renomeao
mltipla):
P RENAME PNOME AS PN, PESO AS PS
O resultado semelhante a:
135
F# ENOME STATUS ECIDADE
F1 Smith 20 Londres
F2
F3
F4
F5
Jones
Blake
Clark
Adams
10
30
20
30
Paris
Paris
Londres
Atenas
Vale a pena destacar explicitamente que a disponibilidade de
RENAME significa que (diferente SQL) a lgebra relacional no
necessita de nomes de atributos qualificados como F.F#.
6.3 SINTAXE
Nesta seo, apresentamos uma sintaxe concreta (basicamente a
sintaxe de Tutorial D) para expresses de lgebra relacional.
Nota: a maioria dos textos sobre bancos de dados usa uma
notao um tanto matemtica ou grega para os operadores
relacionais, quase sempre empregando para restrio, n para
projeo, n para interseo, >cI para juno, e assim por
diante. Como voc j deve ter notado, preferimos utilizar
palavras-chave como JOIN e WHERE. claro que as palavras-
chave produzem expresses mais longas, mas achamos que elas
tambm geram expresses mais amistosas.
<expresso relacional>
::= RELATION { <lista_com_vrgulas de expresso de tupla>
<nome de varivel de relao>
<operao relacional>
<expresso relacional>
Uma <expresso relacional> uma expresso que denota uma
relao (significando um valor de relao, claro). O
primeiro formato uma invocao de seletor de relao (ela
inclui literais de relaes como um caso especial); no
apresentamos em detalhes aqui a sintaxe de <expresso de
tupla>, na esperana de que os exemplos se mostrem
suficientes para ilustrar a idia geral. Os outros formatos
devem ser auto-explicativos.
<operao relacional>
<projeo> 1 <no-projeo>
Distinguimos <projeo> de <no-projeo> na sintaxe apenas
por razes de precedncia de operadores ( conveniente
atribuir uma precedncia elevada projeo).
<projeo>
:: <expresso relacional>
ALL BUT 1 <lista_com_vrgulas de nomes de atributos>
A <expresso relacional> no deve ser um <no-projeo>.
<no-projeo>
::= <renomear>
<unio> <interseo> <diferena> <produto>
<restrio> |< juno> | <diviso>
<renomear>
:: <expresso relacional>
RENAME <lista_com_vrgulas de renomeao>
136
P# PN COR PS CIDADE
P1 Porca Vermelho 12,0 Londres
P2 Pino Verde 17,0 Paris
P3 Parafuso Azul 17,0 Roma
P4 Parafuso Vermelho 14,0 Londres
P5 Carne Azul 12,0 Paris
P6 Tubo Vermelho 19,0 Londres
A <expresso relacional> no deve ser uma <no-projeo>.
Sobre a sintaxe de <renomeao>, veja os exemplos da seo
anterior.
<unio>
:: <expresso relacional>
UNION <expresso relacional>
Nenhuma <expresso relacional> deve ser <no-projeo>,
exceto pelo fato de que uma ou ambas podem ser outra <unio>.
e da <interseo>
:: <expresso relacional>
INTERSECT <expresso relacional>
Nenhuma <expresso relacional> deve ser <no-projeo>,
exceto pelo fato de que uma ou ambas podem ser outra
<interseo>.
<diferena>
eri- : : <expresso relacional>
es MINUS <expresso relacional>
Nenhuma <expresso relacional> deve ser <no-projeo>.
<produto>
:: <expresso relacional>
TIMES <expresso relacional>
`de Nenhuma <expresso relacional> deve ser <no-projeo>,
exceto pelo fato de que uma ou ambas podem ser outro
<produto>.
pe e
<restrio>
:: <expresso relacional> WHERE <expresso booleana>
A <expresso relacional> no deve ser uma <no-projeo>.
Nota: a <expresso booleana> pode incluir uma referncia a um
atributo da relao denotado pela <expresso relacional>,
onde quer que uma invocao de seletor seja permitida (assim,
por exemplo, F WHERE CIDADE = `Londres' uma <restrio>
vlida).
<juno>
::= <expresso relacional>
JOIN <expresso relacional>
Nenhuma <expresso relacional> deve ser <no-projeo>,
exceto pelo fato de que uma ou ambas podem ser outra
<juno>.
<diviso>
:: <expresso relacional>
DIVIDEBY <expresso relacional> PER <por>
Nenhuma <expresso relacional> deve ser <no-projeo>.
<por>
:: <expresso relacional>
<expresso relacional>, <expresso relacional>
Nenhuma <expresso relacional> deve ser <no-projeo>. 137
6.4 SEMNTICA
Nesta seo, explicaremos com exemplos a sintaxe da Seo
6.3. Vamos considerar os operadores na sequncia unio,
interseo, diferena, produto, restrio, projeo, juno e
diviso (o operador de renomeao foi estudado na Seo 6.2).
Unio
Em matemtica, a unio de dois conjuntos o conjunto de
todos os elementos que pertencem a um ou a ambos os conjuntos
originais. Como uma relao (ou melhor, contm) um
conjunto, na verdade um conjunto de tuplas, obviamente
possvel construir a unio de tais conjuntos; o resultado
ser um conjunto consistindo em todas as tuplas que pertencem
a uma ou ambas as relaes originais. Por exemplo, a unio do
conjunto de tuplas de fornecedores que aparecem atualmente na
varivel de relao F e o conjunto de tuplas de peas que
aparecem atualmente na varivel de relao P com certeza um
conjunto.
Porm, embora esse resultado seja um conjunto, ele no uma
relao; as relaes no podem conter uma mistura de tipos
diferentes de tuplas, elas devem ter tuplas homogneas.
claro que desejamos que o resultado seja uma relao, porque
queremos preservar a propriedade de fechamento. Portanto, a
unio na lgebra relacional no a unio matemtica
habitual; em vez disso, ela um tipo especial de unio, no
qual exigimos que as duas relaes de entrada sejam do mesmo
tipo significando, por exemplo, que ambas contm tuplas de
fornecedores ou ambas contm tuplas de peas, mas no uma
mistura das duas. Se as duas relaes forem do mesmo tipo (de
relao), ento poderemos tomar sua unio, e o resultado
tambm ser uma relao do mesmo tipo (de relao); em outras
palavras, a propriedade de fechamento ser preservada*
Ento, aqui est uma definio do operador relacional de
unio: dadas duas relaes A e B do mesmo tipo, a unio
dessas duas relaes, A UNION B, uma relao do mesmo tipo,
cujo corpo consiste em todas as tuplas t tais que t pertence
a A ou a B, ou ainda a ambas.
Exemplo: sejam as relaes A e B mostradas na Figura 6.2
(ambas so derivadas da varivel de relao de fornecedores
F; A representa os fornecedores de Londres, e B representa os
fornecedores que fornecem a pea P1, falando-se em termos
intuitivos). Ento, A UNION B consulte a parte a. da figura
representa os fornecedores que esto localizados em Londres
ou fornecem a pea P1 (ou ambos). Note que o resultado tem
trs tuplas, no quatro; as tuplas em duplicata so
eliminadas, por definio. Observamos de passagem que a nica
operao alm dessa para a qual surge essa questo de
eliminao de duplicatas a projeo (conforme veremos mais
adiante nesta seo).
Interseo
Como o operador de unio, e essencialmente pela mesma razo,
o operador relacional de interseo exige que seus operandos
sejam do mesmo tipo. Ento, dadas duas relaes A e B do
mesmo tipo, a interseo dessas duas relaes, A INTERSECT B,
uma relao do mesmo tipo, cujo corpo consiste em todas as
tuplas t tais que t pertence a A e a B.
Exemplo: mais uma vez, sejam as relaes A e B mostradas na
Figura 6.2. Ento, A INTERSECT B veja a parte b. da figura
representa os fornecedores localizados em Londres e que
fornecem a pea P1.
Diferena
Como os operadores de unio e interseo, o operador
relacional de diferena tambm exige que seus operandos sejam
do mesmo tipo. Ento, dadas duas relaes A e B do mesmo
tipo, a diferena entre essas duas relaes, A MINUS B (nessa
ordem), uma relao do mesmo tipo, cujo corpo consiste em
todas as tuplas t tais que t pertence a A e no a B.
Historicamente, a maior parte da literatura sobre bancos de
dados (inclusive edies anteriores deste livro) empregava o
termo compatibilidade quanto unio para se referir noo
de que as duas relaes devem ser do mesmo tipo. Contudo, por
uma srie de razes, esse termo no muito adequado; a mais
138
bvia dessas razes o fato de que a noo no se aplica
apenas unio.
F#
Fi F4
b.
F#
ENOME
Interseo
(A INTERSECT B)
F4
Exemplo: sejam novamente as relaes A e B mostradas na
Figura 6.2. ento, A MINUS B veja a parte c. da figura
representa os fornecedores localizados em Londres e que no
fornecem a pea P1, e B MINUS A veja a parte d. da figura
representa os fornecedores que fornecem a pea P1 e que no
esto localizados em Londres. Observe que MINUS tem uma
orientao, do mesmo modo que a subtrao na aritmtica comum
(por exemplo, T5 2 e 2 5 no so a mesma coisa).
Produto
Em matemtica, o produto cartesiano (ou simplesmente produto)
de dois conjuntos o conjunto de todos os pares ordenados
tais que, em cada par, o primeiro elemento vem do primeiro
conjunto e o segundo elemento vem do segundo conjunto. Assim,
o produto cartesiano de duas relaes seria um conjunto de
pares ordenados de tuplas, em termos informais. Porm, mais
uma vez, queremos preservar a propriedade de fechamento; em
outras palavras, queremos que o resultado seja formado por
tuplas propriamente ditas, no por pares ordenados de tuplas.
Portanto, a verso relacional do produto cartesiano uma
forma estendida da operao, na qual cada par ordenado de
tuplas substitudo pela nica tupla que corresponde unio
das duas tuplas em questo (usando-se unio em seu sentido
normal na teoria de conjuntos, no no sentido relacional
especial). Ou seja, dadas as tuplas:
A1:a1, A2:a2, ..., Am:am }
e
A
STATUS
B
CIDADE
F#
20
20
FNOME
Londres
Londres
STATUS
Fi
F4
CIDADE
a. Unio
(A UNION B)
20
20
Londres
Londres
F#
FNOME
STATUS
CIDADE
Fi
F4
F2
-er
o
ai
ri a-
ia
Smith
Clark
Jones
20
20
10
F#
FNOME
STATUS
s
Ti
Fi
CIDADE
Smith
20
Londres
STATUS
CIDADE
20
F#
FNOME
Londres
STATUS
F2
CIDADE
Jones
10
FIGURA 6.2 Exemplos de unio, interseo e diferena
Paris
139
Smith
Clark
c. Diferena
(A
MINUS
8)
FNOME
Clark
Smith
Clark
Londres
Londres
Paris
d. Diferena
(B
MINUS
A)
B1:b1, B2:b2, ..., Bn:bn }
a unio das duas a nica tupla:
A1:a1, A2:a2, ..., Am:am, B1:b1, B2:b2 Bn:bn
Outro problema que ocorre em conexo com o produto cartesiano
que (naturalmente) exigimos que a relao resultante tenha
um cabealho bem formado (isto , que ela seja de um tipo de
relao apropriado). Ora, claro que o cabealho do
resultado consiste em todos os atributos de ambas as relaes
de entrada. Surgir ento um problema se esses dois
cabealhos tiverem quaisquer nomes de atributos em comum; se
a operao fosse permitida, o cabealho resultante teria dois
atributos com o mesmo nome e, desse modo, no seria bem
formado. Por essa razo, se precisarmos construir o produto
cartesiano de duas relaes que tenham em comum quaisquer
nomes de atributos, teremos de usar primeiro o operador
RENAME para renomear os atributos adequadamente.
Assim, definimos o produto cartesiano (relacional) de duas
relaes A e B, A TIMES B, onde A e B no tm nenhum nome de
atributos comum, como uma relao com um cabealho que a
unio (da teoria de conjuntos) dos cabealhos de A e B e com
um corpo que consiste no conjunto de todas as tuplas tais que
t a unio (da teoria de conjuntos) de uma tupla que
pertence a A e uma tupla que pertence a B. Observe que a
cardinalidade do resultado o produto das cardinalidades de
A e B, e que o grau do produto a soma dos graus das
relaes.
Exemplo: sejam as relaes A e B mostradas na Figura 6.3 (A
representa todos os nmeros de fornecedores atuais e B
representa todos os nmeros de peas atuais, falando-se de
modo intuitivo). Ento,A TIMES B veja a parte inferior da
figura representa todos os pares nmero de
fornecedor/nmero de pea atuais.
FIGURA 6.3 Exemplo de produto cartesiano
140
F#
F1 P1
F2 P2
F3 p3
F4 P4
F5 P5
P6
Produto cartesiano (A TIMES B)
F# P#
Fi P1 F2 P1 F3 P1 F4 P1 F5 P1
Fi P2 F2 P2 F3 P2 F4 P2 F5 P2
F1 P3 F2 P3 F3 P3 F4 P3 F5 P3
F1 P4 F2 P4 F3 P4 F4 P4 F5 P4
F1 P5 F2 P5 F3 P5 F4 P5 F5 P5
Fi P6 F2 P6 F3 P6 F4 P6 F5 P6
Restrio
Seja a relao A com os atributos X e Y (e possivelmente
outros), e seja e um operador tipicamente, = , > etc.
tal que a condio X O Y seja bem definida e, dados valores
particulares para X e Y, seja avaliada como um valor verdade
(verdadeiro ou falso). Ento, a restrio O da relao A
sobre os atributos X e Y (nessa ordem)
F WHERE CIDADE = `Londres'
uma relao com o mesmo cabealho de A e cujo corpo
consiste em todas as tuplas t de A tais que a condio x e Y
avaliada como verdadeira para essa tupla t.
Surgem pontos importantes:
1. Uma invocao de seletor (em particular, um literal) pode
aparecer na condio em lugar de X ou Y (ou de ambos); na
verdade, esse ocaso normal. Porm, devemos explicar que
esse caso normal realmente apenas uma abreviao. Por
exemplo, a restrio:
F WHERE CIDADE = `Londres
de fato uma abreviao para uma expresso da forma:
EXTEND F ADD Londres' AS TEMP ) WHERE CIDADE = TEMP
(onde o nome TEMP arbitrrio). Veja a descrio de EXTEND
na Seo 6.7.
2. Uma condio da forma b (onde b uma invocao de seletor
booleano) tambm vlida.
3. A restrio como a definimos permite apenas uma nica
condio na clusula WHERE. Contudo, devido propriedade de
fechamento, possvel estend-la de modo no ambguo a uma
forma na qual a expresso contida na clusula WHERE consiste
em uma combinao booleana arbitrria dessas condies,
graas s seguintes equivalncias:
A WHERE c1 AND c2 = ( A WHERE c1 ) INTERSECT ( A WHERE c2 )
A WHERE c1 OR c2 = ( A WHERE c1 ) UNION ( A WHERE c2 )
A WHERE NOT c = A MINUS ( A WHERE c )
Daqui em diante, ento, faremos a suposio de que a
<expresso booleana> na clusula WHERE de uma restrio
consiste em uma combinao arbitrria de condies (com
parnteses, se necessrio, a fim de indicar uma ordem
desejada de avaliao), onde cada condio por sua vez
envolve apenas atributos da relao pertinente, de invocaes
de seletores ou de ambas. Observe que essa <expresso
booleana> pode ser estabelecida como verdadeira ou falsa para
uma determinada tupla, examinando-se apenas essa tupla
isolada. Uma <expresso booleana> desse tipo dita uma
condio de restrio.
Efetivamente, o operador de restrio produz um subconjunto
horizontal de uma determinada relao ou seja, o
subconjunto das tuplas da relao dada para as quais alguma
condio de restrio especificada satisfeita. Alguns
exemplos so dados na Figura 6.4.
141
F WHERE CIDADE = `Londres
FIGURA 6.4 Exemplos de restries
Projeo
A { X, Y, . . ., 1 }
uma relao com:
tos (por que no?).
P WHERE PESO <
PESO (14,0) 1 P# PN COR PESO CIDADE
1 P1 Porca Vermelho 12,0 Londres
Carne Azul 12,0 Paris
FP WHERE F# = F# ( `F6 )
OR P# = P# ( `P7' ) F# P# QDE
Seja a relao A com os atributos X, Y, ..., Z (e
possivelmente outros). Ento, a projeo da relao A
sobreX,Y,...,Z
- Um cabealho derivado do cabealho de A pela remoo de
todos os atributos no mencionados no conjunto {X, Y, ..., Z
}.
- Um corpo que consiste em todas as tuplas eu {X:x, Y:y, ...,
Z:z} tais que uma tupla aparece emAcomovalorxdeX, ovalorydeY,
...,eovalorzdeZ.
Assim, o operador de projeo produz efetivamente um
subconjunto vertical de uma determinada relao ou seja,
o subconjunto obtido pela remoo de todos os atributos no
mencionados na lista com vrgulas de nomes de atributos
especificada e, em seguida, pela eliminao de (sub)tuplas
duplicadas do restante.
Surgem pontos importantes:
1. Nenhum atributo pode ser mencionado mais de uma vez na
lista_com_vrgulas de nomes de atributos. Se a
lista_com_vrgulas de nomes de atributos mencionar todos os
atributos de A, a projeo ser uma projeo de identidade.
3. Uma projeo da formaA{} isto , uma projeo na qual a
lista_com_vrgulas de nomes de atributos est vazia
vlida. Ela representa uma projeo nulria. Veja os
Exerccios 6.8 a 6.10 no final do captulo.
Alguns exemplos de projees so dados na Figura 6.5. Note no
primeiro exemplo (a projeo de fornecedores sobre CIDADE)
que, embora a varivel de relao F contenha atualmente cinco
tuplas e portanto cinco cidades, h apenas trs cidades no
resultado as duplicatas (ou melhor, as tuplas em duplicata)
so eliminadas. claro que comentrios anlogos tambm se
aplicam aos outros exemplos.
142
FNOME STATUS CIDADE
F1 Smith 20 Londres
F4 Clark 20 Londres
F{CIDADE} 1
CIDADE
1 Londres
Paris
Atenas
FIGURA 6.5 Exemplos de projees
Na prtica, muitas vezes conveniente poder especificar no
os atributos sobre os quais a projeo deve ser tomada, mas
sim os que devem ser projetados para fora (isto ,
removidos). Por exemplo, em vez de dizer projetar a relao
P sobre os atributos P#, PNOME, COR e CIDADE, podemos dizer
projetar o atributo PESO para fora da relao P, como neste
caso:
P { ALL BUT PESO }
Juno
Existem diversas variedades da operao de juno. Porm, de
longe a mais importante a chamada juno natural tanto
que, de fato, o termo juno no qualificado empregado
invariavelmente para indicar de forma especfica a juno
natural, e adotaremos esse uso neste livro. Ento, aqui est
a definio (um pouco abstrata, mas voc j deve estar
familiarizado com a juno natural em um nvel intuitivo,
desde nossas descries feitas no Captulo 3). Sejam as
relaes A e B com os cabealhos
X1, X2 Xm, Y1, Y2, . . ., Yn
e
Y1, Y2, . . ., Yn, Z1, Z2 Zp
respectivamente; isto , os atributos Y1, Y2, ..., Yn de Y
(apenas) so comuns s duas relaes; os atributos X1, X2,
..., Xm de X so os outros atributos de A, e os atributos Z1,
Z2, ..., Zp de Z so os outros atributos de B. Agora,
considere {X1,X2,...,Xm}, {Y1,Y2,...,Yn} e {Z1,Z2,...,Zp}
como trs atributos compostos X, Y e Z, respectivamente.
Ento, a juno natural de A e B
A JOIN B
uma relao com o cabealho {X,Y,Z} e corpo que consiste
no conjunto de todas as tuplas
{X:x,Y:y,Z:z} tal que uma tupla aparece em A com o valor x de
X e o valor y de Y, e uma tupla aparece em
B com o valor y de Y e o valor z de Z.
ata as
ra
uai
143
P { COR, CIDADE
COR CIDADE
Vermelho
Verde
Azul
Azul Londres
Paris
Roma
Paris
(F WHERE CIDADE = Paris ) { F# }
F2
F3
Um exemplo de juno natural (a juno natural F JOIN P,
sobre o atributo comum CIDADE dado na Figura 6.6.
FIGURA 6.6 A juno natural F JOIN P
Nota: observamos vrias vezes esse ponto na verdade, ele
est ilustrado pela Figura 6.6 mas ain da vale a pena
afirmar explicitamente que as junes nem sempre so feitas
entre uma chave estrangeira uma chave primria
correspondente, embora essas junes sejam um caso especial
muito comum e importante.
Agora, voltemos operao juno 9, que se aplica quelas
ocasies (relativamente raras mas de modo algum
desconhecidas) em que precisamos unir duas relaes com base
em algum operador de comparao que no o de igualdade. Sejam
as relaes A e B que satisfazem aos requisitos do produto
cartesiano (ou seja, elas no tm nomes de atributos comuns);
suponha que A tenha um atributo X e que B tenha um atributo
Y, e suponha ainda que X, Y e O atendam aos requisitos da
restrio. Ento, a juno O da relao A sobre o atributo X
com a relao B sobre o atributo Y definida como sendo o
resultado da avaliao da expresso:
( A TIMES 8 ) WHERE X Ei Y
Em outras palavras, uma relao com o mesmo cabealho que o
produto cartesiano deA e B e cujo corpo o conjunto de todas
as tuplas t tais que t pertence ao produto cartesiano e a
condio X O Y tem valor verdadeiro para essa tupla t.
A ttulo de exemplo, suponha que desejamos calcular a juno
maior que da relao F sobre CIDADE com a relao P sobre
CIDADE (ento, O >;vamos considerar que > faz sentido
para as cidades e interpret-lo como algo que quer dizer
simplesmente maior em ordem alfabtica). Uma expresso
relacional apropriada :
F RENAME CIDADE AS FCIDADE ) TIMES
P RENAME CIDADE AS PCIDADE
WHERE FCIDADE > PCIDADE
Observe a mudana de nomes (renomeao) de atributos nesse
exemplo. (Naturalmente, bastaria renomear apenas um dos dois
atributos CIDADE; a nica razo para renomear ambos a
simetria.) O resultado da expresso geral mostrado na
Figura 6.7.
Se @ igual, a juno e chamada equiuno. Segue-se da
definio que o resultado de uma equijuno deve incluir dois
atributos com a propriedade de que os valores desses dois
atributos sejam iguais em cada tupla da relao. Se um desses
dois atributos for eliminado (o que pode ser feito por
projeo) e o outro renomeado de maneira apropriada (se
necessrio), o resultado ser a juno natural! Por exemplo,
a expresso que representa a juno natural de fornecedores e
peas (sobre cidades) F JOIN P
144
F# FNOME STATUS CIDADE P# PNOME COR PESO
F1 Smith 20 Londres P1 Porca Vermelho 12,0
Fi Smith 20 Londres P4 Parafuso Vermelho 14,0
Fi Smith 20 Londres P6 Tubo Vermelho 19,0
F2 Jones 10 Paris P2 Pino Verde 17,0
F2 Jones 10 Paris P5 Came Azul 12,0
F3 Blake 30 Paris P2 Pino Verde 17,0
F3 Blake 30 Paris P5 Came Azul 12,0
F4 Clark 20 Londres P1 Porca Vermelho 12,0
F4 Clark 20 Londres P4 Parafuso Vermelho 14,0
F4 Clark 20 Londres P6 Tubo Vermelho 19,0
equivalente seguinte expresso mais complexa:
F TIMES ( P RENAME CIDADE AS PCIDADE
WHERE FCIDADE = PCIDADE )
{ ALL BUT PCIDADE 1
Nota: Tutorial D no inclui suporte direto para o operador de
juno 9, porque (a) na prtica, ele no necessrio com
muita frequncia e, em todo caso, (b) ele no um operador
primitivo, como j vimos.
FIGURA 6.7 Juno maior que de fornecedores e peas sobre
cidades
Diviso
A referncia [6.3] define dois operadores de diviso
distintos, chamados de Diviso Pequena (Small Divide) e
Diviso Grande (Great Divide), respectivamente. Em Tutorial
D, uma <diviso> em que o <por> consiste apenas em uma
<expresso relacional> uma Diviso Pequena; uma <diviso>
na
o qual <por> consiste em uma lista_com vrgulas entre
parnteses de dois itens <expresso relacional> ja, uma
Diviso Grande. A descrio a seguir se aplica apenas
Diviso Pequena, e somente a uma forma limitada especfica da
Diviso Pequena. Consulte a referncia [6.3] a fim de
examinar uma descrio da Diviso Grande e para ver tambm
detalhes adicionais relativos Diviso Pequena.
Devemos enfatizar que a verso do operador de Diviso Pequena
que discutimos aqui no igual ao operador original de Codd
de fato, uma verso melhorada que supera certas
dificuldades que surgiram com aquele operador original no
caso de relaes vazias. Alm disso, o operador tambm no
igual ao da verso discutida nas primeiras edies deste
livro.
Ento, aqui est a definio. Sejam as relaes A e B com os
cabealhos
{X1,X2, ...,Xm}
e
Y1, Y2 Yn
respectivamente (isto , A e B tm cabealhos disjuntos) e
seja C uma relao com o cabealho
{ X1, X2, ... , Xm, Y1, Y2, ..., Yn
(isto , C tem um cabealho que a unio dos cabealhos de A
e B). Agora, vamos considerar
{X1 ,X2,...,Xm} e {Y1 ,Y2,...,Yn} atributos compostos X e Y
respectivamente. Ento, a diviso de A por B
atravs de C (onde A o dividendo, B o divisor e C o
mediador)
A DIVIDEBY B PER C
uma relao com o cabealho {X} e um corpo que consiste
em todas as tuplas {X:x} tais que uma tupla {X:x,Y:y} aparece
em C para todas as tuplas {Y:y} pertencentes a B. Em outras
palavras, o resultado consiste em todos os valores X de A
cujos valores Y correspondentes em C incluem todos os valores
Y de B, falando-se informalmente. 145
F# FNOME STATUS ECIDADE P# PNOME COR PESO PCIDADE
F2 Jones 10 Paris P1 Porca Vermelho 12,0 Londres
F2 Jones 10 Paris P4 Parafuso Vermelho 14,0 Londres
F2 Jones 10 Paris P6 Tubo Vermelho 19,0 Londres
F3 Blake 30 Paris P1 Porca Vermelho 12,0 Londres
F3 Blake 30 Paris P4 Parafuso Vermelho 14,0 Londres
F3 Blake 30 Paris P6 Tubo Vermelho 19,0 Londres
A Figura 6.8 a seguir mostra alguns exemplos simples de
diviso. O dividendo (DEND) em cada caso a projeo do
valor atual da varivel de relao F sobre F#: o mediador
(MED) em cada caso a projeo do valor atual da varivel de
relao FP sobre F# e P#; os trs divisores (DOR) so os
indicados na figura. Note o ltimo exemplo em particular, no
qual o divisor uma relao contendo nmeros de peas
referentes a todas as peas conhecidas no momento; o
resultado (evidentemente) mostra nmeros de fornecedores que
fornecem todas essas peas. Como esse exemplo sugere, o
operador DIVIDEBY planejado para consultas dessa mesma
natureza geral; de fato, sempre que a verso em linguagem
natural da consulta contm a palavra todos (como em Obter
fornecedores que fornecem todas as peas), existe uma forte
possibilidade de que a diviso esteja envolvida.* Porm, vale
a pena assinalar que essas consultas frequentemente so
expressas com maior facilidade em termos de comparaes
relacionais (consulte a Seo 6.9).
Associatividade e comutatividade
fcil verificar que a operao UNION associativa isto
, se A, B e C so expresses relacionais arbitrrias que
produzem relaes do mesmo tipo, ento as expresses
( A IJNION 8 ) UNION C
e
A UNION ( 8 UNION C )
so logicamente equivalentes. Desse modo permitimos, por
convenincia, que uma sequncia de operaes UNION seja
escrita sem o uso de parnteses; isto , cada uma das
expresses a seguir pode ser simplificada de forma no
ambgua, gerando apenas
A UNION 8 UNION C
Observaes anlogas se aplicam a INTERSECT, TIMES e JOIN
(mas no a MINUS).
Observamos ainda que as operaes UNION, INTERSECT, TIMES e
JOIN (mas no MINUS) tambm so comutativas ou seja, as
expresses
A UNION B
e
B UNION A
tambm so logicamente equivalentes e, de modo semelhante, as
operaes INTERSECT, TIMES e JOIN. Nota: veremos de novo toda
a questo de associatividade e comutatividade no Captulo 17.
A propsito, sobre TIMES, observamos que a operao de
produto cartesiano da teoria de conjuntos no nem
associativa nem comutativa, mas (como acabamos de ver) a
verso relacional tem essas duas propriedades.
Na realidade, a diviso foi especificamente criada por Codd
para ser um equivalente algbrico do quantificador universal
consulte o Captulo 7 de modo muito semelhante criao
da projeo para ser um equivalente algbrico do
quantificador
146 existencial.
Finalmente, observamos que, se A e B no tm nomes dc
atributo em comum, ento A JOIN B equivalente aA TIMES B
[5.5] isto , nesse caso, a juno natural se reduz a um
produto cartesiano. Na realidade, por essa razo a verso de
Tutorial D definida na referncia [3.3] no inclui nenhum
suporte direto para o operador TIMES.
6.5 EXEMPLOS
Nesta seo, apresentaremos alguns exemplos do uso de
expresses de lgebra relacional na formulao de consultas.
Recomenda-se que o leitor confira esses exemplos com as
amostras de dados da Figura 3.8.
6.5.1 Obter nomes de fornecedores correspondentes a
fornecedores
que fornecem a pea P2
FP JOIN F ) WHERE P# = P# ( `P2' ) ) { FNOME
Explicao: primeiro construda a juno natural das
relaes FP e F sobre nmeros de fornecedores, o que tem
conceitualmente o efeito de estender cada tupla de FP com a
informao correspondente sobre fornecedores (isto , os
valores apropriados FNOME, STATUS e CIDADE). Essa juno
ento restrita apenas s tuplas em que o valor de P# P2.
Por fim, essa restrio projetada sobre o atributo FNOME. O
resultado final tem um nico atributo, chamado FNOME.
FIGURA 6.8 Exemplos de diviso
147
6.5.2 Obter nomes de fornecedores correspondentes a
fornecedores
que fornecem pelo menos uma pea vermelha
P WHERE COR = COR ( `Vermelho'
JOIN FP ) { F# } JOIN F ) { FNOME 1
De novo, o nico atributo do resultado FNOME.
A propsito, aqui est uma formulao diferente para a mesma
consulta:
P WHERE COR = COR ( `Vermelho ) ) { P#
JOIN FP ) { F# } JOIN F ) { FNOME
O exemplo ilustra o detalhe importante da existncia
frequente de vrios modos distintos de se formular uma
determinada consulta. Consulte o Captulo 17 para ver uma
discusso de algumas implicaes desse ponto.
6.5.3 Obter nomes de fornecedores correspondentes a
fornecedores
que fornecem todas as peas
( ( F { F# } DIVIDEBY P { P# } PER FP { F#. P# }
JOIN F ) { FNOME }
De novo, o resultado tem somente o atributo chamado FNOME.
6.5.4 Obter nmeros de fornecedores correspondentes a
fornecedores
que fornecem pelo menos todas as peas fornecidas pelo
fornecedor F2
F { F# } DIVIDEBY ( FP WHERE F# = F# ( `F2' ) ) { P# }
PER FP { F#, P#
O resultado tem um nico atributo chamado F#.
6.5.5 Obter todos os pares de nmeros de fornecedores tais
que os
dois fornecedores referidos esto localizados na mesma cidade
F RENAME F# AS FA ) { FA, CIDADE } JOIN
F RENAME F# AS FB ) { FB, CIDADE
WHERE FA < FB ) { FA, FB }
O resultado tem dois atributos, chamados FA e FB ( claro,
seria suficiente renomear apenas um dos dois atributos F#;
renomeamos ambos por simetria). Nota: supomos que o operador
< foi definido para o tipo F#. O propsito da condio FA <
FB duplo:
- Elimina pares de nmeros de fornecedores da forma (x,x).
- Garante que os pares (x,y) e (y,x) no aparecero ao mesmo
tempo.
Mostramos outra formulao dessa consulta para ilustrar o uso
de WITH para introduzir nomes abreviados correspondentes as
expresses e, desse modo, simplificar a tarefa de escrever
consultas longas. (Na verdade, ilustramos WITH uma vez antes,
no Captulo 5, Seo 5.2 na subseo Definio de
operadores.)
148
WITH ( F RENAME F# AS FA ) { FA, CIDADE } AS Ti,
F RENAME F# AS FB ) { FB, CIDADE } AS T2,
Ti JOIN T2 AS T3,
T3 WHERE FA < FB AS T4
T4 { FA, FB }
WITH nos permite raciocinar sobre expresses grandes e
complicadas usando uma abordagem passo a passo, e ainda no
viola de modo algum o caractere no procedural da lgebra
relacional. Aprofundaremos esse ponto na discusso seguinte
ao prximo exemplo.
6.5.6 Obter nomes de fornecedores correspondentes a
fornecedores
que no fornecem a pea P2
F { F# } MINUS ( FP WHERE P# = P# ( P2 ) ) { F#
JOIN F ) { FNOME 1
O resultado tem um nico atributo chamado FNOME.
Conforme prometemos, elaboramos um pouco esse ltimo exemplo
para ilustrar um outro ponto. Nem sempre fcil ver de
imediato como formular uma determinada consulta como uma
nica expresso aninhada. Nem deve ser necessrio faz-lo.
Aqui est uma formulao passo a passo para o Exemplo 6.5.6:
WITH E { F# 1 AS Ti,
FP WHERE P# P# ( P2 ) AS T2,
T2 { F# } AS T3,
Ti MINUS T3 AS T4,
T4 JOIN F AS T5,
T5 { FNOME } AS T6
T6
T6 denota o resultado desejado. Explicao: nomes
introduzidos por uma clusula WITH isto , nomes da forma
Ti no exemplo so considerados locais para a instruo que
contm essa clusula. Agora, se o sistema admitir a
avaliao preguiosa (como fazia, por exemplo, o sistema
PRTV [6.9]), a diviso da consulta geral em uma sequncia de
passos dessa maneira no precisa ter nenhuma implicao de
desempenho indesejvel. Em vez disso, a consulta pode ser
processada como a seguir:
- As expresses que precedem o sinal de dois-pontos no exige
nenhuma avaliao imediata pelo sistema tudo o que o
sistema tem a fazer memoriz-las, juntamente com os nomes
introduzidos pelas clusulas AS correspondentes.
- A expresso que segue o sinal de dois-pontos denota o
resultado final da consulta (no exempio, essa expresso
apenas T6). Quando alcana esse ponto, o sistema no pode
retardar mais a avaliao e, em vez disso, tem de calcular de
algum modo o valor desejado (ou seja, o valor de T6).
- Para avaliar T6, que a projeo de T5 sobre FNOME, o
sistema deve primeiro avaliar T5; para avaliar T5, que a
juno de T4 e F, o sistema primeiro deve avaliar T4 e assim
por diante. Em outras palavras, o sistema efetivamente tem de
avaliar a expresso aninhada original, exatamente como se o
usurio tivesse escrito essa expresso aninhada.
Consulte a prxima seo, que contm uma breve discusso da
questo geral de avaliao dessas expresses aninhadas, e
tambm o Captulo i7 para examinar um tratamento estendido do
mesmo tpico.
149
6.6 PARA QUE SERVE A LGEBRA?
Vamos resumir o que vimos neste captulo at agora: definimos
uma lgebra relacional, isto , uma coleo de operaes
sobre relaes. As operaes em questo so unio,
interseo, diferena, produto, restrio, projeo, juno e
diviso, alm de um operador para renomear atributos, RENAME
(esse em essncia o conjunto que Codd definiu originalmente
na referncia [6.1], com exceo de RENAME). Tambm
apresentamos uma sintaxe para essas operaes e usamos essa
sintaxe como base para uma srie de exemplos e ilustraes.
Porm, conforme observamos em nossas discusses, os oito
operadores de Codd no constituem um conjunto mnimo (nem
jamais houve essa pretenso), porque alguns deles no so
primitivos- eles podem ser definidos em termos dos Outros.
Por exemplo, trs operadores juno, interseo e diviso
podem ser definidos em termos dos outros cinco (consulte o
Exerccio 6.2). Considerando-se que nenhum dos outros cinco
operadores restrio, projeo, produto, unio e diferena*
pode ser definido em termos dos quatro restantes (consulte
o Exerccio 6.4), podemos consider-los um conjunto de
primitivas ou conjunto mnimo (no necessariamente o nico
conjunto, claro). Contudo, na prtica, os outros trs
operadores (especialmente o de juno) so to teis que se
pode criar um bom caso de suporte direto para eles.
Agora, podemos esclarecer um ponto muito importante. Embora
nunca tenhamos dito isso de forma explcita, o texto do
captulo at agora certamente sugeriu que o objetivo
principal da lgebra apenas a busca de dados. No entanto,
no esse o caso. O objetivo fundamental da lgebra
permitir a escrita de expresses relacionais. Essas
expresses por sua vez devem servir a uma variedade de
propsitos, incluindo a busca, claro, mas sem se limitar a
essa nica finalidade. A lista a seguir que no pretende
esgotar o assunto indica algumas aplicaes possveis para
essas expresses:
- Definir um escopo para busca isto , definir os dados a
serem pesquisados em alguma operao de busca (conforme j
discutimos em profundidade).
- Definir um escopo para atualizao ou seja, definir os
dados a serem inseridos, alterados ou eliminados em alguma
operao de atualizao (consulte o Captulo 5).
- Definir restries de integridade isto , definir alguma
restrio qual o banco de dados dever atender.
- Definir variveis de relaes derivadas isto , definir
os dados a serem includos em uma viso ou uma fotografia
(snapshot - consulte o Captulo 9).
- Definir requisitos de estabilidade isto , definir os
dados que devem constituir o escopo de alguma operao de
controle da concorrncia (consulte o Captulo 15).
- Definir restries de segurana ou seja, definir os dados
sobre os quais ser concedida alguma espcie de autorizao
(consulte o Captulo 16).
Na realidade, de modo geral, as expresses servem como uma
representao simblica de alto nvel da inteno do usurio
(por exemplo, com relao a alguma consulta especfica). E
precisamente pelo fato de serem de alto nvel e simblicas
elas podem ser manipuladas de acordo com uma variedade de
regras de transformao simblicas e de alto nvel. Por
exemplo, a expresso:
FP JOIN E ) WHERE P# = P# ( `P2' ) ) { FNOME
(nomes de fornecedores que fornecem a pea P2 Exemplo
6.5.1) pode ser transformada na expresso lgica equivalente,
mas talvez de maior eficincia:
FP WHERE P# = P# ( `P2') ) JOIN F ) { FNOME
*Tendo em vista que (como j vimos) o produto um caso
especial de juno, poderamos substituir produto por juno
nessa lista de primitivas, O mais importante que realmente
tambm precisamos acrescentar RENAME lista, porque nossa
lgebra
150 (diferente daquela definida na referncia [6.1]) se
baseia na nomenclatura de atributos, em vez de se basear na
posio ordinal.
(Exerccio: em que sentido a segunda expresso provavelmente
seria mais eficiente? Por que apenas provavelmente?)
Portanto, a lgebra serve como uma base conveniente para
otimizao (reveja o Captulo 3, Seo 3.5, se precisar
reavivar sua memria a respeito do conceito de otimizao).
Isto , mesmo que o usurio expresse sua consulta na primeira
das duas formas apresentadas, o otimizador deve convert-la
na segunda forma antes de execut-la (no caso ideal, o
desempenho de uma dada consulta no deve depender da
e forma particular na qual o usurio a enuncia). Consulte o
Captulo 17, a fim de observar uma discusso adicional.
Conclumos esta seo observando que, precisamente em funo
de sua natureza fundamental, a lgebra empregada com
frequncia como uma espcie de fita mtrica com o qual pode
ser comparada a
capacidade de expresso de alguma linguagem relacional.
Basicamente, uma linguagem dita completa e em termos
relacionais [6.11 se ela pelo menos to poderosa quanto a
lgebra ou seja, se suas expresses permitem a definio de
toda relao que possa ser definida por meio de expresses da
lgebra (isto
e , a lgebra original descrita nas sees anteriores).
Examinaremos com mais detalhes essa noo de completitude
relacional no prximo captulo.
6.7 OPERADORES ADICIONAIS
Numerosos escritores propuseram novos operadores algbricos
desde que Codd definiu seus oito operadores originais. Nesta
seo, examinaremos alguns desses operadores SEMIJOIN,
SEMIMINUS, EXTEND, SUMMARIZE e TCLOSE com certa
profundidade. Em termos de nossa sintaxe de Tutorial D, esses
opera- dores envolvem cinco novas formas de <no-projeo>,
com os seguintes detalhes especficos:
<semi juno>
:: <expresso relacional>
SEMIJOIN <expresso relacional>
<semi diferena>
:: <expresso relacional>
SEMIMINUS <expresso relacional>
<extenso>
:: EXTEND <expresso relacional>
ADO <lista com vrgulas de adio de extenso>
<adio de extenso>
:: <expresso> AS <nome de atributo>
<totalizao>
::= SUMMARIZE <expresso relacional>
PER <expresso relacional>
ADD <lista com vrgulas de adio de totalizao>
<adio de totalizao>
<tipo de total> [ ( <expresso escalar> ) ]
AS <nome de atributo>
<tipo de total>
:: COUNT 1 SUM AVG 1 MAX MIN 1 ALL 1 ANY
1 COUNTD 1 SUMD AVGD
<tcl ose>
TCLOSE <expresso relacional> 151
As vrias ocorrncias de <expresso relacional> mencionadas
nas regras de produo BNF anteriores no devem ser do tipo
<no-projeo>.
Semijuno
Sejam as relaes A, B, X, Y e Z definidas na subseo
Juno da Seo 6.4. Ento, a semi juno deA com B (nessa
ordem), A SEMIJOIN B, definida como equivalente a:
( A JOIN B ) { X, Y
Em outras palavras, a semi juno de A com B a juno de A
e B projetada sobre os atributos de A. Portanto, o corpo do
resultado consiste (informalmente) nas tuplas de A que tm
uma contraparte em B.
Exemplo: obter F#, FNOME, STATUS e CIDADE para fornecedores
que fornecem a pea P2:
F SEMIJOIN ( FP WHERE P# = P# ( `P2
Semidiferena
Novamente, sejam A, B, X, Y e Z como definidas na subseo
Juno da Seo 6.4. Ento, a semidiferena entre A e B
(nessa ordem), A SEMIMINUS B, definida como a operao
equivalente a:
A MINUS ( A SEMIJOIN B )
Portanto, o corpo do resultado consiste (informalmente) nas
tuplas de A que no tm nenhuma contraparte em B.
Exemplo: obter F#, FNOME, STATUS e CIDADE para fornecedores
que no fornecem a pea P2:
F SEMIMINUS ( FP WHERE P# = P# ( `P2'
Extenso
O leitor deve ter observado que a lgebra que descrevemos at
agora no inclui nenhuma capacidade computacional (no sentido
em que essa expresso costuma ser entendida). Porm, na
prtica, tais recursos so evidentemente desejveis. Por
exemplo, gostaramos de poder recuperar o valor de uma
expresso aritmtica como PESO * 454, ou ento fazer
referncia a tal valor em uma clusula WHERE (lembre-se de
que pesos de peas so dados em libras; a expresso PESO *
454 converter esse peso em gramas*). O objetivo da operao
de extenso fornecer suporte a tais recursos. Mais
precisamente, EXTEND toma uma relao e retorna outra relao
idntica relao dada, a no ser pelo fato de incluir um
atributo adicional, cujos valores so obtidos pela avaliao
(ou seja, pelo clculo) de alguma expresso computacional
especificada. Por exemplo, poderamos escrever:
EXTEND P ADD ( PESO * 454 ) AS PESOGM
Essa expresso observe que mesmo uma expresso, e no um
comando ou uma instruo e, por conseguinte, pode estar
aninhada no interior de outras expresses produz uma
relao com o mesmo cabealho que P, exceto por incluir um
atributo adicional chamado PESOGM. Cada tupla dessa relao
igual tupla correspondente de P, exceto pelo fato de
incluir tambm um valor adicional de PESOGM, calculado de
acordo com a expresso aritmtica especificada. Consulte a
Figura 6.9.
152 * Consideraremos no exemplo que uma operao vlida
entre pesos e inteiros. Qual o tipo do resultado de uma tal
operao?
LO-
PNOME
COR
PESO
CIDADE
PESOGM
FIGURA 6.9 Um exemplo de EXTEND
Importante: observe que essa expresso de EXTEND no alterou
a varivel de relao de peas no banco de dados; apenas
uma expresso, como (por exemplo) F JOIN FP e, como qualquer
outra expresso, simplesmente reproduz um certo resultado
um resultado que, nesse caso particular, muito semelhante
ao valor atual da varivel de relao de peas. (Em outras
palavras, EXTEND no um operador de lgebra relacional
anlogo a ALTER TABLE em SQL.)
Agora podemos usar o atributo PESOGM em projees, restries
etc. Por exemplo:
f eEXTENO
P ADD ( PESO * 454 ) AS PESOGM
WHERE PESOGM > PESO ( 10000,0 ) ) { ALL BUT PESOGM
Nota: naturalmente, uma linguagem mais amistosa para o
usurio permitiria que a expresso escalar aparecesse
diretamente na clusula WHERE:
P WHERE ( PESO * 454 ) > PESO ( 10000,0
No entanto, esse recurso realmente apenas uma reduo
sinttica incua.
Ento, em geral o valor da expresso
EXTEND A ADD exp AS Z
de
ur- definido como uma relao (a) com cabealho igual ao
cabealho de A, estendido com o novo atributo
es- Z e (b) com um corpo formado por todas as tuplas t tais
que t uma tupla de A estendida com um valor
m- para o novo atributo Z computado pela avaliao da
expresso exp sobre essa tupla de A. A relao A no ra- deve
ter um atributo chamado Z, e exp no deve se referir a Z.
Observe que a cardinalidade do resultado te, a
cardinalidade de A e que o grau do resultado igual ao de A
mais uma unidade. O tipo de Z nesse re ui sultado o tipo de
exp.
es- Aqui esto mais alguns exemplos:
1. EXTEND F ADD Fornecedor' AS TAG
Essa expresso efetivamente marca cada tupla do valor atual
da varivel da relao F com o valor de string de caracteres
Fornecedor (um literal ou, de modo mais genrico, uma
invocao de se leto um caso especial de expresso
computacional, claro).
2. EXTEND ( P JOIN FP ) ADD ( PESO * QDE ) AS PESOREMESSA
da Esse exemplo ilustra a aplicao de EXTEND ao resultado de
uma expresso relacional mais com plicad que apenas um nome
de varivel de relao simples.
Ite 3. ( EXTEND F ADD CIDADE AS FCIDADE ) { ALL BUT CIDADE
Um nome de atributo como CIDADE tambm uma expresso
computacional vlida. Observe que esse exemplo equivalente
a:
F RENAME CIDADE AS FCIDADE
153
P1 Porca Vermelho 12,0 Londres 5448,0
P2 Pino Verde 17,0 Paris 7718,0
P3 Parafuso Azul 17,0 Roma 7718,0
P4 Parafuso Vermelho 14,0 Londres 6356,0
P5 Carne Azul 12,0 Paris 5448,0
P6 Tubo Vermelho 19,0 Londres 8626,0
Em outras palavras, RENAME no primitivo! Ele pode ser
definido em termos de EXTEND (e de projeo). E claro que no
desejaramos descartar nosso operador RENAME familiar, por
razes de adequao ao uso mas no mnimo interessante notar
que, na realidade, ele apenas uma abreviao.
4. EXTEND P ADD PESO * 454 AS PESOGM, PESO * 16 AS PESOOZ
Esse exemplo ilustra uma operao EXTEND mltipla.
5. EXTEND F
ADD COUNT ( ( FP RENAME F# AS X ) WHERE X = F# )
AS NP
O resultado dessa expresso mostrado na Figura 6.10.
Explicao:
- Para uma determinada tupla de fornecedor no valor atual da
varivel de relao F, a expresso
( ( FP RENAME F# AS X ) WHERE X = F#
fornece o conjunto de tuplas de remessas correspondentes a
essa tupla de fornecedor no valor atual da varivel de
relao FP.
- O operador agregado COUNT aplicado ento a esse conjunto
de tuplas de remessas e retorna cardinalidade correspondente
(a qual, naturalmente, um valor escalar).
O atributo NP no resultado representa assim o nmero de peas
fornecidas pelo fornecedor identi ficado pelo valor de F#
correspondente. Observe em particular o valor de NP que
corresponde ao fome cedor F5; evidentemente, o conjunto de
tuplas de FP para o fornecedor F5 vazio e, desse modo, a
fun o COUNT retorna zero.
FIGURA 6.10 Outro exemplo de EXTEND
Vamos aprofundar rapidamente essa questo de operadores
agregados. A finalidade de um desses operadores , em geral,
derivar um nico valor escalar a partir dos valores
pertencentes a algum atributo determinado de alguma relao
especificada. Outros exemplos tpicos so SUM, AVG, MAX, MIN,
ALL e ANY. Em Tutorial D, uma <invocao de operador
agregado> que, pelo fato de retornar um valor escalar, um
caso especial de uma <expresso escalar> assume a forma
geral:
<nome de operador> ( <expresso relacional> E, <nome de
atributo> ]
Se <nome de operador> for COUNT, o <nome de atributo> ser
irrelevante e dever ser omitido; caso contrrio, ele poder
ser omitido se e somente se <expresso relacional> denotar
uma relao de grau um e, nesse caso, o nico atributo do
resultado dessa <expresso relacional> ser considerado
default. Aqui esto dois exemplos:
SUM ( FP WHERE F# = F# ( `Fi ), QDE )
SUM ( ( FP WHERE F# = F# ( `Fi') ) { QDE } )
154
F# FNOME STATUS CIDADE NP
Fi
F2
F3
F4
F5
Smith
Jones
Blake
Clark
Adams
20
10
30
20
30
Londres
Paris
Paris
Londres
Atenas
6
2
1
3
O
Note a diferena entre os dois o primeiro d o total de
todas as quantidades de remessas para o fornecedor Fi, e o
segundo d o total de todas as quantidades de remessas
distintas para o fornecedor P1.
Se o argumento para um determinado operador agregado for um
conjunto vazio, COUNT (como vimos) retornar zero, assim como
SUM; por sua vez, MAX e MIN retornaro, respectivamente, o
maior e o menor valor no domnio relevante; ALL e ANY
retornaro verdadeiro e falso, respectivamente; por fim, AVG
ir gerar uma exceo.
Totalizao
Devemos iniciar esta subseo afirmando que a verso de
SUMMARIZE discutida aqui no igual que foi discutida em
verses anteriores deste livro na verdade, uma verso
melhorada que supera certas dificuldades surgidas com a
verso anterior em conexo com relaes vazias.
Como vimos, o operador de extenso fornece um meio de se
incorporarem clculos horizontais ou por linhas lgebra
relacional. O operador de totalizao executa a funo
anloga para clculos verticais ou por colunas. Por
exemplo, a expresso:
SUMMARIZE FP PER FP { P# } ADD SUM ( QDE ) AS QDETOTAL
avaliada como uma relao com o cabealho {P#,QDETOTAL}, na
qual existe uma nica tupla para cada valor de P# na projeo
FP{P#}, contendo esse valor de P# e a quantidade total
correspondente (ver Figura 6.11). Em outras palavras, a
relao FP agrupada conceitualmente em conjuntos de tuplas,
um conjunto para cada valor distinto de P# em P{P#} e, ento,
cada grupo usado para gerar uma tupla do resultado.
Em geral, o valor da expresso:
SUMMARIZE A PER B ADD total AS Z
definido como a seguir:
- Primeiro, B deve ser do mesmo tipo de alguma projeo de A;
isto , todo atributo de B deve ser um atributo de A. Sejam
os atributos dessa projeo (ou, de modo equivalente, de B)
Ai, A2, ..., An.
- O cabealho do resultado consiste nos atributos Ai,A2,
...,An, mais o novo atributo Z.
- O corpo do resultado consiste em todas as tuplas t tais que
t uma tupla de B estendida com um valor para o novo
atributo Z. Esse novo valor de z calculado avaliando-se o
total sobre todas as tuplas deA que tm para A1,A2, ...,An os
mesmos valores que a tupla t. (E claro que, se nenhuma tupla
de A tiver para Ai, A2, ..., An os mesmos valores que a tupla
t, total ser avaliado sobre um conjunto vazio.) A relao B
no deve ter um atributo chamado Z, e total no deve se
referir aZ. Observe que o resultado tem cardinalidade igual
de B e grau igual ao de B mais uma unidade. O tipo de Z nesse
resulta o tipo de total.
FIGURA 6.11 Um exemplo de SUMMARIZE
155
QDETOTAL
P1 600
P2 1000
P3 400
P4 500
P5 500
P6 100
Aqui est outro exemplo:
SUMMARIZE ( P JOIN FP ) PER P { CIDADE } ADD COUNT AS NFP
O resultado semelhante a:
Em outras palavras, o resultado contm uma tupla para cada
uma das trs cidades de peas (Londres, Paris e Roma),
mostrando em cada caso o nmero de remessas de peas
armazenadas nessa cidade.
Surgem alguns detalhes importantes:
1. Nossa sintaxe permite vrios operadores SUMMARIZE. Por
exemplo:
SUMMARIZE FP PER P { P# } ADD SIJM ( QDE ) AS QDETOTAL,
AVG ( QDE ) AS QDEMDIA
2. A forma geral de <totalizao> (para repetir) :
SUMMARIZE <expresso relacionol>
PER <expresso relacional>
ADD <lista com vrgulas de adio de totalizao>
Cada <adio de totalizao> por sua vez assume a forma:
<tipo de total> [ ( <expresso escalar> ) ] AS <nome de
atributo>
So exemplos vlidos tpicos de <tipo de total> COUNT, SUM,
AVG, MAX, MIN, ALL, ANY, COUNTD, SUMD e AVGD. A letra D (de
distinto) em COUNTD, SUMD e AVGD significa eliminar
valores duplicados redundantes antes de executar a
totalizao. A <expresso escalar> pode incluir referncias
a atributos da relao denotada pela <expresso relacional>
imediatamente seguinte palavra-chave SUMMARIZE. Nota: a
<expresso escalar> (e os parnteses que a envolvem) poder
ser omitida somente se <tipo de total> for COUNT.
A propsito, observe que uma <adio de totalizao> no a
mesma coisa que uma <invocao de operador de agregado>. Uma
<invocao de operador de agregado> uma expresso escalar e
pode aparecer onde quer que uma invocao de seletor escalar
em particular, um literal escalar possa aparecer. Em
contraste, uma <adio de totalizao> apenas um operando
SUMMARIZE; ela no uma expresso escalar, no tem
significado fora do contexto de SUMMARIZE e, na verdade, no
pode aparecer fora desse contexto.
3. Como voc j deve ter percebido, SUMMARIZE no um
operador primitivo ele pode ser simulado por meio de
EXTEND. Por exemplo, a expresso:
SUMMARIZE FP PER F { F# } ADD COUNT AS NP
definida como a abreviao de:
( EXTEND F { F#
ADD ( ( FP RENAME F# AS X ) WHERE X
= F# ) AS Y,
COUNT ( Y ) AS NP )
{ F#, NP
ou, de modo equivalente:
156
CIDADE NFP
Londres 5
Paris 6
Roma 1
WITH ( F { F# } ) AS Ti,
( FP RENAME F# AS X ) AS T2,
( EXTEND Ti ADD ( T2 WHERE X = F# ) AS Y ) AS T3,
( EXTEND T3 ADD COUNT ( Y ) AS NP ) AS T4
T4 { F#, NP }
4. Considere o seguinte exemplo:
SUMMARIZE FP PER FP { } ADD SUM ( QDE ) AS TOTALGERAL
Nesse exemplo, o agrupamento e a totalizao so feitos
atravs de uma relao que no tem nenhum atributo. Seja fp
o valor atual da varivel de relao FP e suponha por
enquanto que a relao fp contm pelo menos uma tupla. Ento,
todas essas tuplas de fp tero o mesmo valor para
absolutamente nenhum atributo ou seja, a tupla O [5.5];
assim, haver apenas um grupo e, desse modo, apenas uma tupla
no resultado global. Em outras palavras, o clculo de
agregados ser executado exatamente uma vez para a relao fp
inteira. Logo, a expresso de SUMMARIZE avaliada como uma
relao com um nico atributo e uma tupla; o atributo
chamado TOTALGERAL, e o nico valor escalar na nica tupla
resultante o total de todos os valores QDE na relao fp
original.
Se, por outro lado, a relao fp original no tiver
absolutamente nenhuma tupla, ento no haver nenhum grupo e,
em consequncia, nenhuma tupla resultante ou seja, a
relao resultante tambm estar vazia. Em contraste, a
expresso a seguir*
SUMMARIZE FP PER RELATION { TUPLE { } }
ADD SUM ( QDE ) AS TOTALGERAL
funcionar (isto , retornar a resposta correta,
especificamente zero) mesmo se fp for vazia. Mais
precisamente, ela retornar uma relao com um nico
atributo, chamado TOTALGERAL, e uma nica tupla contendo um
valor de TOTALGERAL igual a zero. Ento, sugerimos que deve
ser possvel omitir a clusula PER em SUMMARIZE, assim:
SUMMARIZE FP ADD SUM ( QDE ) AS TOTALGERAL
A omisso da clusula PER definida como equivalente
especificao de uma clusula PER da forma:
PER RELATION { TUPLE { } 1
Tclose
Tclose significa fecho transitivo. Mencionamos esse termo
aqui principalmente por completitude; a discusso detalhada
est alm do escopo deste captulo. Contudo, pelo menos
definimos a operao como a seguir. Seja A uma relao
binria com atributos X e Y, ambos do mesmos tipo T. Ento, o
fecho transitivo deA, TCLOSEA, uma relaoA cujo cabealho
igual ao deA e cujo corpo um superconjunto do corpo de A,
definido desta forma: a tupla
X:x , Y:y
pertencer aA se e somente se pertencer aA ou se existir uma
sequncia de valores zl,z2, ...,zn, todos do tipo T, tais que
as tuplas
{ X:x, Y:zl }, { X:zl, Y:z2 }, . . ., { X:zn, Y:y
*A expresso RELATION { TUPLE { } } na clusula PER desse
exemplo denota uma relao na verdade, a nica relao
sem nenhum atributo, a no ser uma tupla (especificamente, a
tupla O). Ela pode ser abreviada como TABLE_DEE (consulte as
refe rncia [3.3], [5.51 e [6.2]). 157
on e. ica
do de
pertenam todas a A. (Em outras palavras, a tupla (x,y) s
aparecer se existir no grafo um caminho que seja
representado pela relao A do n x para o n y, em termos
informais. Observe que o corpo de A inclui necessariamente o
corpo de A como um subconjunto.)
Para ver uma discusso adicional desse tpico, consulte o
Captulo 23.
6.8 AGRUPAMENTO E DESAGRUPAMENTO
O fato de podermos ter relaes com atributos cujos valores
sejam relaes por sua vez nos conduz ao fato de ser
desejvel a existncia de certos operadores relacionais
adicionais, aos quais chamaremos operadores de agrupamento e
desagrupamento, respectivamente [3.3]. Primeiro, vejamos um
exemplo de agrupamento:
FP GROLJP ( P#, QDE ) AS PQ
Considerando nossos dados habituais de amostra, essa
expresso gera o resultado mostrado na Figura 6.12. Nota:
voc provavelmente achar til empregar esses valores para
conferir as explicaes seguintes, tendo em vista que elas
so lamentvel mas inevitavelmente um pouco abstratas.
FIGURA 6.12 AgrupamentodeFPporF#
Comeamos observando que a expresso original:
FP GROUP ( P#, QDE ) AS PQ
pode ser lida como grupo FP por F#, pois F# o nico
atributo de FP no mencionado na clusula GROUP. O resultado
uma relao definida como a seguir. Primeiro, o cabealho
semelhante a:
158 { F# F#, PQ RELATION { P# P#, QDE QDE } )

F# PQ
Fi
F2
F3
F4
P# QDE
P1
P2
P3
P4
P5
P6
300
200
400
200
100
100
P# QDE
P1 P2
300
400
P# QDE
P2 200
P# QDE
P2
P4
P5
200
300
400
FIO Em outras palavras, ele consiste em um atributo com valor
de relao PQ (onde PQ, por sua vez, de tem atributos P# e
QDE), juntamente com todos os outros atributos de FP (
evidente que, no caso, todos os outros atributos de FP
significa apenas o atributo F#). Em segundo lugar, o corpo
contm exatamente uma tupla para cada valor de F# distinto em
FP (e nenhuma outra tupla). Cada tupla nesse corpo consiste
no valor de F# aplicvel (digamos, f), junto com um valor de
PQ (por exemplo, pq) obtido desta forma:
ao m Cada tupla de FP conceitualmente substituda por uma
tupla (x, digamos) em que os componen e tes P# e QDE foram
empacotados em um componente com valor de tupla (por
exemplo, y).
- Os componentes y de todas as tuplas x em que o valor de F#
igual a f so agrupados em uma
relao pq, e assim gerada uma tupla resultante com valor
de F# igual a fe valor de PQ igual a pq.
Desse modo, o resultado global de fato o que est ilustrado
na Figura 6.12. -
Agora, vejamos o desagrupamento. Seja FPQ a relao mostrada
na Figura 6.12. Ento, a expresso:
FPQ UNGROUP PQ
nos devolve (o que talvez no seja surpreendente) a nossa
amostra de relao habitual FP. Para ser mais especfico, ela
produz uma relao definida como a seguir. Primeiro, o
cabealho semelhante a:
{ F# F#, P# P#, QDE QDE }
Em outras palavras, o cabealho consiste em atributos P# e
QDE (derivados do atributo PQ), juntamente com todos os
outros atributos de FPQ (ou seja, apenas o atributo F#, no
exemplo). Em segundo lugar, o corpo contm exatamente uma
tupla para cada combinao de uma tupla em FPQ e uma tupla no
valor de PQ dentro dessa tupla FPQ (e nenhuma outra tupla).
Cada tupla nesse corpo consiste no valor de F# aplicvel
(digamos, t) junto com valores de P# e QDE (por exemplo, p e
q) obtidos desta maneira:
- Cada tupla de FPQ conceitualmente substituda por um
conjunto de tuplas, uma tupla (digamos, x) para cada tupla no
valor de PQ nessa tupla de FPQ. Cada uma dessas tuplas x
contm um componente F# (por exemplo, f) igual ao componente
F# da tupla de FPQ em questo e um componente com valor de
tupla (digamos, y) igual a alguma tupla do componente PQ da
tupla de FPQ em questo.
- Os componentes y de cada uma das tuplas x na qual o valor
de F# igual a f so desempacotados em componentes P# e
QDE separados (digamos, p e q) e, desse modo, gerada uma
tupla de resultado com valor de F# igual a f, valor de P#
igual a p e valor de QDE igual a q.
Portanto, o resultado global , como afirmamos, nosso exemplo
de relao FP habitual. -
Como podemos ver, GROUP e UNGROUP fornecem juntos o que se
costuma referenciar de maneira mais usual como recursos de
aninhamento e desaninhamento de relaes. Entretanto,
preferimos nossa terminologia de agrupamento/desagrupamento,
porque a te1minologia de aninhamento/desaninhamento est
fortemente associada com o conceito de relaes NF , um
conceito que consideramos um tanto confuso para os iniciantes
e que no endossamos.
Por completeza, fechamos esta seo com alguns comentrios a
respeito da reversibilidade de operaes GROUP e UNGROUP
(embora tenhamos a percepo de que nossas observaes podem
no ser totalmente compreensveis em uma primeira leitura).
Se agruparmos alguma relao r de algum modo, sempre existir
um desagrupamento inverso que nos levar de volta a r. Porm,
se de algum modo desagruparmos alguma relao r, poder
existir ou no um agrupamento inverso que nos leve de volta a
r. Aqui est um exemplo (baseado em um exemplo dado na
referncia [5.4j). Suponha que comecemos com a relao DOIS
(ver Figura 6.13) e que ela seja desagrupada para obter TRES.
Agora, se agruparmos TRES por A (e denominarmos mais uma vez
RVX o atributo com valor de relao resultante), obteremos
no DOIS, mas sim UM. 159
Observe que, em UM, RVX (necessariamente) uma dependncia
funcional de A que, portanto, coi titui uma chave candidata
(consulte os Captulos 8 e 10). Se agora desagruparmos UM,
retornaremo TRES, e j vimos que TRES pode ser agrupada para
dar UM; desse modo, as operaes de agrupament desagrupamento
so realmente inversas uma da outra para esse par especfico
de relaes. Em geral, a pendncia funcional o fator
crucial para se determinar se um dado desagrupamento ou no
reversvel. 1 fato, se a relao r tiver um atributo com
valor de relao RVX, ento r poder ser reversivelmente
desagj pada (com respeito a RVX) se e somente se as
afirmativas a seguir forem ambas verdadeiras:
- Nenhuma tupla de r tem uma relao vazia como seu valor de
RVX.
- RVX funcionalmente dependente da combinao de todos os
outros atributos de r. Outra n neira de dizer a mesma coisa
afirmar que tem de haver alguma chave candidata de r que no
clua RVX como um componente.
FIGURA 6.13 O desagrupamento e o fre)agrupamento no so
operaes
necessariamente reversveis
6.9 COMPARAES RELACIONAIS
A lgebra relacional como foi definida originalmente no
inclua nenhuma forma direta de comparar duas relaes por
exemplo, testando sua igualdade ou testando se cada tupla
pertencente a uma operao tambm pertencia a outra (ou seja,
em termos informais, testando se uma relao era um
subconjunto de outra). Uma consequncia dessa omisso foi que
certas consultas eram extremamente difceis de expressar
(veja como exemplo o Exerccio 6.48 no final deste captulo).
Porm, a omisso poder ser corrigida com facilidade. Em
primeiro lugar, definimos um novo tipo de condio, uma
comparao relacional, com a seguinte sintaxe:
<expresso relaciona]> 9 <expresso relacional>
As relaes denotadas pelas duas <expresses relacionais>
devem ser do mesmo tipo. O operador de comparao pode ser
qualquer dos seguintes:
= (igualdade)
(desigualdade)
(subconjunto de)
(subconjunto prprio de)
(superconjunto de)
> (superconjunto prprio de)
DOIS TRS UM
______ ________ A XX
1 a
__ 1 b
1 c
160
A RVX
1
x
a
b
1 Lii
A RVX
1
a b
Lc
s- J Nota: a escolha de smbolos de operadores talvez seja
pouco inteligente, pois, por exemplo, a
a 1 negao de A um subconjunto prprio de B certamente
no A um superconjunto de B (isto ,
<e no so inversos um do outro). Porm, ficaremos com
esses smbolos para a finalidade deste li vro por razes
tipogrficas.
Ento, aqui est um par de exemplos:
1. F{ CIDADE} =P{CIDADE}
Significado: a projeo de fornecedores sobre CIDADE igual
projeo de peas sobre CIDADE?
2. F { F# } > FP { F#
Significado (consideravelmente parafraseado): h algum
fornecedor que no fornea absolutamen t nenhuma pea?
Em seguida, permitimos que esse novo tipo de condio seja
empregado em pontos apropriados
dentro de expresses relacionais. Por exemplo:
F WHERE ( ( FP RENAME F# AS X ) WHERE X = F# ) { P# } = P {
P# }
Essa expresso avaliada como uma relao contendo tuplas de
fornecedores correspondentes a fornecedores que fornecem
todas as peas. Explicao:
- Para um determinado fornecedor, a expresso
( ( FP RENAME F# AS X ) WHERE X = F# ) { P#
gera o conjunto de nmeros de peas correspondentes a peas
fornecidas por esse fornecedor.
- Esse conjunto de nmeros de peas ento comparado com o
conjunto de todos os nmeros de peas. Se os dois conjuntos
forem iguais, a tupla de fornecedor correspondente aparecer
no resultado.
claro que j sabemos como formular essa consulta especfica
em termos de DIVIDEBY:
FJOIN (F{ F#} DIVIDEBYP{ P#} PERFP{ F#, P#} )
Contudo, voc deve perceber que a verso de comparao
relacional conceitualmente mais fcil de se empregar.
Porm, h um ponto que devemos deixar claro: as comparaes
relacionais no so condies de restries no sentido em que
essa expresso foi definida na Seo 6.4, e o exemplo que
mostramos envolvendo tal comparao no uma restrio
genuna! Na verdade, a abreviao para algo como o
seguinte:
WITH ( EXTEND F
ADD ( ( FP RENAME F# AS X ) WHERE X = F# ) { P# }
AS A ) AS Ti,
( EXTEND Ti
ADD P { P# }
AS B ) AS T2
T2 WHERE A = B
A e B aqui so atributos com valor de relao, e a expresso
final T2 WHERE A = B , afinal de contas, uma restrio
genuna. Nota: a propsito, segue-se do que foi dito que
pelo menos em termos conceituais o suporte para comparaes
relacionais exige o suporte para atributos com valor de
relao.
Uma comparao relacional especfica, necessria com muita
frequncia na prtica, um teste para verificar se uma dada
relao vazia (isto , no contm nenhuma tupla). Uma vez
mais, parece que vale a pena apresentar uma abreviao.
Ento, definimos um operador com valor verdade da forma
ISEMPTY ( <expresso relaciona]> ) 161
que retorna verdadeiro se a relao denotada por <expresso
relacional> vazia e, caso contrrio, rei na falso.
Outro requisito comum a capacidade de testar se uma
determinada tupla t pertence a uma aa relao r. A comparao
relacional a seguir bastar:
RELATION { t } r
Porm, a abreviao a seguir que ser muito familiar se o
leitor conhecer SQL um pouco mais amistosa para o
usurio:
t IN r
Na realidade, IN o operador de pertinncia de elemento a
conjunto, em geral representado como E.
6.10 RESUMO
Discutimos a lgebra relacional. Comeamos enfatizando
novamente a importncia do fechamento e das expresses
relacionais aninhadas e explicamos que, se vamos levar a
srio o fechamento, ento precisamos de um conjunto de regras
de inferncia de tipos de relaes (e, claro, nossa verso
da lgebra inclui tais regras).
A lgebra original consistia em oito operadores os
operadores tradicionais de conjuntos denominados unio,
interseo, diferena e produto (todos eles um tanto
modificados para levar em considerao o fato de que seus
operandos so muito especificamente relaes, e no conjuntos
arbitrrios) e os operadores relacionais especiais de
restrio, projeo, juno e diviso. A esse conjunto
original acrescentamos RENAME, SEMIJOIN, SEMIMINUS, EXTEND e
SUMMARIZE (e tambm mencionamos TCLOSE e discutimos
rapidamente GROUP e UNGROUP). Para algumas dessas operaes,
exige-se que os dois operandos sejam do mesmo tipo (antes
chamados compatveis em relao unio). Tambm observamos
que esses operadores no so todos primitivos vrios deles
podem ser definidos em termos de outros. Mostramos como os
operadores podem ser combinados em expresses que servem a
uma variedade de propsitos: busca, atualizao e vrios
outros. Tambm discutimos brevemente a idia de transformar
essas expresses para fins de otimizao (mas examinaremos
essa idia com muito mais detalhes no Captulo 17). Alm
disso, consideramos a possibilidade de usar uma abordagem de
passo a passo para lidar com consultas complexas, empregando
WITH com o objetivo de introduzir nomes correspondentes a
expresses. Por fim, descrevemos a idia de comparaes
relacionais, as quais tornam um pouco mais fcil enunciar
certos tipos de consultas em geral, aquelas que de outro
modo exigiriam
DIVIDEBY.
EXERCICIOS
6.1 No corpo do captulo afirmamos que a unio, a interseo,
o produto e a juno (natural) so todas operaes
associativas e tambm comutativas. Verifique por si mesmo
essas assertivas.
6.2 Do conjunto original de Codd de oito operadores, os de
unio, diferena, produto, restrio e projeo podem ser
considerados primitivos. Fornea definies de juno
natural, interseo e diviso (essa a mais difcil!) em
termos desses primitivos.
6.3 Considere a expresso A JOIN B. Se A e B tm cabealhos
disjuntos (isto , no tm atributos em comum), essa
expresso equivalente expresso A TIMES B. Verifique essa
assertiva. Qual ser a expresso equivalente se A e B tiverem
cabealhos idnticos?
6.4 Mostre que os cinco operadores primitivos mencionados no
Exerccio 6.2 so realmente primitivos, no sentido de nenhum
deles poder ser expresso em termos dos outros quatro.
6.5 Na aritmtica comum, a multiplicao e a diviso so
operaes inversas. TIMES e DIVIDEBY so opera-
162 es inversas na lgebra relacional?
6.6 Dado o banco de dados usual de fornecedores e peas, qual
o valor da expresso F JOIN FP JOIN P? Ateno: h uma
armadilha aqui.
6.7 Seja A uma relao de grau n. Quantas projees
diferentes de A existem?
6.8 Na aritmtica normal, existe um nmero especial 1 com a
propriedade de que:
* 1 = 1 n =n
para todo nmero n. Dizemos tambm que 1 a identidade (ou
elemento neutro) em relao multiplicao. Existe alguma
relao que desempenhe papel anlogo na lgebra relacional?
Se existe, qual ela?
6.9 Na aritmtica normal existe outro nmero especial, 0, com
a propriedade de que
1? * O = O * = o
para todo nmero n. Existe alguma relao que desempenhe
papel anlogo na lgebra relacional? Se existe, qual ela?
6.10 Investigue o efeito das operaes algbricas discutidas
neste captulo sobre as relaes que so as respostas aos
dois exerccios precedentes.
6.11 Na Seo 6.2, dissemos que a propriedade relacional de
fechamento era importante pela mesma razo que tornava
importante a propriedade aritmtica de fechamento. Contudo,
na aritmtica existe uma situao desagradvel em que a
propriedade deixa de valer, ou seja, a diviso por zero.
Existe alguma situao anloga na lgebra relacional?
6.12 Os operadores de unio, interseo, produto e juno
foram todos definidos originalmente como operadores didicos
(isto , cada deles toma exatamente dois operandos). Neste
captulo, porm, mostramos como eles podiam ser estendidos de
forma no ambgua para se tornarem operadores n-dicos para
um valor arbi)S trrio n> 1; por exemplo, a expresso A UNION
B UNION C podia ser considerada de forma no ambgua S- como
a unio tridica de A, B e C. Porm, o que se pode dizer de n
= 1? Ou de n 0?
Exerccios sobre consultas
fl Os exerccios restantes so todos baseados no banco de
dados de fornecedores, peas e projees (ver a Figura 4.5 a
na Seo Exerccios do Captulo 4 e a resposta ao Exerccio
5.4 no Captulo 5). Em cada caso, pede-se que voc La escreva
uma expresso da lgebra relacional correspondente consulta
indicada. (Como uma variao interessante,
voc poderia experimentar examinar primeiro algumas das
respostas e enunciar o significado da expresso dada em a
linguagem natural.) Por convenincia, repetimos a estrutura
do banco de dados (em esboo) a seguir:
F { F#, FNOME, STATUS, CIDADE
PRIMARY KEY { F# }
P { P#, PNOME, COR, PESO, CIDADE
PRIMARY KEY { P# }
J { J#, JNOME, CIDADE
PRIMARY KEY { J# }
FPJ { F#, P#, J#, QDE }
PRIMARY KEY { F#, P#, J# }
FOREIGN KEY { F# } REFERENCES F
FOREIGN KEY { P# } REFERENCES P
FOREIGN KEY { J# 1 REFERENCES J
6.13 Obtenha detalhes completos sobre todos as projees.
6.14 Obtenha detalhes completos sobre todos as projees em
Londres.
6.15 Obtenha os nmeros de fornecedores correspondentes a
fornecedores que fornecem para a projeo Ji.
6.16 Obtenha todas as remessas em que a quantidade est na
faixa de 300 a 750 inclusive.
6.17 Obtenha todas as combinaes cor de pea/cidade de pea.
Nota: aqui e em exerccios subsequentes o termo todas deve
ser entendido como significando todas as que se encontram
atualmente no banco de dados, e no todas as possveis.
163
6.18 Obtenha todas as triplas nmero de fornecedor/nmero de
pea/nmero de projeo tais que o fornecedor, a pea e a
projeo indicadas estejam todos colocados (ou seja, todos na
mesma cidade).
6.19 Obtenha todas as triplas nmero de fornecedor/nmero de
pea/nmero de projeo tais que o fornecedor, a pea e a
projeo indicados no estejam todos colocados.
6.20 Obtenha todas as triplas nmero de fornecedor/nmero de
pea/nmero de projeo tais que dois quaisquer dos
fornecedores, peas e projees indicados nunca estejam
colocados.
6.21 Obtenha detalhes completos sobre peas fornecidas por um
fornecedor em Londres.
6.22 Obtenha nmeros de peas correspondentes a peas
fornecidas por um fornecedor em Londres para uma projeo em
Londres.
6.23 Obtenha todos os pares de nomes de cidades tais que um
fornecedor da primeira cidade fornea para uma projeo na
segunda cidade.
6.24 Obtenha nmeros de peas correspondentes a peas
fornecidas a qualquer projeo por um fornecedor da mesma
cidade que essa projeo.
6.25 Obtenha nmeros de projees correspondentes a projees
fornecidas por pelo menos um fornecedor que no esteja na
mesma cidade.
6.26 Obtenha todos os pares de nmeros de peas tais que
algum fornecedor fornea ambas as peas indicadas.
6.27 Obtenha o nmero total de projees supridos pelo
fornecedor F1.
6.28 Obtenha a quantidade total da pea P1 fornecida pelo
fornecedor Fi.
6.29 Para cada pea fornecida a uma projeo, obtenha o
nmero da pea, o nmero da projeo e a quantidade total
correspondente.
6.30 Obtenha nmeros de peas correspondentes s peas
fornecidas a alguma projeo em uma quantidade mdia maior
que 350.
6.31 Obtenha nomes de projees correspondentes a projees
supridas pelo fornecedor F 1.
6.32 Obtenha cores de peas fornecidas pelo fornecedor Fi.
6.33 Obtenha nmeros de peas correspondentes a peas
fornecidas a qualquer projeo em Londres.
6.34 Obtenha nmeros de projees correspondentes a projees
que utilizem pelo menos uma pea disponvel do fornecedor Fi.
6.35 Obtenha os nmeros de fornecedores que forneam pelo
menos uma pea fornecida por pelo menos um fornecedor que
fornea pelo menos uma pea vermelha.
6.36 Obtenha os nmeros de fornecedores correspondentes a
fornecedores com um status inferior ao do fornecedor Fi.
6.37 Obtenha nmeros de projees correspondentes a projees
cuja cidade seja a primeira em ordem alfabtica na lista de
tais cidades.
6.38 Obtenha os nmeros de projees correspondentes a
projees abastecidas com a pea P1 em uma quantidade mdia
maior que a maior quantidade com que qualquer pea
fornecida projeo Ji.
6.39 Obtenha os nmeros de fornecedores correspondentes a
fornecedores que fornecem a alguma projeo a pea P1 em uma
quantidade maior que a quantidade mdia das remessas da pea
P1 para essa projeo.
6.40 Obtenha os nmeros de projees correspondentes a
projees no supridas com qualquer pea vermelha fornecida
por qualquer fornecedor de Londres.
6.41 Obtenha os nmeros de projees correspondentes a
projees supridas inteiramente pelo fornecedor Fi.
6.42 Obtenha os nmeros de peas correspondentes a peas
fornecidas a todos as projees em Londres.
6.43 Obtenha os nmeros de fornecedores correspondentes a
fornecedores que fornecem a mesma pea a todos as projees.
6.44 Obtenha os nmeros de projees correspondentes a
projees supridas com pelo menos todas as peas disponveis
no fornecedor Fi.
164 6.45 Obtenha todas as cidades em que ao menos um
fornecedor, uma pea ou uma projeo esteja localizada.
6.46 Obtenha os nmeros de peas correspondentes a peas que
so fornecidas ou por um fornecedor de Londres ou para uma
projeo em Londres.
6.47 Obtenha pares nmero de fornecedor/nmero de pea tais
que o fornecedor indicado no fornea a pea indicada.
er 6.48 Obtenha todos os pares de nmeros de fornecedores,
digamos Fx e Fy, tais que Fx e Fy forneam exatamente o mesmo
conjunto de peas cada um. (Agradecimentos correspondente
Fatma Miii, da Oakland University, Rochester, Michigan, por
este problema. Para simplificar, voc deve utilizar o banco
de dados original de fornecedores e peas para resolver este
exerccio, em vez do banco de dados de fornecedores, peas e
projees.)
6.49 Obtenha uma verso agrupada de todas as remessas
mostrando, para cada par nmero de fornecedor/nmero de pea,
os nmeros de projees e quantidades correspondentes, sob a
forma de uma relao binria.
6.50 Obtenha uma verso desagrupada da relao produzida no
Exerccio 6.49.
REFERNCIAS E BIBLIOGRAFIA
6.1 E. F. Codd: Relational Completeness of Data Base
Sublanguages, em RandallJ. Rustin (editor), Data Base
Systems, Courant Com puter Science Symposia Series 6.
Englewood Cliffs, N.J.: Prentice-Hall (1972).
Esse o artigo em que Codd primeiro definiu formalmente os
operadores algbricos originais ( claro que as definies
tambm apareceram na referncia [5.1], mas elas eram um pouco
menos formais ou, no mnimo, menos completas).
Um aspecto talvez desafortunado desse artigo o fato de que
ele pressupe por convenincia notacional e expositiva que
os atributos de uma relao mantm uma ordenao da esquerda
para a direita e, em consequncia disso, podem ser
identificados por sua posio ordinal (embora Codd enfatize
que [devem] ser empregados nomes em vez de nmeros de
posies... quando se estiver realmente armazenando ou
buscando informaes e, naturalmente, tenha dito antes
quase tudo o que afirmou na referncia [5.1]). Ento, o
artigo no menciona um operador de atributo RENAME e no
considera a questo da inferncia de tipo de resultado.
Possivelmente como consequncia dessas omisses, as mesmas
crticas ainda podem ser feitas hoje em muitas discusses da
lgebra na literatura, em produtos atuais de SQL e (em
vel extenso um pouco menor) tambm no padro SQL.
Comentrios adicionais sobre esse artigo aparecem no Captulo
7, em especial na Seo 7.4. Nota: a referncia [3.3]
descreve uma espcie de lgebra de conjunto reduzido de
instrues chamada A que permite a definio sistemtica de
operadores mais eficientes em termos de combinaes adequadas
de um nmero muito pequeno de operadores primitivos. De fato,
a referncia [3.3] mostra que toda a funcionalidade da
lgebra de Codd definida originalmente pode ser alcanada com
apenas dois primitivos chamados remove e nor.
6.2 Hugh Darwen (escrevendo como Andrew Warden): Adventures
in Relationland, em C. J. Date, Relational Database Writings
1985-1989. Reading, Mass.: Addison-Wesley (1990).
Uma srie de artigos curtos que examinam diversos aspectos do
modelo relacional e de SGBDs relacionais em estilo original,
de entretenimento e de informao. Os artigos tm os
seguintes ttulos:
1. The Naming of Columns.
2. In Praise of Marriage.
3. The Keys of the Kingdom.
4. Chivalry.
5. A Constant Friend.
6. Table Dee and Table Dum.
7. Into the Unknown.
6.3 Hugh Darwen e C. J. Date: Into the Great Divide, em C.
J. Date e Hugh Darwen, Relational Database Writings 1989-
1991. Reading, Mass.: Addison-Wesley (1992).
Esse artigo analisa tanto (a) a diviso original de Codd
definida na referncia [6.1] quanto (b) uma generalizao
desse operador devida a Hail, Hitchcock e Todd [6.10] que
diferente da diviso original de Codd 165
permitia que qualquer relao fosse dividida por qualquer
relao (a diviso original de Codd foi definida apenas para
relaes dividendo e divisor tais que o cabealho do divisor
era um subcon junto do cabealho do dividendo), O artigo
mostra que ambos os operadores encontram dificuldades no caso
de relaes vazias, com o resultado de que nenhum deles
resolver satisfatoriamente o problema que foi criado para
resolver (isto , nenhum deles a contraparte do
quantificador universal que deveria ser). Verses revisadas
dos dois operadores (respectivamente, a Small Divide e a
Great Divide) foram propostas para contornar esses
problemas. Nota: como sugere a sintaxe de Tutorial D para
esses dois operadores, na realidade eles so dois operadores
diferentes; ou seja, Great Divide no (infelizmente) uma
extenso de compatibilidade ascendente de Small Divide, O
artigo tambm sugere que os operadores revisados no merecem
mais o nome de diviso! Em conexo com esse ltimo ponto,
consulte o Exerccio 6.5.
Para fins de referncia, damos aqui uma definio da diviso
original de Codd. Sejam as relaes A e B com os cabealhos
[X,Y1 e {Y}, respectivamente (ondeXe Ypodem ser compostos).
Ento, a expressoA DIVJDEBY B fornece uma relao com o
cabealho {X} e um corpo que consiste em todas as tuplas
{X:x} tais que uma tupla {X:x,Y:y} aparece em A para todas as
tuplas {Y:y} que aparecem em B. Em outras palavras, falando
informalmente, o resultado consiste nos valores X de A cujos
valores Y correspondentes (em A) incluem todos o valores Y de
B.
6.4 C. J. Date: Quota Queries (em trs partes), em C. J.
Date, Hugh Darwen e David McGoveran, Relational Database
Writings 1994-1997. Reading, Mass.: Addison-Wesley (1998).
Uma consulta de quota uma consulta que especifica um limite
desejado sobre a cardinalidade do resultado por exemplo, a
consulta Obter as trs peas mais pesadas. Aqui est uma
formulao possvel em Tutorial D desse exemplo:
P QUOTA ( 3, DESC PESO
Essa expresso definida como uma abreviao para o
seguinte:
( ( EXTEND P
ADD COUNT ( ( P RENAME PESO AS PS ) WHERE P5 > PESO
AS #MAISPESADO )
WHERE # MAISPESADO < 3 ) { ALL BUT #MAISPESADO }
(onde os nomes PSX, PSY e # MAISPESADO so arbitrrios). Dada
nossa amostra de dados habitual, o resultado consiste nas
peas P2, P3 e P6.
O artigo em trs partes [6.41 analisa em profundidade o
requisito de consulta de quota e prope vrias abreviaes
sintticas para lidar com ele e com questes relacionadas.
6.5 Michael J. Carey e Donald Kossmann: On Saying `Enough
Already!' in SQL, Proc. 1997 Int. Conf. 011 Management of
Data, Tucson. Ariz. (maio de 1997).
Outro artigo sobre consultas de quotas. Diferentemente da
referncia [6.41, ele focaliza questes relacionadas com a
implementao e no questes relacionadas com o modelo. A
consulta Obter as trs peas mais pesadas, de acordo com
esse artigo, seria semelhante a:
SELECT *
FROM P
ORDER BY PESO DESC
STOP AFTER 3
Um problema com essa abordagem que STOP AFTER se aplica ao
resultado de ORDER BY que (como vimos no Captulo 5, Seo
5.3, subseo Propriedades de relaes) no absolutamente
uma relao, mas sim um array ou uma lista: em consequncia,
o resultado geral tambm no presumivelmente uma relao, e
a propriedade de fechamento relacional violada. O artigo
no discute essa questo.
E claro que o resultado talvez pudesse ser convertido de
volta em uma relao mas ento teramos outro problema, o
fato de que o resultado de STOP AFTER , em geral,
imprevisvel. Por exemplo, considerando nossos valores de
dados de amostra habituais, se substituirmos STOP APTER 3 por
STOP AFTER 2 na consulta de SQL precedente, ento o resultado
no ser bem definido.
A clusula STOP AFTER foi implementada em um prottipo de
pesquisa da IBM e, portanto, poderia ter aplicao em
produtos IBM, e possivelmente tambm no padro SQL embora
ningum espere
166 que isso seja feito antes que os problemas identificados
tenham sido satisfatoriamente resolvidos.
6.6 R. C. Goldstein e A. J. Strnad: The MacAIMS Data
Management System, Proc. 1970 ACM SICFIDET Workshop on Data
Description and Acess (novembro de 1970).
Consulte a anotao referncia [6.7], imediatamente a
seguir.
6.7 A. J. Strnad: The Relational Approach tu the Management
of Data Bases, Proc. IFIP Congress, Ljubljana, Iugoslvia
(agosto de 1971).
Mencionamos o MacAIMS [6.6-6.7] principalmente por razes
histricas: parece ser o mais antigo exemplo de um sistema
que admite tanto relaes n-rias quanto uma linguagem
algbrica. O detalhe interessante sobre ele o fato de ter
sido desenvolvido em paralelo, e pelo menos em parte
independente do trabalho de Codd sobre o modelo relacional.
Contudo, o que o distingue do trabalho de Codd que o
esforo no MacAIMS aparentemente no teve consequncia em
qualquer atividade significativa.
6.8 M. G. Notley: The Peterlee IS/1 System, IBM UK
Scientific Centre Report UKSC-00 18 (maro de 1972). Consulte
a anotao referncia [6.91.
6.9 S. J. P. Todd: The Peterlee Relational Test Vehicle A
System Overview, IBM Sys. J. 15, Nmero 4 (1976).
O Peterlee Relational Test Vehicle (PRT\7) foi o sistema
experimental desenvolvido no IBM UK Scientific Centre, em
Peterlee, Inglaterra. Ele se baseava em um prottipo anterior
possivelmente a primeira implementao das idias de Codd
chamado IS/1 [6.8] e admitia relaes n-rias e uma verso da
lgebra chamada ISBL (Information System Base Language), que
era baseada em propostas documentadas na referncia [6.10].
As idias discutidas neste captulo a respeito da inferncia
de tipo de relao tm suas origens na ISBL e nas propostas
da referncia [6.10].
Os aspectos significativos do PRTV eram os seguintes:
- Admitia RENAME, EXTEND e SUMMARIZE.
- Incorporava algumas tcnicas sofisticadas de transformao
de expresses (consulte o Captulo 17).
- Inclua um recurso de avaliao perigosa, importante tanto
para otimizao quanto para o suporte de vises (consulte a
discusso de WITH neste captulo).
- Fornecia extensibilidade de funes isto , a
possibilidade de usurios definirem seus prprios operadores.
6.10 P. A. V. Hall, P. Hitchcock e S. J. P. Todd: An Algebra
of Relations for Machine Computation, Conf. Record of the
2'' ACM Symposium on Principles of Programming Languages,
Palo Alto, Calif. (janeiro de 1975).
6.11 Patrick A. V. Hall: Relational Algebras, Logic, and
Functional Programming, Proc. 1984 ACM SIGMOD Int. Conf. on
Management of Data, Boston, Mass. (junho de 1984).
Apresenta uma interpretao de programao funcional da
lgebra relacional com o objetivo de (parafraseando o artigo)
(a) fornecer uma base terica para as chamadas linguagens de
quarta gerao (consulte o Captulo 2) e (b) integrar
linguagens funcionais, lgicas (consulte o Captulo 23) e
relacionais de modo que elas possam compartilhar a tecnologia
de implementao. O autor afirma que, enquanto a programao
lgica e os bancos de dados migraram durante algum tempo um
em direo ao outro, na poca em que o artigo era escrito, as
linguagens funcionais ou aplicativas deram pouca ateno a
questes relacionadas com bancos de dados. Por essa razo, o
artigo apresentado principalmente como uma contribuio
visando reaproximao entre essas duas ltimas.
6.12 Anthony Klug. Equivalence of Relational Algebra and
Relational Calculus Query Languages Having Aggregate
Functions,JACM 29, Nmero 3 (julho de 1982).
Define extenses tanto para a lgebra relacional original
quanto para o clculo relacional original (consulte o
Captulo 7) para dar suporte a operadores de agregados e
demonstra a equivalncia dos dois formalismos estendidos.
167
B
A
as
Li
RESPOSTAS A EXERCICIOS SELECIONADOS
Nota: as respostas dadas aos Exerccios de 6.13 a 6.50 no
so as nicas possveis.
6.2 JOIN discutido na Seo 6.4. INTERSECT pode ser
definido como a seguir:
A INTERSECT B A MINUS (A MINUS B)
ou (igualmente bem):
A INTERSECT 8 B MINUS (B MINUS A)
Essas equivalncias, embora vlidas, so um pouco
insatisfatrias, porque A INTERSECT B simtrica em A e B e
as outras duas expresses no so. Em contraste, aqui est um
equivalente simtrico:
( A MINUS ( A MINUS B ) ) UNION ( B MINUS ( B MINUS A) )
Nota: dado que A e B devem ser do mesmo tipo, temos tambm:
A INTERSECT B AJOINB
Quanto a DIVIDEBY, temos:
A DIVIDEBY B PER C A { X }
MINUS ( (A { X } TIMES B { Y } )
MINUS C { X, Y } ) { X }
No caso, X o conjunto de atributos comuns de A e C, e Y o
conjunto de atributos comuns a B e C.
Nota: da maneira como foi definido, DIVIDEBY na realidade
uma generalizao da verso definida no corpo do captulo
embora ainda seja uma diviso simples (Smali Divide) [6.31
tendo em vista que fizemos anteriormente a suposio de que A
no tinha nenhum atributo alm de X, B no tinha nenhum
atributo alm de Y, e C no tinha nenhum atributo alm de X e
Y. A generalizao anterior nos permitiria expressar, por
exemplo, a consulta Obter nmeros de fornecedores
correspondentes a fornecedores que fornecem todas as peas
de modo mais sim- pies apenas como:
F DIVIDEBY P PER FP
em lugar de:
F { F# } DIVIDEBY P { P# } PER FP { F# P# }
6.3 A INTERSECT B (ver a resposta ao Exerccio 6.2 anterior).
Nota: observamos que, tendo em vista que TIMES um caso
especial de JOIN, poderamos considerar JOIN um operador
primitivo em vez de TIMES
na verdade, uma alternativa prefervel, exatamente por ser
mais geral.
6.4 Damos somente um esboo informal (muito informal) de uma
prova.
- O produto o nico operador que pode aumentar o nmero de
atributos; assim, ele no pode ser simulado por qualquer
combinao dos outros operadores. Portanto, o produto um
operador primitivo.
a A projeo o nico operador que pode reduzir o nmero de
atributos; assim, ele no pode ser simulado por qualquer
combinao dos outros operadores. Portanto, a projeo
primitiva.
- A unio o nico operador que pode aumentar o nmero de
tuplas, alm do produto, e o produto em geral aumenta tambm
o nmero de atributos. Sejam A e B as relaes a serem
unidas. Observe que A e B devem ser do mesmo tipo, e que
sua unio tem exatamente os mesmos atributos de cada uma
delas. Se formamos o produto de A e B (digamos) renomeando
primeiro todos os atributos de B e depois aplicando o
operador de produto e, em seguida, usarmos a projeo para
reduzir o conjunto de atributos no resultado apenas ao
conjunto de atributos de A, simplesmente obteremos de novo a
relao original A:
A TIMES B ) { todos os atributos de A } A
(a menos que B seja vazia; vamos ignorar esse caso por
simplicidade). Desse modo, o produto no pode 168 ser
utilizado para simular a unio, e a unio primitiva.
- A diferena no pode ser simulada atravs da unio (porque
a unio nunca reduz o nmero de tuplas) ou do produto unio
(em geral, pela mesma razo), ou ainda da projeo (porque a
projeo normalmente reduz o nmero de atributos). A
diferena tambm no pode ser simulada por restrio, porque
a diferena sensvel aos valores que aparecem na segunda
relao, enquanto a restrio no pode ser (devido natureza
de uma condio de restrio). Portanto, a diferena
primitiva.
- A restrio o nico operador que permite a comparao de
valores de atributos entre si. Desse modo, a restrio
primitiva.
6.5 A resposta simples no. O operador DIVIDEBY original de
Codd satisfazia propriedade de que:
( A TIMES B ) DIVIDEBY 8 = A
Contudo:
- O operador DIVIDEBY de Codd era um operador didico; nosso
DIVIDEBY tridico e, por essa razo, possivelmente no
capaz de satisfazer a uma propriedade semelhante.
- Em qualquer caso, mesmo com o operador DIVIDEBY de Codd, a
diviso de A por B seguida pela formao do produto
cartesiano do resultado com B ir gerar uma relao que
talvez seja idntica A; porm, mais provvel que ela seja
algum subconjunto prprio de A:
( A DIVIDEBY 8 ) TIMES B A
Assim, o operador DIVIDEBY de Codd mais parecido com a
diviso inteira da aritmtica comum (isto , ele ignora o
resto).
6.6 A armadilha que a juno envolve os atributos de
CIDADE, bem como os atributos de F# e P#. O resultado tem o
seguinte aspecto:
6.7 2!. Esse nmero inclui a projeo identidade (isto , a
projeo sobre todos os n atributos), o que produz um
resultado idntico relao original A, e a projeo nulria
(ou seja, a projeo sobre absolutamente nenhum atributo),
que produz TABLE_DUM se a relao original A vazia, e
TABLE_DEE em caso contrrio [5.51.
6.8 Sim, existe tal relao, ou seja TABLE DEE. A relao
TABLE_DEE (DEE para abreviar) anloga a 1 com respeito
multiplicao na aritmtica comum, porque:
R TIMES DEE DEE TIMES R R
para todas as relaes R. Em outras palavras, DEE a
identidade em relao a TIMES (e, de modo mais geral, em
relao a JOIN).
6.9 No h nenhuma relao que se comporte com respeito a
TIMES de um modo exatamente anlogo ao modo como O se
comporta em relao multiplicao. Porm, o comportamento
de TABLE_DUM (DUM para abreviar) , de certa forma, uma
reminiscncia do comportamento de O, pois:
R TIMES DUM DUM TIMES R uma relao vazia com
o mesmo cabealho que R
para todas as relaes R.
6.10 Primeiro, observe que as nicas relaes que so do
mesmo tipo que DEE e DUM so as prprias DEE e DUM. Temos:
UNION DEE DUM INTERSECT DEE DUM MINUS DEE DUM
DEE DEE DEE DEE DEE DUM DEE DUM DEE
DUM DEE DUM DUM DUM DUM DUM DEE DUM 169
Fi
1 Fi
F1
F2
F3
L_
FNOME
Smith
Smith
Smith
Jones
Blake
Clark
STATUS
20
20
20
10
30
20
CIDADE
Londres
Londres
Londres
Paris
Paris
Londres
P#
P1
P4
P6
P2
P2
P4
QDE
300
200
100
400
200
200
PNOME
Porca
Parafuso
Tubo
Pino
Pino
Parafuso
COR
Vermelho
Vermelho
Vermelho
Verde
Verde
Vermelho
PESO
12,0
14,0
19,0
17,0
17,0
14,0
No caso da diferena, o primeiro operando mostrado
esquerda, e o segundo na parte superior (para os outros
operadores, claro, os operandos so intercambiveis).
Observe como essas tabelas so semelhantes s tabelas verdade
para OR, AND e AND NOT, respectivamente; claro que a
semelhana no uma coincidncia.
Passando agora restrio e projeo, temos:
- Qualquer restrio de DEE produz DEE se a condio de
restrio verdadeira, e DUM se ela falsa.
- Qualquer restrio de DUM produz DUM.
- A projeo de qualquer relao sobre nenhum atributo produz
DUM se a relao original vazia, e DEE em caso contrrio.
Em particular, a projeo de DEE ou de DUM, necessariamente
sobre atributo nenhum, retorna sua entrada.
No caso da extenso e da totalizao, temos:
- A extenso DEE ou DUM para acrescentar um novo atributo
produz uma relao de grau um e a mesma cardinalidade que sua
entrada.
- A totalizao de DEE ou DUM (necessariamente por nenhum
atributo) produz uma relao de grau um e com a mesma
cardinalidade que sua entrada.
Nota: omitimos consideraes sobre DIVIDEBY, SEMIJOIN e
SEMIMINUS, porque eles no so primitivos. TCLOSE
irrelevante (s se aplica a relaes binrias). Tambm
omitimos consideraes sobre GROUP e UNGROUP por razes
bvias.
6.11 No!
6.12 Podemos definir razoavelmente (e o fazemos) a unio ou a
interseo ou o produto ou a juno de uma nica relao R
como sendo apenas a prpria relao R. No caso do O, seja RT
algum tipo de relao. Ento:
- A unio de nenhuma relao do tipo RT a relao vazia do
tipo RT. Observe que deve existir algum meio de se
especificar RT como um operando para a unio.
- A interseo de relaes onde nenhuma relao do tipo RT
a relao universal do tipo RT, onde queremos indicar
pela expresso relao universal do tipo RT a relao do
tipo RT cujo corpo contm todas as tuplas possveis que esto
em conformidade com o cabealho dessa relao (mais uma vez,
deve haver algum modo de se especificar RT como um operando
para a operao). Observe que o termo relao universal
usado com maior frequncia na literatura com um significado
muito diferente! ver por exemplo a referncia [12.19].
- O produto e a juno de relaes inexistentes so ambos
TABLE_DEE.
6.13 J
6.14 J WHERE CIDADE = Londres
6.15 ( FPJ WHERE J# = J# ( Ji ) ) { F#
6.16 FPJ WHERE QDE QDE ( 300 ) AND QDE QDE ( 750
6.17 P { COR, CIDADE
6.18 ( F JOIN P JOIN J ) { F#, P#, J#
6.19 ( ( ( F RENAME CIDADE AS FCIDADE ) TIMES
P RENAME CIDADE AS PCIDADE ) TIMES
J RENAME CIDADE AS JCIDADE
WHERE FCIDADE PCIDADE
OR PCIDADE JCID.ADE
OR JCIDADE FCIDADE ) { F#, P#, J#
6.20 ( ( ( F RENAME CIDADE AS FCIDADE ) TIMES
P RENAME CIDADE AS PCIDADE ) TIMES
J RENAME CIDADE AS JCIDADE )
WHERE FCIDADE PCIDADE
AND PCIDADE JCIDADE
AND JCIDADE FCIDADE ) { F#, P#, J# }
170
6.21 P SEMIJOIN ( FPJ SEMIJOIN ( F WHERE CIDADE = Londres'
6.22 Apenas para lembr-lo da possibilidade, mostramos uma
soluo para esse exerccio com a abordagem de um passo de
cada vez:
WITH ( F WHERE CIDADE = `Londres' ) AS Ti,
J WHERE CIDADE = `Londres' ) AS T2,
( FPJ JOIN Ti ) AS T3,
T3 { P#, J# } AS T4,
( T4 JOIN T2 ) AS T5
T5 { P# }
Aqui est a mesma consulta sem o emprego de WITH:
FPJ JOIN ( F WHERE CIDADE = `Londres' ) ) { P#, J#
JOIN ( J WHERE CIDADE Londres' ) ) { P#
Daremos uma mistura de solues (algumas usando WITH, outras
no) nos exerccios restantes.
6.23 ( ( F RENAME CIDADE AS FCIDADE ) JOIN FPJ JOIN
J RENAME CIDADE AS JCIDADE ) ) { FCIDADE, JCIDADE
6.24 ( J JOIN FPJ JOIN F ) { P#
6.25 ( ( ( J RENAME CIDADE AS JCIDADE ) JOIN FPJ JOIN
F RENAME CIDADE AS FCIDADE
WHERE JCIDADE FCIDADE ) { J# }
6.26 WITH ( FPJ { F#, P# } FENAME F# AS XF#, P# AS XP# ) AS
Ti,
( FPJ { F#, P# } RENAME F# AS YF#, P# AS YP# ) AS T2,
Ti TIMES T2 ) AS T3,
T3 WHERE XF# = YF# AND XP# < YP# ) AS T4
T4 { xP#, YP# }
6.27 ( SUMMARIZE FPJ { F#, J#
PER RELATION { TUPLE { F# F# ( `Fi' ) }
ADD COUNT AS N ) { N
Lembramos que, nesse caso, a expresso na clusula PER uma
invocao de seletor de relao (na verdade, um literal de
relao).
6.28 ( SUMMARIZE FPJ { F#, P#, QDE
PER RELATION { TUPLE { F# F# ( `Fi' ), P# P# ( `Pi' ) }
ADDSUM (QDE ) ASQ ) { Q
6.29 SUMMARIZE FPJ PER FPJ { P#, J# } ADD SUM ( QDE ) AS Q
6.30 WITH ( SUMMARIZE FPJ PER FPJ { P#, J#
ADD AVG ( QDE ) AS Q ) AS Ti,
( Ti WHERE Q > QDE ( 350 ) ) AS T2
T2 { P# }
6.31 ( J JOIN ( FPJ WHERE F# = F# ( `Fi' ) ) ) { JNOME
6.32 ( P JOIN ( FPJ WHERE F# = F# ( `Fi' ) ) ) { COR
6.33 ( FPJ JOIN ( J WHERE CIDADE = `Londres' ) ) { P#
6.34 ( FPJ JOIN ( FPJ WHERE F# = F# ( `Fi' ) ) { P# } ) { J#
6.35 ( ( ( FPJ JOIN
P WHERE COR = COR ( `Vermelho' ) ) { P# } ) { F#
JOINFPJ){P#}JOINFPJ){F#}
6.36 WITH ( F { F#, STATUS } RENAME F# AS XF#,
STATUS AS XSTATUS ) AS Ti,
F { F#, STATUS } RENAME F# AS YF#,
STATUS AS YSTATUS ) AS T2,
171
( Ti TIMES T2 ) AS T3.
( T3 WHERE XF# = F# ( `Fi' ) AND
XSTATUS > YSTATUS ) AS T4
T4 { YF# }
6.37 ( ( EXTEND J ADD MIN ( J, CIDADE ) AS FIRST
WHERE CIDADE = FIRST ) { J#
O que essa consulta retornar se a varivel de relao J for
vazia?
6.38 WITH ( FPJ RENAME J# AS ZJ# ) AS Ti,
( Ti WHERE ZJ# = J# AND P# = p# ( `Pi' ) ) AS T2,
( FPJ WHERE P# = P# ( `Pi' ) ) AS T3,
( EXTEND T3 ADD AVG ( T2, QDE ) AS QX ) AS T4,
T4 { J#, QX } AS T5,
( FPJ WHERE J# = J# ( `Ji' ) ) AS T6,
( EXTEND T6 ADD MAX ( T6, QDE ) AS QY ) AS T7,
( T5 TIMES T7 { QY } ) AS T8,
( T8 WHERE QX > QY ) AS T9
T9 { J# }
6.39 WITH ( FPJ WHERE P# = P# ( `Pi' ) ) AS Ti,
Ti { F#, J#, QDE } AS T2,
( T2 RENAME J# AS XJ#, QDE AS XQ ) AS T3,
( SUMMARIZE Ti PER FPJ { J#
ADD AVG ( QDE ) AS Q ) AS T4,
( T3 TIMES T4 ) AS T5,
( T5 WHERE XJ# = J# AND XQ > Q ) AS T6
T6 { F# }
6.40 WITH ( F WHERE CIDADE = Londres ) { F# } AS Ti,
P WHERE COR = COR ( Vermelho' ) ) AS T2,
( Ti JOIN FPJ JOIN T2 ) AS T3
J { J# } MINUS T3 { J# )
6.41 J { J# } MINUS ( FPJ WHERE F# F# ( `Fi' ) ) { J#
6.42 WITH ( ( FPJ RENAME P# AS X ) WHERE X P# ) { j# } AS Ti,
J WHERE CIDADE `Londres' ) { J# } AS T2,
( P WHERE Ti T2 ) AS T3
T3 { P# }
6.43 F { F#, P# ) DIVIDEBY J { J# } PER FPJ { F#, P#, J#
6.44 ( J WHERE
( ( FPJ RENAME J# AS Y ) WHERE Y = J# ) { P# }
( FPJ WHERE F# = F# ( Fi' ) ) { P# } ) { J#
6.45 F { CIDADE } UNION P { CIDADE } UNION J { CIDADE 1
6.46 ( FPJ JOIN ( F WHERE CIDADE = `Londres' ) ) { P#
UNION
FPJ JOIN ( J WHERE CIDADE = Londres' ) ) { P#
6.47 ( F TIMES P ) { F#, P# } MINUS FP { F#, P#
6.48 Mostramos duas solues para esse problema. A primeira,
se deve a Hugh Darwen, emprega apenas os operadores das
Sees 6.2 e 6.3:
WITR ( FP RENAME F# AS FA ) { FA, P# } AS Ti,
/* Ti {FA,P#} FA fornece a pea P# /
( FP RENAME F# AS FB ) { FB, P# } AS T2,
/ T2 {FB,P#} : FB fornece a pea P# /
Ti { FA } AS T3.
172 / T3 {FA} : FA fornece alguma pea /
T2 { FB } AS T4,
/ T4 {FB} : FB fornece alguma pea /
( Ti TIMES T4 ) AS T5,
/ T5 {FA,FB,P#} : FA fornece alguma pea e
FB fornece a pea P# /
( T2 TIMES T3 ) AS T6,
/ T6 {FA,FB,P#} : FB fornece alguma pea e
FA fornece a pea P# */
( Ti JOIN T2 ) AS T7,
/ T7 {FA,FB,P#} : FA e FB fornecem ambos a pea P# /
( T3 TIMES T4 ) AS T8,
/ T8 {FA,FB} : FA fornece alguma pea e
FB fornece alguma pea /
FP { P# } AS T9,
/ T9 {P#} : a pea P# fornecida por algum fornecedor */
( T8 TIMES T9 ) AS TiO,
/ TiO {FA,FB,P#}
FA fornece alguma pea,
FB fornece alguma pea e
a pea P# fornecida por algum fornecedor */
TiO MINIJS T7 ) AS Til,
/ Til {FA,FB,P#} : a pea P# fornecida,
nas no por FA e FB /
( T6 INTERSECT Til ) AS Ti2,
/ T12 {FA,FB,P#} : a pea P# fornecida por FA,
mas no por FB /
( T5 INTERSECT Til ) AS Tl3,
/ T13 {FA,FB,P#} a pea P# fornecida por FB,
mas no por FA /
Ti2 { FA, FB } AS Ti4,
/ T14 {FA,FB}
FA fornece alguma pea no fornecida por FB /
Ti3 { FA, FB } AS Ti5,
/ Ti5 {FA,FB}
FB fornece alguma pea no fornecida por FA /
( T14 UNION T15 ) AS T16,
/ T16 {FA,FB} : alguma pea fornecida por FA ou FB
mas no por ambos */
T7 { FA, FB } AS Ti7,
/ Ti7 {FA,FB}
alguma pea fornecida por FA e FB /
173
( T17 MINUS T16 ) AS T18,
/* T18 {FA,FB}
alguma pea fornecida por FA e FB,
e nenhuma pea fornecida por FA no fornecida por FB,
e nenhuma pea fornecida por FB no fornecida por FA
assim, FA e FB fornecem exatamente as mesmas peas /
( T18 WHERE FA < FB ) AS T19
/ passo minucioso /
T19
A segunda soluo muito mais direta! faz uso das
comparaes relacionais introduzidas na Seo 6.9.
WITH ( F RENAME F# AS FA ) { FA } AS RA
( F RENAME F# AS FB ) { FB } AS RB
( RA TIMES RB )
WHERE ( FP WHERE F# FA ) { P# } =
( FP WHERE F# = FB ) { P# }
AND FA < FB
6.49 FPJ GROUP ( J#, QDE ) AS JQ
6.50 Considere que FPQ denota o resultado da expresso
mostrada na resposta ao Exerccio 6.49. Ento:
FPQ UNGROUP JQ
174