1/2/14
1
© 2013 IST
Bases de Dados 2013/2014 Álgebra Relacional
Helena Galhardas
© 2013 IST
Bibliografia
• Raghu Ramakrishnan, Database
Management Systems, Cap. 4
1
1/2/14
2
© 2013 IST
Sumário
• Álgebra Relacional
2
© 2013 IST
Linguagens Formais de Interrogação Relacionais
• Linguagem de interrogação: serve para especificar perguntas ou interrogações (queries) que envolvem os dados da BD
• Duas que servem de base à definição e implementação do SQL – Álgebra Relacional
• Interrogações são composições de operadores • Operacional: especificação passo-a-passo do procedimento
para calcular a resposta • Representação de planos de execução
– Cálculo Relacional • Não operacional • Declarativo
1/2/14
3
© 2013 IST
Interrogação (query) • Entrada e saída: relações • Avaliada usando “instâncias” de cada relação
(tabelas) como entrada e produzindo uma “instância” da relação (tabela) de saída
• A escrita de uma interrogação é – dependente do esquema de entrada e saída – mas independente das tabelas
• Referência a atributos de uma relação – Posicional: usada a ordem pela qual foi criado o
atributo – Nome: pelo nome dado ao atributo
© 2013 IST
Esquema Relacional para exemplos
Sailors(sid, sname, rating, age) Boats(bid, bname, color) Reserves(sid, bid, day)
sid: FK(Sailors) bid: FK(Boats)
1/2/14
4
© 2013 IST
Exemplos de tabelas
sid sname rating age22 dustin 7 45.031 lubber 8 55.558 rusty 10 35.0
sid sname rating age28 yuppy 9 35.031 lubber 8 55.544 guppy 5 35.058 rusty 10 35.0
sid bid day22 101 10/10/9658 103 11/12/96
R1 S1
S2
© 2013 IST
Operadores relacionais básicos (resumo)
Selecção (σ) Projecção (π)
=!Junção
S
R
União (∪)
⇒ / Divisão (/)
Produto cartesiano (X)
=!X
Intersecção (∩)
S
R
Diferença (-)
R
S
Renomeação(ρ)
1/2/14
5
© 2013 IST
Expressão de álgebra relacional (E)
8
• Recursivamente definida como sendo uma relação, um operador algébrico unário aplicado a uma expressão, ou um operador binário aplicado a duas expressões
• Interrogação obtém-se pela composição de operadores
© 2013 IST
Projecção
sname ratingyuppy 9lubber 8guppy 5rusty 10
€
πsname,rating(Sailors)
age35.055.5
€
πage(Sailors)
• Extrai colunas de uma relação • Elimina duplicados, por definição de relação Q: Qual o nome e classificação Q: Qual a idade dos marinheiros? dos marinheiros?
1/2/14
6
© 2013 IST
Selecção
€
σrating>8(Sailors)
sid sname rating age28 yuppy 9 35.058 rusty 10 35.0
sname ratingyuppy 9rusty 10
€
πsname,rating(σrating>8(Sailors))
• Retorna os tuplos de uma relação que obedecem a uma condição
Q: Quais os marinheiros Q: Quais os seus nomes e com classificação superior classificações? a 8?
© 2013 IST © Instituto Superior Técnico
Selecção (σ)
• Comparação de valores – operadores
σrating> 8 (Sailors) • Condições Lógicas
– Operadores σsname = ‘lubber’ Λ rating > 8 (Sailors)
)(),(),( ¬∨∧ notorand
≥≤><≠= ,,,,,
11
1/2/14
7
© 2013 IST
Exemplos de tabelas
sid sname rating age22 dustin 7 45.031 lubber 8 55.558 rusty 10 35.0
sid sname rating age28 yuppy 9 35.031 lubber 8 55.544 guppy 5 35.058 rusty 10 35.0
sid bid day22 101 10/10/9658 103 11/12/96
R1 S1
S2
© 2013 IST
União
sid sname rating age22 dustin 7 45.031 lubber 8 55.558 rusty 10 35.044 guppy 5 35.028 yuppy 9 35.0
S S1 2∪
• Retorna uma tabela que contém todos os tuplos de R ou S • R e S têm que ser compatíveis para união
• Mesmo número de atributos • Atributos têm os mesmos domínios
• O esquema do resultado é idêntico ao de R • Tuplos duplicados eliminados do resultado.
• Porquê?
1/2/14
8
© 2013 IST
Intersecção
sid sname rating age31 lubber 8 55.558 rusty 10 35.0
S S1 2∩
• Retorna uma tabela que contém todos os tuplos que ocorrem em ambas, R e S
• R e S têm que ser compatíveis para união • O esquema do resultado é idêntico ao de R
© 2013 IST
Diferença
sid sname rating age22 dustin 7 45.0
S S1 2−
• Retorna uma tabela que contém todos os tuplos que ocorrem em R mas não em S
• R e S têm que ser compatíveis para união • O esquema do resultado é idêntico ao de R
1/2/14
9
© 2013 IST
Produto Cartesiano
€
Sailors×Reserves
RXS: Retorna uma tabela cujo esquema contém todos os atributos de R seguidos de todos os atributos de S
© 2013 IST © Instituto Superior Técnico
Observações sobre o Produto Cartesiano
• O esquema do resultado é a concatenação dos esquemas – para desambiguar atributos usa-se a relação original
como prefixo (Sailors.sid,..., Reserves.sid...))
• O resultado é composto por todos os pares (de conjuntos de tuplos) possíveis – Se R tem n registos e S tem m então (RXS) tem n*m – no exemplo anterior, pode acontecer
Sailors.sid ≠ Reserves.sid
17
1/2/14
10
© 2013 IST
Renomeação
ρ(R(F), E) • aceita uma expressão algébrica E e retorna uma
nova tabela R • R contém os mesmos tuplos que o resultado de E • R tem o mesmo esquema que E, excepto nos
atributos que constam na lista F • F tem a forma: nome antigo -> nome novo ou
posição -> nome novo • R e F são opcionais
© 2013 IST
Exemplo
€
ρ(C(1−>sid1,5−>sid2),Sailors×Reserves)
1/2/14
11
© 2013 IST
Sumário
• Álgebra Relacional – Selecção – Projecção – União, intersecção, diferença – Renomeação – Produto cartesiano – Junção
• Junção Natural
20
© 2013 IST
Junção
• Uma das operações mais importantes e o modo mais comum de combinar dados de relações diferentes – Define-se à custa de um produto cartesiano
mas é interessante torná-la mais eficiente
21
1/2/14
12
© 2013 IST
Junção Condicional
R c S c R S = ×σ ( )
(sid) sname rating age (sid) bid day22 dustin 7 45.0 58 103 11/12/9631 lubber 8 55.5 58 103 11/12/96
€
Sailors Sailors.sid<Reserves.sidReserves
© 2013 IST
Equi-Junção
sid sname rating age bid day22 dustin 7 45.0 101 10/10/9658 rusty 10 35.0 103 11/12/96
€
Sailors Sailors.sid=Reserves.sidReserves
• A condição de junção contém apenas igualdades (eventualmente ligadas através de uma conjunção)
• Está implicita uma projecção adicional em que um dos atributos envolvido na igualdade é removido Q: Quais os marinheiros que reservaram
barcos, que barcos e em que dias?
1/2/14
13
© 2013 IST
Junção Natural
• Equi-junção em que as igualdades estão especificadas sobre todos os atributos que têm o mesmo nome nas relações de entrada – O resultado garantidamente não tem dois
atributos com o mesmo nome
24
€
Sailors Sailors.sid=Reserves.sidReserves==Sailors Reserves
© 2013 IST
Junção Natural (⋈) • Calcula o produto cartesiano de duas relações • Efectua seleção por igualdade de colunas comuns • Remove registos duplicados • É associativa: (R ⋈ S) ⋈ T = R ⋈ (S ⋈ T)
Fórmula geral R ⋈ S = Πr U s (σR.A1 = S.A1 Λ R.A2 = S.A2 Λ … (R x S) )
em que: {A1, A2, …, An} = r ∩ s, r: conjunto de atributos de R s: conjunto de atributos de S
© Instituto Superior Técnico 25
1/2/14
14
© 2013 IST
Sumário
• Álgebra Relacional – Operadores básicos – Formulação de interrogações – exemplos – Divisão
26
© 2013 IST
Exemplos de Tabelas
sid sname rating age22 dustin 7 45.031 lubber 8 55.558 rusty 10 35.0
sid sname rating age28 yuppy 9 35.031 lubber 8 55.544 guppy 5 35.058 rusty 10 35.0
sid bid day22 101 10/10/9658 103 11/12/96
R1
S1
S2
Sailors(sid, sname, rating, age) Boats(bid, bname, color) Reserves(sid, bid, day)
sid: FK(Sailors) bid: FK(Boats)
1/2/14
15
© 2013 IST
Exemplos (1)
Q1: Quais os nomes dos marinheiros que reservaram o barco 103?
Q2: Quais os nomes dos marinheiros que
reservaram um barco vermelho?
28
€
πsname((σbid=103Reserves) Sailors)
€
πsname((σcolor='red'Boats) Reserves Sailors)
© 2013 IST
Exemplos (2)
Q4: Quais os nomes dos marinheiros que reservaram pelo menos um barco?
Q5: Quais os nomes dos marinheiros que
reservaram um barco vermelho ou verde?
29
€
πsname(Reserves Sailors)
€
ρ(tempBoats,(σcolor='red'Boats)∪(σcolor='green'Boats))
πsname(tempBoats Reserves Sailors)
1/2/14
16
© 2013 IST
Exemplos (3)
Q6: Quais os nomes dos marinheiros que reservaram um barco vermelho e um barco verde?
30
ρ(tempRed,((σcolor='red 'Boats) Reserves))ρ(tempGreen,((σcolor='green'Boats) Reserves))πsname((πsid (tempRed)∩πsid (TempGreen)) Sailors)
© 2013 IST
Exemplos (4)
Q7: Quais os nomes dos marinheiros que reservaram pelo menos 2 barcos?
31
€
ρ(Resvs,πsid,sname,bid(Sailors Reserves))ρ(Pairs,(1→sid1,2→sname1,3→bid1,4→sid2,5→sname2,6→bid2),Resvs×Resvs)πsname1σ(sid1=sid2)∧(bid1≠bid2)(Pairs)
1/2/14
17
© 2013 IST
Exemplos (5)
Q8: Quais os sids dos marinheiros com idade superior a 20 que não reservaram um barco vermelho?
32
€
πsid(σage>20Sailors)−
πsid((σcolor='red'Boats) Reserves)
© 2013 IST
Exemplos (6)
Q: Qual o marinheiro mais velho?
33
€
ρ(S,Sailors)πname(Sailors (πageSailors−πSailors.age(σSailors.age<S.ageSailors×S)))
1/2/14
18
© 2013 IST
Divisão • Expressa interrogações do tipo:
Quais os nomes dos marinheiros que reservaram todos os barcos?
Supondo A(x,y) e B(y), A/B retorna o conjunto de valores de x tal que para
cada valor de y em B, existe um tuplo (x,y) em A, ou
Para cada valor de x em A, consideramos o conjunto de valores de y que ocorrem em tuplos de A com esse valor de x. Se este conjunto contiver todos os valores de y em B, então o valor de x é devolvido.
© 2013 IST
Divisão
sno pnos1 p1s1 p2s1 p3s1 p4s2 p1s2 p2s3 p2s4 p2s4 p4
pnop2
pnop2p4
pnop1p2p4
snos1s2s3s4
snos1s4
snos1
A
B1 B2
B3
A/B1 A/B2 A/B3
1/2/14
19
© 2013 IST
Exemplo
Q9: Quais os nomes dos marinheiros que reservaram todos os barcos?
36
€
€
ρ(Tempsids,(πsid,bidReserves) /(πbidBoats))πsname(Tempsids Sailors)
© 2013 IST
Ainda a divisão
• Qual a relação da divisão com o produto cartesiano?
• Qual a relação da divisão no modelo relacional com a divisão aritmética?
37
1/2/14
20
© 2013 IST
Analogia com divisão aritmética
• Para os inteiros A e B, – A/B é o maior inteiro Q tal que Q * B <= A
• Para as tabelas A e B, – A/B é a maior tabela Q tal que Q X B ⊆ A
38
© 2013 IST
Definição divisão em termos dos operadores básicos
• Dados: A(x,y) e B(y), queremos obter A/B • A ideia é calcular todos os valores de x em
A que não se desqualificam • Um valor de x é desqualificado se, ao
associá-lo a um valor y de B, o tuplo <x, y> ∉ A
– Valores de x desqualificados são dados por: πx((πx(A) X B) – A)
• A/B = πx(A) - πx((πx(A) X B) – A)
39
1/2/14
21
© 2013 IST
Extensões à álgebra relacional
• Projecção generalizada • Funções de agregação (agreggation) • Agrupamento (grouping) • Junção externa (outer-join)
• Silberchatz, 5ª edição
40
© 2013 IST
Exemplo • BD de um banco:
– Account(account-number, branch-name, balance – Loan(loan-number, branch-name, amount) – Borrower(customer-name, loan-number)
• loan-number: FK(Loan) – Depositor(customer-name, account-number)
• account-number: FK(Account) – Credit-info(customer-name, limit, credit-balance) – Employee(employee-name, street, city) – Works(employee-name, branch-name, salary)
• employee-name: FK(Employee)
41
1/2/14
22
© 2013 IST IST ▪ DEI ▪ Bases de Dados
Projecção Generalizada
Permite utilizar funções aritméticas na projecção Fórmula geral: ΠF1 , F2 , … , Fn (E)
– E é uma expressão algébrica – Fi é uma função aritmética
Exemplo: Πr.a + s.a , r.b – 0.1 * s.b (r ⋈ s)
42
© 2013 IST IST ▪ DEI ▪ Bases de Dados
Exemplo com Projecção Generalizada
Quanto é que cada cliente pode gastar até ao seu limite de crédito? ρ(result(2 ->credit_available), Πcustomer_name, limit – credit_balance (credit_info) )
43
credit_info result
1/2/14
23
© 2013 IST
aumentos
IST ▪ DEI ▪ Bases de Dados
Outro exemplo de projecção generalizada
Como ficaria a tabela account se todos os saldos fossem aumentados 10%? ρ(aumentos(3->balance), Πaccount_number, branch_name, 1.1*balance (account) )
550 440 990 770 825 770 385
account
© 2013 IST IST ▪ DEI ▪ Bases de Dados
Funções de Agregação
Recebem um conjunto de valores e devolvem um único valor como resultado • avg • min • max • sum • count • count-distinct
45
1/2/14
24
© 2013 IST IST ▪ DEI ▪ Bases de Dados
Total dos salários dos funcionários Gsum(salary) (works)
Exemplo com Agregação
16500
works
46
© 2013 IST IST ▪ DEI ▪ Bases de Dados
Exemplo com agregação (2) Número de agências com funcionários assalariados
Gcount-distinct(branch_name) (works)
3
works
1/2/14
25
© 2013 IST IST ▪ DEI ▪ Bases de Dados
Agrupamento e agregação
ρ(result(2->sum_of_salary) ,
branch_nameGsum(salary) (works) )
48
result
works
© 2013 IST IST ▪ DEI ▪ Bases de Dados
Agrupamento e agregação (2) Ρ(result(2->sum_salary, 3->max_salary),
branch_nameGsum(salary), max(salary) (works) )
49
works
result
1/2/14
26
© 2013 IST
Exemplo Quanto dinheiro tem cada cliente no banco? ρ(total(1->cliente, 2->dinheiro),
customer_nameGsum(balance) (depositor ⋈ account) )
IST ▪ DEI ▪ Bases de Dados
cliente Hayes Johnson Jones Lindsay Smith Turner
dinheiro 400 1400 750 700 700 350
total
© 2013 IST
Exemplo Quanto dinheiro deve cada cliente ao banco? ρ(dívidas(1->cliente, 2->dívida),
customer_nameGsum(amount) (borrower ⋈ loan) )
IST ▪ DEI ▪ Bases de Dados
cliente Adams Curry Hayes Jackson Jones Smith Williams
dívida 1300 500 1500 1500 1000 2900 1000
dívidas
1/2/14
27
© 2013 IST
Exemplo Qual a diferença entre o dinheiro que cada cliente tem e o que deve ao banco? ρ((2->quantia),Πcliente, dinheiro – dívida (total ⋈ dívidas))
IST ▪ DEI ▪ Bases de Dados
cliente Hayes Johnson Jones Lindsay Smith Turner
dinheiro 400 1400 750 700 700 350
cliente Adams Curry Hayes Jackson Jones Smith Williams
dívida 1300 500 1500 1500 1000 2900 1000
cliente Hayes Jones Smith
quantia -1100 -250 -2200
© 2013 IST IST ▪ DEI ▪ Bases de Dados
Junção Natural
53
Junção Natural: employee ⋈ works
employee
works
“Perde informação”!
1/2/14
28
© 2013 IST IST ▪ DEI ▪ Bases de Dados
Junção Externa Esquerda
54
Junção Esquerda (le& outer join): Employee works
employee
works
© 2013 IST
Junção Direita (right outer join): Employee works
IST ▪ DEI ▪ Bases de Dados
Junção Externa Direita
55
employee
works
Top Related