Upload
adalbert-ramberg
View
106
Download
1
Tags:
Embed Size (px)
Citation preview
WS 2013/14Datenbanksysteme
Do 17:00 – 18:30R 1.007
Vorlesung #6
SQL (Teil 3)
WS 2013/14Datenbanksysteme
Do 17:00 – 18:30R 1.007
© Bojan Milijaš, 07.11.2013
„Fahrplan“ Besprechung eines Beispiels, SQL-Übungen Quantifizierte Anfragen
Doppelter NOT EXISTS HAVING count =
JOINs in SQL-92 CROSS, NATURAL, INNER, LEFT/RIGHT/FULL OUTER
Rekursion Standard SQL (geschachtelt, entschachtelt) in ORACLE (CONNECT BY PRIOR) in DB2 (WITH View)
Vorlesung #6 - SQL (Teil 3)
WS 2013/14Datenbanksysteme
Do 17:00 – 18:30R 1.007
© Bojan Milijaš, 07.11.2013 Vorlesung #6 - SQL (Teil 3)
Quantifizierte Anfragen in SQL
• Es gibt keinen expliziten Allquantor
• Es gibt aber den Existenzquantor: exists, not exists
• wieder: „Professoren, die keine Vorlesung halten“
select Name, PersNr
from Professoren p
where not exists
( select *
from Vorlesungen
where gelesenVon = p.PersNr );
WS 2013/14Datenbanksysteme
Do 17:00 – 18:30R 1.007
© Bojan Milijaš, 07.11.2013 Vorlesung #6 - SQL (Teil 3)
WS 2013/14Datenbanksysteme
Do 17:00 – 18:30R 1.007
© Bojan Milijaš, 07.11.2013 Vorlesung #6 - SQL (Teil 3)
WS 2013/14Datenbanksysteme
Do 17:00 – 18:30R 1.007
© Bojan Milijaš, 07.11.2013 Vorlesung #6 - SQL (Teil 3)
Quantifizierte Anfragen in SQL (4)• Wer hat alle vierstündigen Vorlesungen gehört?
select s.*
from Studenten s
where not exists
(select *
from Vorlesungen v
where v.SWS = 4 and not exists
(select *
from hören h
where h.VorlNr = v.VorlNr and h.MatrNr=s.MatrNr ) );
WS 2013/14Datenbanksysteme
Do 17:00 – 18:30R 1.007
© Bojan Milijaš, 07.11.2013 Vorlesung #6 - SQL (Teil 3)
Quantifizierte Anfragen in SQL (5)
• Allquantifizierung kann immer auch durch eine count Aggregation ausgedrückt werden
Wir betrachten dazu eine etwas einfachere Anfrage, in der wir die (MatrNr der) Studenten ermitteln wollen, die alle Vorlesungen hören:
select h.MatrNr
from hören h
group by h.MatrNr
having count (*) = (select count (*) from Vorlesungen);
WS 2013/14Datenbanksysteme
Do 17:00 – 18:30R 1.007
© Bojan Milijaš, 07.11.2013 Vorlesung #6 - SQL (Teil 3)
JOINs in SQL-92
cross join: Kreuzprodukt natural join: natürlicher Join join oder inner join: Theta-Join left outer join: linker äußerer Join right outer join: rechter äußerer Join full outer join: äußerer Join
WS 2013/14Datenbanksysteme
Do 17:00 – 18:30R 1.007
© Bojan Milijaš, 07.11.2013 Vorlesung #6 - SQL (Teil 3)
CROSS JOIN (Kartesisches Produkt)
SELECT *
FROM Studenten CROSS JOIN prüfen;
ist äquivalent zu
SELECT *
FROM Studenten, prüfen;
WS 2013/14Datenbanksysteme
Do 17:00 – 18:30R 1.007
© Bojan Milijaš, 07.11.2013 Vorlesung #6 - SQL (Teil 3)
NATURAL JOIN(natürlicher Verbund)SELECT *
FROM Studenten NATURAL JOIN prüfen;
ist äquivalent zu
SELECT s.MatrNr, s.Name, s.Semester,
/* p.MatrNr ausgelassen */
p.VorlNr, p.PersNr, p.Note
FROM Studenten s, prüfen p
WHERE s.MatrNr = p.MatrNr;
WS 2013/14Datenbanksysteme
Do 17:00 – 18:30R 1.007
© Bojan Milijaš, 07.11.2013 Vorlesung #6 - SQL (Teil 3)
JOIN(Theta Verbund)SELECT * FROM Studenten s JOIN prüfen p ON s.MatrNr = p.MatrNr;
ist äquivalent zu
SELECT * FROM Studenten s, prüfen p WHERE s.MatrNr = p.MatrNr;
WS 2013/14Datenbanksysteme
Do 17:00 – 18:30R 1.007
© Bojan Milijaš, 07.11.2013 Vorlesung #6 - SQL (Teil 3)
JOIN(Theta Verbund) (2)
Allgemein – setzt die Gleichheit der Join-Spalten nicht voraus:
SELECT *
FROM Professoren p JOIN
Assistenten a
ON p.persnr = a.boss;
WS 2013/14Datenbanksysteme
Do 17:00 – 18:30R 1.007
© Bojan Milijaš, 07.11.2013 Vorlesung #6 - SQL (Teil 3)
* OUTER JOINs(äußerer Vebund)SELECT * FROM Studenten s LEFT OUTER JOIN pruefen p ON s.matrnr = p.matrnr;
SELECT * FROM uni.hoeren h RIGHT OUTER JOIN uni.Vorlesungen v ON h.vorlnr = v.vorlnr;
WS 2013/14Datenbanksysteme
Do 17:00 – 18:30R 1.007
© Bojan Milijaš, 07.11.2013 Vorlesung #6 - SQL (Teil 3)
* OUTER JOINs(äußerer Vebund) (2)
SELECT *
FROM Vorlesungen v FULL OUTER JOIN
Assistenten a
ON v.gelesenvon = a.Boss
WS 2013/14Datenbanksysteme
Do 17:00 – 18:30R 1.007
Rekursion
Rekursive Relation voraussetzen in UNI Schema
voraussetzen : {[Vorgänger, Nachfolger]} „Welche Vorlesungen muss man hören, um die
Vorlesung „Der Wiener Kreis“ zu verstehen?
SELECT Vorgaenger
FROM voraussetzen vs, Vorlesungen vo
WHERE vs.Nachfolger = vo.VorlNr
AND vo.Titel = 'Der Wiener Kreis' ;
Vorlesung #7 - SQL (Teil 4)© Bojan Milijaš, 16.11.2012 15
WS 2013/14Datenbanksysteme
Do 17:00 – 18:30R 1.007
Rekursion (2)
Das sind aber nur die direkten Vorgänger, bzw. Vorgänger erster Stufe!
Wie bekommt man alle? Zunächst Vorgänger zweiter Stufe:
SELECT Vorgaenger
FROM voraussetzen
WHERE Nachfolger IN (SELECT(SELECT Vorgaenger Vorgaenger
FROMFROM voraussetzen, Vorlesungen voraussetzen, Vorlesungen
WHEREWHERE Nachfolger = VorlNr Nachfolger = VorlNr
ANDAND Titel = 'Der Wiener Kreis' Titel = 'Der Wiener Kreis'));;
Vorlesung #7 - SQL (Teil 4)© Bojan Milijaš, 16.11.2012 16
WS 2013/14Datenbanksysteme
Do 17:00 – 18:30R 1.007
Rekursion (3)SELECT SELECT Vogänger Vogänger
FROM FROM voraussetzenvoraussetzen
WHERE WHERE NachfolgerNachfolger IN (SELECT IN (SELECT Vorgänger Vorgänger
FROMFROM voraussetzen, Vorlesungen voraussetzen, Vorlesungen
WHEREWHERE Nachfolger = VorlNr Nachfolger = VorlNr
ANDAND Titel = `Der Wiener Kreis´ Titel = `Der Wiener Kreis´));;
SELECT SELECT v1.Vogänger v1.Vogänger
FROM FROM voraussetzen v1, voraussetzen v2, Vorlesungen vvoraussetzen v1, voraussetzen v2, Vorlesungen v
WHERE WHERE v1.Nachfolger = v2.Vorgängerv1.Nachfolger = v2.Vorgänger
ANDAND v2.Nachfolger = v.VorlNr v2.Nachfolger = v.VorlNr
ANDAND v.Titel = `Der Wiener Kreis´; v.Titel = `Der Wiener Kreis´;
EntschachtelungEntschachtelung
Vorlesung #7 - SQL (Teil 4)© Bojan Milijaš, 16.11.2012 17
WS 2013/14Datenbanksysteme
Do 17:00 – 18:30R 1.007
Rekursion (4)
Man kann die gewonenne entschachtelte Abfrage verallgemeinern für die Vorgänger n-ten Stufe
SELECT v1.Vorgänger FROM voraussetzen v1, ..., voraussetzen v_n-1, voraussetzen vn, Vorlesungen vWHERE v1.Nachfolger = v2.Vorgänger AND ... AND v_n-1.Nachfolger = vn.Vorgänger AND vn.Nachfolger = VorlNr AND v.Titel = `Der Wiener Kreis´;
Vorlesung #7 - SQL (Teil 4)© Bojan Milijaš, 16.11.2012 18
WS 2013/14Datenbanksysteme
Do 17:00 – 18:30R 1.007
Rekursion (5)
(-) sehr umständlich zu formulieren (-) ineffizient bei der Durchführung (-) leider in SQL-Standard nicht anders
möglich SQL ist nicht Turing-vollständig, SQL ist deklarativ, keine Schleifen, keine Kontrollverzweigungen, keine GO TO, JUMP Befehle oder ähnliches
Das Finden aller Vorgänger nennt man allgemein „Berechnen der transitiver Hülle“
Vorlesung #7 - SQL (Teil 4)© Bojan Milijaš, 16.11.2012 19
WS 2013/14Datenbanksysteme
Do 17:00 – 18:30R 1.007
Rekursion (6) –Transitive Hülle voraussetzen
Der Wiener KreisDer Wiener Kreis
WissenschaftstheoWissenschaftstheorierie
BioethikBioethik
ErkenntnistheorieErkenntnistheorie EthikEthik MäeutiMäeutikk
GrundzügeGrundzüge
Vorlesung #7 - SQL (Teil 4)© Bojan Milijaš, 16.11.2012 20
WS 2013/14Datenbanksysteme
Do 17:00 – 18:30R 1.007
Rekursion (7) – Transitive Hülle
transtransA,BA,B(R)=(R)= {( {(a,ba,b) ) kk IN IN ((1, ..., 1, ..., k k R ( R (
1.A= 1.A= 2.B 2.B
k-1.A= k-1.A= k.B k.B
1.A= a 1.A= a
k.B= b))k.B= b))}}
Vorlesung #7 - SQL (Teil 4)© Bojan Milijaš, 16.11.2012 21
WS 2013/14Datenbanksysteme
Do 17:00 – 18:30R 1.007
Rekursion (8) – Oracle CONNECT BY Konstrukt
select select TitelTitel
fromfrom Vorlesungen Vorlesungen
wherewhere VorlNr VorlNr inin
((selectselect Vorgaenger Vorgaenger
fromfrom voraussetzen voraussetzen
CONNECT BYCONNECT BY Nachfolger = Nachfolger = PRIORPRIOR Vorgaenger Vorgaenger
START WITHSTART WITH Nachfolger = Nachfolger =
((selectselect VorlNr VorlNr
fromfrom Vorlesungen Vorlesungen
where where Titel= 'Der Wiener Kreis'));Titel= 'Der Wiener Kreis'));
Vorlesung #7 - SQL (Teil 4)© Bojan Milijaš, 16.11.2012 22
WS 2013/14Datenbanksysteme
Do 17:00 – 18:30R 1.007
Rekursion (9) in IBM DB2
withwith TransVorl (Vorg, Nachf) TransVorl (Vorg, Nachf)asas ( (selectselect Vorgaenger, Nachfolger Vorgaenger, Nachfolger fromfrom voraussetzen voraussetzen
union allunion all selectselect t.Vorg, v.Nachfolger t.Vorg, v.Nachfolger fromfrom TransVorl t, voraussetzen v TransVorl t, voraussetzen v wherewhere t.Nachf= v.Vorgaenger) t.Nachf= v.Vorgaenger)
select select Titel Titel fromfrom Vorlesungen Vorlesungen where where VorlNr VorlNr inin
((selectselect Vorg Vorg fromfrom TransVorlTransVorl wherewhere Nachf Nachf inin
((selectselect VorlNr VorlNr fromfrom Vorlesungen Vorlesungen
wherewhere Titel= 'Der Wiener Kreis') ); Titel= 'Der Wiener Kreis') );Vorlesung #7 - SQL (Teil 4)© Bojan Milijaš, 16.11.2012 23
WS 2013/14Datenbanksysteme
Do 17:00 – 18:30R 1.007
Vorlesung #6
Ende