24
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 Vorlesung #6 SQL (Teil 3)

Embed Size (px)

Citation preview

Page 1: WS 2013/14 Datenbanksysteme Do 17:00 – 18:30 R 1.007 Vorlesung #6 SQL (Teil 3)

WS 2013/14Datenbanksysteme

Do 17:00 – 18:30R 1.007

Vorlesung #6

SQL (Teil 3)

Page 2: WS 2013/14 Datenbanksysteme Do 17:00 – 18:30 R 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)

Page 3: WS 2013/14 Datenbanksysteme Do 17:00 – 18:30 R 1.007 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 );

Page 4: WS 2013/14 Datenbanksysteme Do 17:00 – 18:30 R 1.007 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)

Page 5: WS 2013/14 Datenbanksysteme Do 17:00 – 18:30 R 1.007 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)

Page 6: WS 2013/14 Datenbanksysteme Do 17:00 – 18:30 R 1.007 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 ) );

Page 7: WS 2013/14 Datenbanksysteme Do 17:00 – 18:30 R 1.007 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 (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);

Page 8: WS 2013/14 Datenbanksysteme Do 17:00 – 18:30 R 1.007 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)

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

Page 9: WS 2013/14 Datenbanksysteme Do 17:00 – 18:30 R 1.007 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)

CROSS JOIN (Kartesisches Produkt)

SELECT *

FROM Studenten CROSS JOIN prüfen;

ist äquivalent zu

SELECT *

FROM Studenten, prüfen;

Page 10: WS 2013/14 Datenbanksysteme Do 17:00 – 18:30 R 1.007 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)

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;

Page 11: WS 2013/14 Datenbanksysteme Do 17:00 – 18:30 R 1.007 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)

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;

Page 12: WS 2013/14 Datenbanksysteme Do 17:00 – 18:30 R 1.007 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)

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;

Page 13: WS 2013/14 Datenbanksysteme Do 17:00 – 18:30 R 1.007 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)

* 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;

Page 14: WS 2013/14 Datenbanksysteme Do 17:00 – 18:30 R 1.007 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)

* OUTER JOINs(äußerer Vebund) (2)

SELECT *

FROM Vorlesungen v FULL OUTER JOIN

Assistenten a

ON v.gelesenvon = a.Boss

Page 15: WS 2013/14 Datenbanksysteme Do 17:00 – 18:30 R 1.007 Vorlesung #6 SQL (Teil 3)

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

Page 16: WS 2013/14 Datenbanksysteme Do 17:00 – 18:30 R 1.007 Vorlesung #6 SQL (Teil 3)

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

Page 17: WS 2013/14 Datenbanksysteme Do 17:00 – 18:30 R 1.007 Vorlesung #6 SQL (Teil 3)

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

Page 18: WS 2013/14 Datenbanksysteme Do 17:00 – 18:30 R 1.007 Vorlesung #6 SQL (Teil 3)

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

Page 19: WS 2013/14 Datenbanksysteme Do 17:00 – 18:30 R 1.007 Vorlesung #6 SQL (Teil 3)

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

Page 20: WS 2013/14 Datenbanksysteme Do 17:00 – 18:30 R 1.007 Vorlesung #6 SQL (Teil 3)

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

Page 21: WS 2013/14 Datenbanksysteme Do 17:00 – 18:30 R 1.007 Vorlesung #6 SQL (Teil 3)

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

Page 22: WS 2013/14 Datenbanksysteme Do 17:00 – 18:30 R 1.007 Vorlesung #6 SQL (Teil 3)

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

Page 23: WS 2013/14 Datenbanksysteme Do 17:00 – 18:30 R 1.007 Vorlesung #6 SQL (Teil 3)

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

Page 24: WS 2013/14 Datenbanksysteme Do 17:00 – 18:30 R 1.007 Vorlesung #6 SQL (Teil 3)

WS 2013/14Datenbanksysteme

Do 17:00 – 18:30R 1.007

Vorlesung #6

Ende