04loesung - Informatik

Werbung
Universität Augsburg, Institut für Informatik
Prof. Dr. W. Kießling
F. Wenzel, L. Rudenko
WS 2014/2015
14. Nov. 2014
Lösungsblatt 4
Datenbanksysteme I
Aufgabe 1: Relationale Algebra und Relationen-Kalkül
Antworten:
a) Relationale Algebra:
i) Selektiere Name und Wohnort der Mitarbeiter, die in der Forschung arbeiten.
πN ame,W ohnort (M itarbeiter ⋊
⋉AbtN r=N r (σAbtN ame=′ F orschung′ (Abteilung)))
Bemerkung Alternativ ist es auch möglich, die Selektion erst nach dem Join auszuwerten. Bei der Optimierung (späteres Kapitel) werden wir darauf noch genauer eingehen.
ii) Liefere für jedes Projekt in Weimar dessen Nummer, die Nummer der durchführenden Abteilung sowie Name
und Wohnort des Abteilungsmanagers.
πP N r,AbtN r,N ame,W ohnort ((ρP N r←N r (σOrt=′ W eimar′ (P rojekt)))
⋊
⋉AbtN r=N r (Abteilung) ⋊
⋉Manager=P ersN r M itarbeiter)
Bemerkung Der Operator ρa←b benennt ein Attribut b in a um (äquivalent zum ’AS’ Operator in SQL).
b) Domänen-Kalkül:
i) Selektiere Name und Wohnort der Mitarbeiter, die in der Forschung arbeiten
{(x2 , x3 )|∃x1 ∃x4 ∃x5 (M itarbeiter(x1 , x2 , x3 , x4 , x5 ) ∧ ∃y3 (Abteilung(x5 ,′ F orschung ′ , y3 )))}
Sichere DRC-Anfrage: Die Anfrage ist sicher, da x1 , x4 , x5 , y3 durch Quantoren gebunden sind und ferner
x2 , x3 in der entsprechenden maximalen Teilformel der Konjunktion weder in der Form x2 θx3 noch negiert
vorkommen. Somit sind alle vorkommenden freien Variablen beschränkt.
ii) Liefere für jedes Projekt in Weimar dessen Nummer, die Nummer der durchführenden Abteilung sowie Name
und Wohnort des Abteilungsmanagers.
{(x1 , x4 , y2 , y3 ) | ∃x2 ∃x3 ∃y1 ∃y4 ∃y5 ∃z2 (P rojekt(x1 , x2 , x3 , x4 ) ∧
M itarbeiter(y1 , y2 , y3 , y4 , y5 ) ∧ Abteilung(x4 , z2 , y1 ) ∧ x3 =′ W eimar′ )}
Sichere DRC-Anfrage: Die Anfrage ist sicher, da x2 , x3 , y1 , y4 , y5 , z2 durch Quantoren gebunden sind und
ferner x1 , x4 , y2 , y3 in deren entsprechenden maximalen Teilformeln der Konjunktion weder in der Form
t1 θt2 noch negiert vorkommen.
1
Aufgabe 2: Domänenkalkül
⋉b.P reis<a.P reis lief ert b)
a) πa.ArtN ame σb.ArtN ame=′ ON KO′ (lief ert a ⋊
b) Auswertung der Anfragen
i) Relationale Algebra:
Der Join liefert folgendes Zwischenergebnis:
a.LName
’Meier’
’Meier’
’Meier’
’Meier’
’Meier’
’Meier’
’Meier’
’Huber’
’Huber’
’Huber’
a.ArtName
’Melitta’
’Melitta’
’Melitta’
’Melitta’
’ONKO’
’ONKO’
’ONKO’
’ONKO’
’ONKO’
’Melitta’
a.Preis
6.00
6.00
6.00
6.00
5.99
5.99
5.99
5.89
5.89
2.88
b.LName
’Meier’
’Meier’
’Huber’
’Huber’
’Meier’
’Huber’
’Meier’
’Meier’
’Huber’
’Meier’
b.ArtName
’ONKO’
’Philips’
’ONKO’
’Melitta’
’Philips’
’ONKO’
’Melitta’
’Philips’
’Melitta’
’Philips’
b.Preis
5.99
0.31
5.89
2.88
0.31
5.89
2.88
0.31
2.88
0.31
Nach Anwendung der Selektion bleiben noch Tupel 1, 3 und 6 übrig, die anschließende Projektion liefert das
Endergebnis: {′ M elitta′,′ ON KO′ }
ii) Zum Domänenkalkül - wir werten zunächst nur den Join aus, ohne Selektion (siehe dazu auch Hinweis unten):
W(liefert(’Meier’, ’Melitta’, 6.00)∧liefert(’Meier’, ’Melitta’, 6.00)∧6.00 < 6.00)→false
W(liefert(’Meier’, ’Melitta’, 6.00)∧liefert(’Meier’, ’ONKO’, 5.99)∧5.99 < 6.00)→true
W(liefert(’Meier’, ’Melitta’, 6.00)∧liefert(’Meier’, ’Philips’, 0.31)∧0.31 < 6.00)→true
W(liefert(’Meier’, ’Melitta’, 6.00)∧liefert(’Huber’, ’ONKO’, 5.89)∧5.89 < 6.00)→true
W(liefert(’Meier’, ’Melitta’, 6.00)∧liefert(’Huber’, ’Melitta’, 2.88)∧2.88 < 6.00)→true
W(liefert(’Meier’, ’ONKO’, 5.99)∧liefert(’Meier’, ’Melitta’, 6.00)∧6.00 < 5.99)→false
W(liefert(’Meier’, ’ONKO’, 5.99)∧liefert(’Meier’, ’ONKO’, 5.99)∧5.99 < 5.99)→false
W(liefert(’Meier’, ’ONKO’, 5.99)∧liefert(’Meier’, ’Philips’, 0.31)∧0.31 < 5.99)→true
W(liefert(’Meier’, ’ONKO’, 5.99)∧liefert(’Huber’, ’ONKO’, 5.89)∧5.89 < 5.99)→true
W(liefert(’Meier’, ’ONKO’, 5.99)∧liefert(’Huber’, ’Melitta’, 2.88)∧2.88 < 5.99)→true
W(liefert(’Meier’, ’Philips’, 0.31)∧liefert(’Meier’, ’Melitta’, 6.00)∧6.00 < 0.31)→false
W(liefert(’Meier’, ’Philips’, 0.31)∧liefert(’Meier’, ’ONKO’, 5.99)∧5.99 < 0.31)→false
W(liefert(’Meier’, ’Philips’, 0.31)∧liefert(’Meier’, ’Philips’, 0.31)∧0.31 < 0.31)→false
W(liefert(’Meier’, ’Philips’, 0.31)∧liefert(’Huber’, ’ONKO’, 5.89)∧5.89 < 0.31)→false
W(liefert(’Meier’, ’Philips’, 0.31)∧liefert(’Huber’, ’Melitta’, 2.88)∧2.88 < 0.31)→false
W(liefert(’Huber’, ’ONKO’, 5.89)∧liefert(’Meier’, ’Melitta’, 6.00)∧6.00 < 5.89)→false
W(liefert(’Huber’, ’ONKO’, 5.89)∧liefert(’Meier’, ’ONKO’, 5.99)∧5.99 < 5.89)→false
W(liefert(’Huber’, ’ONKO’, 5.89)∧liefert(’Meier’, ’Philips’, 0.31)∧0.31 < 5.89)→true
W(liefert(’Huber’, ’ONKO’, 5.89)∧liefert(’Huber’, ’ONKO’, 5.89)∧5.89 < 5.89)→false
W(liefert(’Huber’, ’ONKO’, 5.89)∧liefert(’Huber’, ’Melitta’, 2.88)∧2.88 < 5.89)→true
W(liefert(’Huber’, ’Melitta’, 2.88)∧liefert(’Meier’, ’Melitta’, 6.00)∧6.00 < 2.88)→false
W(liefert(’Huber’, ’Melitta’, 2.88)∧liefert(’Meier’, ’ONKO’, 5.99)∧5.99 < 2.88)→false
W(liefert(’Huber’, ’Melitta’, 2.88)∧liefert(’Meier’, ’Philips’, 0.31)∧0.31 < 2.88)→true
W(liefert(’Huber’, ’Melitta’, 2.88)∧liefert(’Huber’, ’ONKO’, 5.89)∧5.89 < 2.88)→false
W(liefert(’Huber’, ’Melitta’, 2.88)∧liefert(’Huber’, ’Melitta’, 2.88)∧2.88 < 2.88)→false
Nach der Selektion von ’ONKO’ bekommen wir auch hier das Endergebnis: {′ M elitta′,′ ON KO′ }
Hinweis: Im Vorgriff auf Kapitel 6 (Algebraische Query-Optimierung) lässt sich die Query in Relationaler Algebra
auch wie folgt schreiben:
πa.ArtN ame (lief ert a ⋊
⋉b.P reis<a.P reis (σb.ArtN ame=′ ON KO′ (lief ert b)))
2
Aufgabe 3: SQL-Queries
Lösungsvorschläge:
a) Name aller Angestellten, die in Abteilung 41 arbeiten, alphabetisch sortiert nach Nachname:
SELECT last_name, first_name
FROM s_emp
WHERE dept_id = 41
ORDER BY last_name, first_name;
b) Nachname und Vorname aller Angestellten samt Name der Abteilung, in der sie arbeiten sowie der dazugehörigen
Region:
SELECT s_emp.last_name, s_emp.first_name,
s_dept.name AS DEPT_NAME, s_region.name AS REGION
FROM s_emp, s_dept, s_region
WHERE s_emp.dept_id = s_dept.id AND s_dept.region_id = s_region.id;
c) Name aller Kunden, die noch keinem Kundenbetreuer zugeordnet wurden:
SELECT s_customer.name
FROM s_customer
WHERE s_customer.id NOT IN
(SELECT c.id FROM s_emp e, s_customer c WHERE e.id = c.sales_rep_id);
d) Liste aller Kunden mit GOOD oder EXCELLENT Kredit-Rating:
SELECT *
FROM s_customer
WHERE credit_rating = ’GOOD’ OR credit_rating = ’EXCELLENT’;
e) Daten aller Lager samt zugehöriger Manager plus Angestellte, die kein Manager eines Lagers sind:
SELECT w.id, w.address , w.city, w.state, w.country, e.last_name, e.first_name
FROM s_warehouse w RIGHT OUTER JOIN s_emp e
ON w.manager_id = e.id;
3
Herunterladen