![]() |
INF 314 - Engenharia da Informação - Março-abril 2006Prof. Célio Guimarães IC - Unicamp |
![]() |
Exemplo: "Para cada funcionário apresente os nomes dos seus dependentes"
AR: Π numf, nomed Dependentes
SQL: select numf,nomed from Dependntes
"Dê uma lista dos funcionários que possuem dependentes"
Π numf Dependentes
select numf from Dependentes
problema: o funcionário 02 aparecerá duas vezes! É preciso incluir:
select distinct numf from Dependentes
Exemplos:
select ...
from Funcionarios, Dependentes
ou,
select ....
from D as D1, D as D2, D as D3
Observe também nesse exemplo os operadores de renomeação (ρ): as D1, as D2, etc.
Usualmente o produto cartesiano será utilizado junto com uma seleção, conforme veremos.
Lembrando que a junção θ e junção natural são subconjuntos do produto cartesiano, obtidos através de uma comparação entre colunas, a seleção e a junção podem ambas ser expressas através de uma expressão booleana na cláusula where:
junção natural: "para cada funcionário que possui dependentes apresente o seu nome, os nomes e parentesco dos dependentes" (junção natural):
Πnommef, nomed, par Funcionarios |X| Dependentes
select nomef, nomed, par
from Funcionarios, Dependentes
where Funcionarios.numf = Dependentes.numf
junção theta: tabela de "pais e filhos", D(p,f): "obtenha pares de pessoas x, y onde x é avô de y"
ΠD1.p,D2.f D1 |X D1.f=D2.p| D2
(qual a renomeação implícita na solução acima?)
select D1.p, D2.f
from D as D1, D as D2
where D1.f= D2.p
seleção e junção theta: "obtenha pares de pessoas da tabela "Pais e Filhos", D( p, f), que são cônjuges, isto é,
possuem um ou mais filhos em comum"
ρD1(p1,f1) D, ρD2(p2,f2) D
Πp1,p2(σp1 < p2 (D1 |Xf1=f2| D2)) ≡ Πp1,p2 (σp1 < p2 and f1=f2 (D1 x D2))
Exercício: re-escreva a expressão acima com a seguinte renomeação:
ρD1(p,f) D e ρD2(p,f) D
deixando a expressão em AR mais próxima da tradução para SQL:
select distinct D1.p, D2.p
from D as D1, D as D2
where D1.f = D2.f and D1.p < D2.p
Exercício: por que distinct é necessário nesta solução e não na do problema anterior?
Exercícios:
(i) "Para cada funcionário apresente o seu numero e, em ordem decrescente,
o número de seus descendentes".
(ii) "Qual o funcionário que possui o maior número de dependentes?"
(iii) "Para cada funcionário apresente o seu nome e, em ordem decrescente,
o número de seus descendentes".
AR : não é possivel expressar.
SQL: relativamente simples usando os recursos de ordenação (order by),
contagem ( count()) e de agrupamento (group by). Tente!