Vorlesung 6 - SQL (Teil 3)

Werbung
WS 2013/14
Datenbanksysteme
Do 17:00 – 18:30
R 1.007
Vorlesung #6
SQL (Teil 3)
WS 2013/14
Datenbanksysteme
Do 17:00 – 18:30
R 1.007
„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)
© Bojan Milijaš, 07.11.2013
Vorlesung #6 - SQL (Teil 3)
Quantifizierte Anfragen in SQL
WS 2013/14
Datenbanksysteme
Do 17:00 – 18:30
R 1.007
•
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 );
© Bojan Milijaš, 07.11.2013
Vorlesung #6 - SQL (Teil 3)
WS 2013/14
Datenbanksysteme
Do 17:00 – 18:30
R 1.007
© Bojan Milijaš, 07.11.2013
Vorlesung #6 - SQL (Teil 3)
WS 2013/14
Datenbanksysteme
Do 17:00 – 18:30
R 1.007
© Bojan Milijaš, 07.11.2013
Vorlesung #6 - SQL (Teil 3)
Quantifizierte Anfragen
in SQL (4)
WS 2013/14
Datenbanksysteme
Do 17:00 – 18:30
R 1.007
• 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 ) );
© Bojan Milijaš, 07.11.2013
Vorlesung #6 - SQL (Teil 3)
Quantifizierte Anfragen
in SQL (5)
WS 2013/14
Datenbanksysteme
Do 17:00 – 18:30
R 1.007
• 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);
© Bojan Milijaš, 07.11.2013
Vorlesung #6 - SQL (Teil 3)
WS 2013/14
Datenbanksysteme
Do 17:00 – 18:30
R 1.007
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
© Bojan Milijaš, 07.11.2013
Vorlesung #6 - SQL (Teil 3)
CROSS JOIN
(Kartesisches Produkt)
WS 2013/14
Datenbanksysteme
Do 17:00 – 18:30
R 1.007
SELECT *
FROM Studenten CROSS JOIN prüfen;
ist äquivalent zu
SELECT *
FROM Studenten, prüfen;
© Bojan Milijaš, 07.11.2013
Vorlesung #6 - SQL (Teil 3)
NATURAL JOIN
(natürlicher Verbund)
WS 2013/14
Datenbanksysteme
Do 17:00 – 18:30
R 1.007
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;
© Bojan Milijaš, 07.11.2013
Vorlesung #6 - SQL (Teil 3)
JOIN
(Theta Verbund)
WS 2013/14
Datenbanksysteme
Do 17:00 – 18:30
R 1.007
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;
© Bojan Milijaš, 07.11.2013
Vorlesung #6 - SQL (Teil 3)
JOIN
(Theta Verbund) (2)
WS 2013/14
Datenbanksysteme
Do 17:00 – 18:30
R 1.007
 Allgemein – setzt die Gleichheit der JoinSpalten nicht voraus:
SELECT *
FROM Professoren p JOIN
Assistenten a
ON p.persnr = a.boss;
© Bojan Milijaš, 07.11.2013
Vorlesung #6 - SQL (Teil 3)
* OUTER JOINs
(äußerer Vebund)
WS 2013/14
Datenbanksysteme
Do 17:00 – 18:30
R 1.007
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;
© Bojan Milijaš, 07.11.2013
Vorlesung #6 - SQL (Teil 3)
* OUTER JOINs
(äußerer Vebund) (2)
WS 2013/14
Datenbanksysteme
Do 17:00 – 18:30
R 1.007
SELECT *
FROM Vorlesungen v FULL OUTER JOIN
Assistenten a
ON v.gelesenvon = a.Boss
© Bojan Milijaš, 07.11.2013
Vorlesung #6 - SQL (Teil 3)
WS 2013/14
Datenbanksysteme
Do 17:00 – 18:30
R 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' ;
© Bojan Milijaš, 16.11.2012
Vorlesung #7 - SQL (Teil 4)
15
WS 2013/14
Datenbanksysteme
Do 17:00 – 18:30
R 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 Vorgaenger
FROM voraussetzen, Vorlesungen
WHERE Nachfolger = VorlNr
AND Titel = 'Der Wiener Kreis');
© Bojan Milijaš, 16.11.2012
Vorlesung #7 - SQL (Teil 4)
16
WS 2013/14
Datenbanksysteme
Do 17:00 – 18:30
R 1.007
Rekursion (3)
SELECT Vogänger
FROM voraussetzen
WHERE Nachfolger IN (SELECT Vorgänger
FROM voraussetzen, Vorlesungen
WHERE Nachfolger = VorlNr
AND Titel = `Der Wiener Kreis´);
Entschachtelung
SELECT v1.Vogänger
FROM voraussetzen v1, voraussetzen v2, Vorlesungen v
WHERE v1.Nachfolger = v2.Vorgänger
AND v2.Nachfolger = v.VorlNr
AND v.Titel = `Der Wiener Kreis´;
© Bojan Milijaš, 16.11.2012
Vorlesung #7 - SQL (Teil 4)
17
WS 2013/14
Datenbanksysteme
Do 17:00 – 18:30
R 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 v
WHERE v1.Nachfolger = v2.Vorgänger
AND ...
AND v_n-1.Nachfolger = vn.Vorgänger
AND vn.Nachfolger = VorlNr
AND v.Titel = `Der Wiener Kreis´;
© Bojan Milijaš, 16.11.2012
Vorlesung #7 - SQL (Teil 4)
18
WS 2013/14
Datenbanksysteme
Do 17:00 – 18:30
R 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“
© Bojan Milijaš, 16.11.2012
Vorlesung #7 - SQL (Teil 4)
19
Rekursion (6) –
Transitive Hülle voraussetzen
WS 2013/14
Datenbanksysteme
Do 17:00 – 18:30
R 1.007
Der Wiener Kreis
Wissenschaftstheorie
Erkenntnistheorie
Bioethik
Ethik
Mäeutik
Grundzüge
© Bojan Milijaš, 16.11.2012
Vorlesung #7 - SQL (Teil 4)
20
Rekursion (7) – Transitive Hülle
WS 2013/14
Datenbanksysteme
Do 17:00 – 18:30
R 1.007
transA,B(R)= {(a,b)  k  IN (1, ..., k  R (
1.A= 2.B 

k-1.A= k.B 
1.A= a 
k.B= b))}
© Bojan Milijaš, 16.11.2012
Vorlesung #7 - SQL (Teil 4)
21
Rekursion (8) –
Oracle CONNECT BY Konstrukt
WS 2013/14
Datenbanksysteme
Do 17:00 – 18:30
R 1.007
select Titel
from Vorlesungen
where VorlNr in
(select Vorgaenger
from voraussetzen
CONNECT BY Nachfolger = PRIOR Vorgaenger
START WITH Nachfolger =
(select VorlNr
from Vorlesungen
where Titel= 'Der Wiener Kreis'));
© Bojan Milijaš, 16.11.2012
Vorlesung #7 - SQL (Teil 4)
22
Rekursion (9) in IBM DB2
WS 2013/14
Datenbanksysteme
Do 17:00 – 18:30
R 1.007
with TransVorl (Vorg, Nachf)
as (select Vorgaenger, Nachfolger from voraussetzen
union all
select t.Vorg, v.Nachfolger
from TransVorl t, voraussetzen v
where t.Nachf= v.Vorgaenger)
select Titel from Vorlesungen where VorlNr in
(select Vorg from TransVorl where Nachf in
(select VorlNr from Vorlesungen
where Titel= 'Der Wiener Kreis') );
© Bojan Milijaš, 16.11.2012
Vorlesung #7 - SQL (Teil 4)
23
WS 2013/14
Datenbanksysteme
Do 17:00 – 18:30
R 1.007
Vorlesung #6
Ende
Herunterladen