Skript zur Vorlesung Datenbanksysteme 2 Wintersemester 2007/2008 Christian Pape 16. Januar 2008 1 / 277 Einführung Schedule 1. Veranstaltung 1. Veranstaltung 2. Veranstaltung 2. Veranstaltung 3. Veranstaltung 3. Veranstaltung 4. Veranstaltung 4. Veranstaltung 5. Veranstaltung 5. Veranstaltung 6. Veranstaltung Weihnachtspause 6. Veranstaltung 7. Veranstaltung 7. Veranstaltung 8. Veranstaltung 8. Veranstaltung Prüfungswoche Prüfungswoche Datum 11.10.2007 18.10.2007 25.10.2007 01.11.2007 08.11.2007 15.11.2007 22.11.2007 29.11.2007 06.12.2007 13.12.2007 20.12.2007 27.12.2007 03.01.2008 10.01.2008 17.01.2008 24.01.2008 31.01.2008 07.02.2008 14.02.2008 DBS2 SU1 SU2 SU1 SU2 SU1 SU2 SU1 SU2 SU1 SU2 SU1 C SU1 SU2 SU1 SU2 SU1 SU2 SU1 SU2 SU1 SU2 SU1 SU2 SU1 SU2 SU1 SU2 SU2 SU1 SU2 SU1 SU2 2 / 277 Einführung Inhalt I Relationenalgebra I I I I I I Mengenoperationen Kartesisches Produkt Projektion, Selektion, Verbund, Division Operatorbäume Algebraische Optimierung SQL I I I I I I I Infrastruktur HS-Fulda SELECT-Syntax Funktionen Sub-Queries Aggregatfunktionen Gruppierung Suchbedingungen 3 / 277 Einführung Inhalt (2) I SQL (Fortsetzung) I I I I I I I I I I I Prädikate NULL-Werte Joins Transitive Hülle Datenmanipulation Erzeugung Basisrelationen Fremdschlüsselbeziehungen Integritätsbedingungen Sichten Anwendungsprogrammierung Datenkontrolle I I I Trigger Zugriffskontrolle Transaktionen 4 / 277 Einführung Informationen Informationen zu Vorlesung bzw. Übung: http://wi-labor.informatik.hs-fulda.de/dbs2 5 / 277 Relationenalgebra Relation Eine Relation R ist eine Menge von Tupeln: R = {t1 , t2 , . . . , tn } mit ti = (v1 , v2 , . . . , vr ) Dabei heißt r der Grad von R. Ausserdem definieren wir die Attributmenge AR Definitionsbereich dom(a) R AR = {a1 , a2 , . . . , ar } und den = {d1 , d2 , . . . , dm } mit a ∈ AR = {(a, 0, 43), (x, 1, 36), (b, 1, 38)} = {A, B, C } dom(A) = {0 a0 ,0 b 0 , . . . ,0 z 0 } dom(B) = {0, 1} dom(C ) = N R A a x b B 0 1 1 C 43 36 38 6 / 277 Relationenalgebra Vereinigung (Union) R ∪S = {t|t ∈ R ∨ t ∈ S} Beispiel: R = {(a, 1), (b, 2), (c, 3)} S = {(c, 3), (d , 4)} R ∪ S =? 7 / 277 Relationenalgebra Vereinigung (Union) R ∪S = {t|t ∈ R ∨ t ∈ S} Beispiel: R = {(a, 1), (b, 2), (c, 3)} S = {(c, 3), (d , 4)} R ∪ S = {(a, 1), (b, 2), (c, 3), (d , 4)} 8 / 277 Relationenalgebra Beispiel Vereinigung R A a d b B x y z C 1 2 3 R ∪S S A b d B x y C 3 2 A a d b b B x y z x C 1 2 3 3 9 / 277 Relationenalgebra Durchschnitt (Intersect) R ∩S = {t|t ∈ R ∧ t ∈ S} = R − (R − S) Beispiel: R = {(a, 1), (b, 2), (c, 3)} S = {(c, 3), (d , 4)} R ∩ S =? 10 / 277 Relationenalgebra Durchschnitt (Intersect) R ∩S = {t|t ∈ R ∧ t ∈ S} = R − (R − S) Beispiel: R = {(a, 1), (b, 2), (c, 3)} S = {(c, 3), (d , 4)} R ∩ S = {(c, 3)} 11 / 277 Relationenalgebra Beispiel Durchschnitt R A a d b B x y z C 1 2 3 S A b d B x y C 3 2 R ∩S A d B y C 2 12 / 277 Relationenalgebra Differenz R −S = {t|t ∈ R ∧ t ∈ / S} Beispiel: R = {(a, 1), (b, 2), (c, 3)} S = {(c, 3), (d , 4)} R − S =? 13 / 277 Relationenalgebra Differenz R −S = {t|t ∈ R ∧ t ∈ / S} Beispiel: R = {(a, 1), (b, 2), (c, 3)} S = {(c, 3), (d , 4)} R − S = {(a, 1), (b, 2)} 14 / 277 Relationenalgebra Beispiel Differenz R A a d b B x y z C 1 2 3 S A b d B x y C 3 2 R −S A a b B x z C 1 3 15 / 277 Relationenalgebra Symmetrische Differenz R4S = (R ∪ S) − (R ∩ S) = ((R ∪ S) − (R − (R − S))) = {t|t ∈ R ⊕ t ∈ S} Beispiel: R = {(a, 1), (b, 2), (c, 3)} S = {(c, 3), (d , 4)} R4S =? 16 / 277 Relationenalgebra Symmetrische Differenz R4S = (R ∪ S) − (R ∩ S) = ((R ∪ S) − (R − (R − S))) = {t|t ∈ R ⊕ t ∈ S} Beispiel: R = {(a, 1), (b, 2), (c, 3)} S = {(c, 3), (d , 4)} R4S = {(a, 1), (b, 2), (d , 4)} 17 / 277 Relationenalgebra Beispiel Symmetrische Differenz R A a d b B x y z C 1 2 3 S A b d B x y C 3 2 R4S A a b b B x z x C 1 3 3 18 / 277 Relationenalgebra Erweitertes Kartesisches Produkt Sei r der Grad von R, d.h. R = {(a1 , a2 , . . . , ar )} und s der Grad von S, d.h. S = {(b1 , b2 , . . . , bs )} dann gilt R × S = {(a1 , a2 , . . . , ar , b1 , b2 , . . . , bs ) | (a1 , a2 , . . . , ar ) ∈ R ∧ (b1 , b2 , . . . , bs ) ∈ S} Beispiel: R = {(a, 1), (b, 2), (c, 3)} S = {(c, 3), (d , 4)} R × S =? 19 / 277 Relationenalgebra Erweitertes Kartesisches Produkt Sei r der Grad von R, d.h. R = {(a1 , a2 , . . . , ar )} und s der Grad von S, d.h. S = {(b1 , b2 , . . . , bs )} dann gilt R × S = {(a1 , a2 , . . . , ar , b1 , b2 , . . . , bs ) | (a1 , a2 , . . . , ar ) ∈ R ∧ (b1 , b2 , . . . , bs ) ∈ S} Beispiel: R = {(a, 1), (b, 2), (c, 3)} S = {(c, 3), (d , 4)} R ×S = {(a, 1, c, 3), (a, 1, d , 4), (b, 2, c, 3), (b, 2, d , 4), (c, 3, c, 3), (c, 3, d , 4)} 20 / 277 Relationenalgebra Beispiel Kartesisches Produkt R A a d b B x y z C 1 2 3 S D b d E x y F 3 2 R ×S A a a d d b b B x x y y z z C 1 1 2 2 3 3 D b d b d b d E x y x y x y F 3 2 3 2 3 2 21 / 277 Relationenalgebra Projektion Sei r der Grad von R und Y = {ji |i ∈ {1, 2, . . . , k}, ji ∈ {1, 2, . . . , r }}, dann heißt πY (R) die Projektion von R auf Y mit πY (R) = {p[Y ]|p ∈ R}. Dabei ist p[Y ] die Einschränkung des Tupels p auf die Attributmenge Y . 22 / 277 Relationenalgebra Beispiel Projektion π1,2 (R) R NAME Meier Schneider Weber Schmidt VORNAME Karl Herbert Heinz Anette NAME Meier Schneider Weber Schmidt ALTER 43 36 38 πALTER (R) 36 VORNAME Karl Herbert Heinz Anette ALTER 43 36 38 23 / 277 Relationenalgebra Selektion Auswahl von Zeilen einer Relation R über Prädikate P. P ist eine logische Formel (ohne Quantoren) zusammengestellt aus: a.) Operanden (Konstanten/Spaltennummern oder auch Attributnamen) b.) θ ∈ {<, =, >, ≤, 6=, ≥} c.) ∨, ∧, ¬ Dann ist die Selektion definiert als: σP (R) = {t|∃t ∈ R ∧ P(t)} 24 / 277 Relationenalgebra Beispiel Selektion R NAME Meier Schneider Weber Schmidt VORNAME Karl Herbert Heinz Anette σNAME =0 Meier 0 (R) σALTER>36 (R) NAME Meier NAME Meier Weber ALTER 43 36 38 36 VORNAME Karl VORNAME Karl Heinz ALTER 43 ALTER 43 38 25 / 277 Relationenalgebra Verbund (Join) Kartesisches Produkt zwischen zwei Relationen R (Grad r ) und S (Grad s) eingeschränkt durch θ-Bedingung zwischen i-Spalte von R und j-Spalte von S mit θ ∈ {<, =, >, ≤, 6=, ≥}. Dann ist der Verbund definiert als: R iθj S = σiθr +j (R × S) Wenn θ dem Gleichheitsoperator entspricht, so spricht man auch von einem Gleichheitsverbund (Equijoin). 26 / 277 Relationenalgebra Beispiel Gleichverbund R A a1 a2 B b1 b2 C c1 c2 S D c1 c3 E d1 d2 F e1 e2 R C =D S A a1 B b1 C c1 D c1 E d1 F e1 27 / 277 Relationenalgebra Verbund (Join) Ein Gleichverbund zwischen zwei Relationen R und S heißt verlustfrei, wenn alle Tupel von R und S am Verbund teilnehmen. Die inverse Operation Projektion erzeugt dann wieder R und S (lossless join). 28 / 277 Relationenalgebra Intervall-Verbund (Band Join) Anstatt einer θ-Bedingung wird hier eine Intervallbedingung I = [c1 , c2 ] überprüft. V = R iIj S = σiIj (R × S) = σR.i−c1 ≤S.j≤R.i+c2 (R × S) Ein Tupel aus S kombiniert mit einem Tupel aus R nur, wenn der Wert der j-Spalte von S im Intervall der Größe c1 + c2 um den Wert der i-Spalte von R liegt. 29 / 277 Relationenalgebra Natürlicher Verbund (Natural Join) Gleichverbund über alle gleichen Attribute und Ausblendung gleicher Spalten. R mit AR = {(a1 , . . . , ar −j+1 , . . . , ar )} S mit AS = {(b1 , . . . , bj , . . . , bs )} mit b1 = ar −j+1 , b2 = ar −j+2 , . . . , bj = ar Dann gilt R S = πa1 ,...,ar ,bj+1 ,...,bs σ(R.ar −j+1 =S.b1 )∧···∧(R.ar =S.bj ) (R × S) 30 / 277 Relationenalgebra Beispiel Natürlicher Verbund R A a1 a2 B b1 b2 C c1 c2 S C c1 c3 D d1 d2 E e1 e2 R S A a1 B b1 C c1 D d1 E e1 31 / 277 Relationenalgebra Äußerer Verbund (Outer Join) Verlustfreier Verbund soll erzwungen werden. Seien A die Verbundattribute und ≡ der undefinierte Wert: R 0 = R ∪ ((πA (S) − πA (R)) × {≡} × · · · × {≡}) S 0 = S ∪ ((πA (R) − πA (S)) × {≡} × · · · × {≡}) Äußerer Gleichverbund: R][(R.A=S.A) S = R 0 (R 0 .A=S 0 .A) S 0 Äußerer natürlicher Verbund: R][S = R 0 S 0 32 / 277 Relationenalgebra Beispiel Äußerer Verbund R A a1 a2 B b1 b2 C c1 c2 S C c1 c3 D d1 d2 E e1 e2 R][S A a1 a2 ≡ B b1 b2 ≡ C c1 c2 c3 D d1 ≡ d2 E e1 ≡ e2 33 / 277 Relationenalgebra Linker äußerer Verbund (Left Outer Join) Bei dieser Operation bleibt die linke Relation verlustfrei, d.h. bei Bedarf wird ein Tupel durch den ≡-Wert ergänzt. R](R.A=S.A) S = R (R.A=S 0 .A) S 0 34 / 277 Relationenalgebra Beispiel Linker äußerer Verbund R A a1 a2 B b1 b2 C c1 c2 S C c1 c3 D d1 d2 E e1 e2 R] S A a1 a2 B b1 b2 C c1 c2 D d1 ≡ E e1 ≡ 35 / 277 Relationenalgebra Rechter äußerer Verbund (Right Outer Join) Bei dieser Operation bleibt die rechte Relation verlustfrei, d.h. bei Bedarf wird ein Tupel durch den ≡-Wert ergänzt. R [(R.A=S.A) S = R 0 (R 0 .A=S.A) S 36 / 277 Relationenalgebra Beispiel Rechter äußerer Verbund R A a1 a2 B b1 b2 C c1 c2 S C c1 c3 D d1 d2 E e1 e2 R [S A a1 ≡ B b1 ≡ C c1 c3 D d1 d2 E e1 e2 37 / 277 Relationenalgebra Division Beantwortung von Fragen, bei denen eine ganze Relation zur Qualifikation herangezogen wird. Ein Tupel aus R steht mit allen Tupeln aus S in einer bestimmten Beziehung. Sei R vom Grad r und S vom Grad s mit s 6= 0 und AS ⊂ AR . Dann gilt: R ÷ S = {(t1 , . . . , tr −s )|∀u ∈ S : (t1 , . . . , tr −s , u1 , . . . , us ) ∈ R} 38 / 277 Relationenalgebra Division (Beschreibung mit Grundoperationen) T = π1,2,...,r −s (R) W = (T × S) − R V = π1,2,...,r −s (W ) R ÷S =T −V = π1,2,...,r −s (R) − π1,2,...,r −s ((π1,2,...,r −s (R) × S) − R) Es gilt: (R × S) ÷ S = R 39 / 277 Relationenalgebra Beispiel Division Frage: Welcher Lieferant liefert alle Teile? LIEF TEIL LNR L1 L1 L2 L3 L3 L3 TNR T1 T2 T2 T1 T2 T3 TNR T1 T2 T3 TNAME NAGEL BOLZEN MUTTER πTNR (TEIL) TNR T1 T2 T3 LIEF ÷ (πTNR (TEIL)) LNR L3 GEWICHT 12 12 15 40 / 277 Relationenalgebra Operatorbaum Finde alle Schauspieler (NAME, W-ORT), die bei in Weimar uraufgeführten Dramen an ihrem Wohnort als "Held" mitgespielt haben. =πNAME ,W −ORT (σW −ORT =A−ORT (SCHAUSPIELER ( πPNR,A−ORT (DARSTELLER (πFIGUR ( (σGESCHLECHT =0 HELD 0 ROLLE ) (σU−ORT =0 WEIMAR 0 DRAMA))))))) 41 / 277 Relationenalgebra Operatorbaum πNAME ,W −ORT σW −ORT =A−ORT πPNR,A−ORT πFIGUR SCHAUSPIELER DARSTELLER σR−GESCHLECHT =0 HELD 0 σU−ORT =0 WEIMAR 0 ROLLE DRAMA 42 / 277 Relationenalgebra Rewrite Regeln (1) 1. Kommutatives Gesetz für Verbunde und Produkte R1 F R2 = R2 F R1 R1 R2 = R2 R1 R1 × R2 = R2 × R1 2. Assoziatives Gesetz für Verbunde und Produkte (R1 F 1 R2) F 2 R3 = R1 F 1 (R2 F 2 R3) (R1 × R2) × R3 = R1 × (R2 × R3) 43 / 277 Relationenalgebra Rewrite Regeln (2) 3. Folgen von Projektionen πa1 ,...,ai (πa1 ,...,ai ,b1 ,...,bj (R)) = πa1 ,...,ai (R) 4. Folgen von Selektionen σF 1 (σF 2 (R)) = σF 1∧F 2 (R) Wegen F 1 ∧ F 2 = F 2 ∧ F 1 folgt dann auch σF 1 (σF 2 (R)) = σF 2 (σF 1 (R)) 44 / 277 Relationenalgebra Rewrite Regeln (3) 5. Vertauschung von Projektionen und Selektionen F enthält nur Attribute aus a1 , . . . , ai σF (πa1 ,...,ai (R)) = πa1 ,...,ai (σF (R)) F enthält zusätzlich Attribute aus b1 , . . . , bj πa1 ,...,ai (σF (R)) = πa1 ,...,ai (σF (πa1 ,...,ai ,b1 ,...,bj (R)) 45 / 277 Relationenalgebra Rewrite Regeln (4) 6. Vertauschung von Selektionen und Kartesischem Produkt F enthält nur Attribute aus R1 σF (R1 × R2) = σF (R1) × R2 Allgemeiner: F = F1 ∧ F2 ∧ F3 F 1 nur Attribute aus R1 F 2 nur Attribute aus R2 F 3 Attribute aus beiden σF (R1 × R2) = σF 1 (R1) F 3 σF 2 (R2) 46 / 277 Relationenalgebra Algebraische Optimierung Problem: gegebener Ausdruck in der Relationenalgebra Ziel: äquivalenter, möglichst effizient auszuführender Ausdruck der Relationenalgebra Bestimmung einer möglichst guten Ausführungsreihenfolge durch die Beachtung von Heuristiken für: I unäre Operationen π, σ I binäre Operationen ∪, ∩, −, ×, 47 / 277 Relationenalgebra Ausgangslösung Finde Name und Beruf von Angestellten, deren Abteilung in KL ist und die Projekte in KL durchführen. ERGEBNIS N 200 ABT(ANR,BUDGET,A-ORT) PERS(PNR,NAME,BERUF,GEHALT,ALTER,ANR) PM(PNR,JNR,DAUER,ANTEIL) PROJ(JNR,BEZEICHNUNG,SUMME,P-ORT) N 200 N 2 · 14 σA−ORT =0 KL0 I ABT: I PERS: N Tupel Tupel I PM: 5 · N Tupel I PROJ: M Tupel I Gleichverteilung der Attributwerte: A-ORT: 10 Werte P-ORT: 100 Werte 5 · N · 14 5 · N · 11 N 5 ABT · 14 σP−ORT =0 KL0 Annahmen: N 5 ·2 πNAME ,BERUF ·3 M ·4 N ·8 5·N ·4 N ·6 PERS PM PROJ 48 / 277 Relationenalgebra 1. Verschieben von Selektionen ERGEBNIS N 200 ·2 πNAME ,BERUF N 200 N 2 · 14 · 11 Führe Selektionen so früh wie möglich aus! N 10 N 50 σA−ORT =0 KL0 N 5 ABT ·3 ·8 M 100 ·4 N ·5·4 N ·6 σP−ORT =0 KL0 ·3 M ·4 PERS PM PROJ 49 / 277 Relationenalgebra 2. Verschieben von Projektionen ERGEBNIS N 200 ·2 πNAME ,BERUF N 200 N 2 ·5 ·5 Führe Projektionen frühzeitig aus! N 10 N 50 ABT ·3 ·1 N ·5·2 πJNR M 100 ·3 σA−ORT =0 KL0 N 5 M 100 N ·4 πANR N 50 ·1 ·4 πPNR,ANR,NAME ,BERUF N ·6 PERS πPNR,JNR N ·5·4 PM ·4 σP−ORT =0 KL0 M ·4 PROJ 50 / 277 Relationenalgebra 3. Verknüpfung von Folgen unärer Operationen ERGEBNIS N 200 ·2 πNAME ,BERUF N 200 N 2 ·7 ·7 Verknüpfen von Selektion und Projektion! N 10 N 50 ·1 πANR (σA−ORT =0 KL0 ) N 5 ABT ·6 M 100 ·1 N ·5·2 N ·6 πPNR,JNR ·3 N ·5·4 PERS PM πJNR (σP−ORT =0 KL0 ) M ·4 PROJ 51 / 277 Relationenalgebra 4. Zusammenfassung von Selektionen ERGEBNIS T σGEHALT >50.000∧BERUF =0 Programmierer 0 Alle Programmierer mit mehr als 50K Gehalt, und zwar aus den Abteilungen K51 und K55. PERS S σANR=0 K 510 σANR=0 K 550 PERS PERS ERGEBNIS σGEHALT >50.000∧BERUF =0 Programmierer 0 ∧(ANR=0 K 510 ∨ANR=0 K 550 ) PERS 52 / 277 Relationenalgebra 5. Einmalige Berechnung gemeinsamer Teilbäume Voraussetzung: Zwischenspeicherung der Ergebnisse ist nicht zu ”teuer”. ERGEBNIS ERGEBNIS πANR,A−ORT (σA−ORT =0 F 0 ) ABT πANR,A−ORT (σA−ORT =0 F 0 ) πPNR,NAME ,ANR πANR,A−ORT (σA−ORT =0 F 0 ) πPNR,NAME ,ANR ABT PERS ABT PERS 53 / 277 Relationenalgebra 6. Kombination von Verbundoperationen Ausnutzung der Assoziativität und Kommutativität von Vereinigung, Durchschnitt und Verbund zur Optimierung. Beispiel: Seien R und S zwei Relationen und T = R S. Annahmen: Verlustfreier Verbund, j entspricht der Anzahl der gleichverteilten Werte des Verbundattributes Erwartungswerte: Jedes Tupel aus S wird mit |R| j Tupeln aus R verbunden. (n:m) Verbund: |R| > j ⇒ |T | = |S| · |R| j (1:n) Verbund: |R| = j ⇒ |T | = |S| Die Verbundreihenfolge sollte so gewählt werden, dass die Anzahl und Größe der Zwischenobjekte minimiert wird. 54 / 277 Relationenalgebra 6. Zusammenfassung von Verbundoperationen ERGEBNIS N 200 ·2 πNAME ,BERUF N 200 N 10 N 50 ·1 πANR (σA−ORT =0 KL0 ) N 5 ABT ·3 ·5 ·4 N 20 ·2 N ·4 N ·5·2 πPNR,ANR,NAME ,BERUF N ·6 PERS πPNR,JNR N ·5·4 PM M 100 ·1 πJNR (σP−ORT =0 KL0 ) M ·4 PROJ 55 / 277 Relationenalgebra 7. Reihenfolge von Mengenoperationen Kardinalität der Vereinigung: R1 R1 R2 R2 max(|R1|, |R2|) ≤ |R1 ∪ R2| ≤ |R1| + |R2| Kardinalität des Durchschnitts: R1 R1 R2 R2 0 ≤ |R1 ∩ R2| ≤ min(|R1|, |R2|) 56 / 277 Relationenalgebra 7. Reihenfolge von Mengenoperationen (2) Erwartung: R1 R2 Bei Mengenoperationen immer zuerst die kleinsten Relationen verknüpfen. 57 / 277 Relationenalgebra 8. Kartesisches Produkt mit Selektion Verknüpfung bestimmter Selektionen mit vorausgehenden kartesischen Produkt zu einem Verbund. σA=B × R A=B S A,B Verbundattribute ⇒ R S 58 / 277 Relationenalgebra Zusammenfassung Algebraische Optimierung 1. Führe Selektionen so früh wie möglich aus 2. Führe Projektion frühzeitig aus 3. Verknüpfe Folgen von unären Operatoren wie Projektion und Selektion 4. Fasse einfache Selektionen zusammen 5. Berechne gemeinsame Teilbäume nur einmal 6. Bestimme Verbundreihenfolge so, daß die Anzahl und Größe der Zwischenobjekte minimiert wird 7. Verknüpfe bei Mengenoperationen immer zuerst die kleinsten Relationen 8. Verknüpfe bestimmte Selektionen mit einem vorausgehenden kartesischen Produkt zu einem Verbund 59 / 277 Relationenalgebra Zusammenfassung (Mengenoperationen) I ∪ Vereinigung I ∩ Durchschnitt I − Differenz I 4 Symmetrische Differenz 60 / 277 Relationenalgebra Zusammenfassung (Projektion/Selektion/Division) I Projektion π: Einschränkung von Tupeln auf eine Attributmenge, d.h. Ausblendung von Spalten I Selektion σ: Auswahl von Tupeln anhand eines Prädikates bzw. eines logischen Ausdrucks I Division ÷: Auswertung einer Beziehung eines Tupels zu einer gesamten Relation 61 / 277 Relationenalgebra Zusammenfassung (Produkt/Verbund) I I Kartesisches Produkt ×, Bildung aller möglichen Kombinationen von Tupeln aus zwei Mengen Verbunde I I I I Allgemein: Kartesisches Produkt zweier Mengen eingeschränkt durch eine Vergleichsbedingung zwischen zwei Attributen Gleichheitsverbund: Spezialfall, wenn die Vergleichsbedingung dem Gleichheitsoperator (=) entspricht Natürlicher Verbund: Verbund, bei dem alle gleich benannten Attribute zur Kombination herangezogen werden Äußerer Verbund: verlustfreier Verbund, bei dem nicht kombinierbare Tupel durch NULL-Werte (≡) ergänzt werden 62 / 277 Relationenalgebra Beispiele a.) Welche Schauspieler (PNR) haben im Pfalztheater gespielt? 63 / 277 Relationenalgebra Beispiele a.) Welche Schauspieler (PNR) haben im Pfalztheater gespielt? A = πPNR (σTHEATER=0 Pfalztheater 0 (DARSTELLER)) A PNR 4 5 64 / 277 Relationenalgebra Beispiele b.) Welche Dramen von Schiller wurden nach 1800 uraufgeführt? 65 / 277 Relationenalgebra Beispiele b.) Welche Dramen von Schiller wurden nach 1800 uraufgeführt? B = πTITEL (σAUTOR=0 Schiller 0 ∧U_JAHR>1800 (DRAMA)) B TITEL Tell 66 / 277 Relationenalgebra Beispiele c.) Welche Schauspieler (NAME, W_ORT) haben im ’Faust’ mitgespielt? 67 / 277 Relationenalgebra Beispiele c.) Welche Schauspieler (NAME, W_ORT) haben im ’Faust’ mitgespielt? C = πNAME ,W _ORT (SCHAUSPIELER (DARSTELLER (σTITEL=0 Faust 0 (ROLLE )))) C NAME Schön Müller Schiller W_ORT Frankfurt Frankfurt Jena 68 / 277 Relationenalgebra Beispiele d.) Welche Schauspieler (NAME, W_ORT) haben in Dramen von Schiller mitgespielt? 69 / 277 Relationenalgebra Beispiele d.) Welche Schauspieler (NAME, W_ORT) haben in Dramen von Schiller mitgespielt? D = πNAME ,W _ORT (SCHAUSPIELER(DARSTELLER (ROLLE (σAUTOR=0 Schiller 0 (DRAMA))))) D NAME Schön Müller Schiller George W_ORT Frankfurt Frankfurt Jena Berlin 70 / 277 Relationenalgebra Beispiele e.) Welche Schauspieler (PNR) sind nie aufgetreten? 71 / 277 Relationenalgebra Beispiele e.) Welche Schauspieler (PNR) sind nie aufgetreten? E = (πPNR (SCHAUSPIELER)) − (πPNR (DARSTELLER)) E PNR 3 6 7 8 72 / 277 Relationenalgebra Beispiele f.) Zeichnen Sie den Operatorbaum für folgende Anfrage: πNAME (SCHAUSPIELER (πPNR,FIGUR (DARSTELLER) ÷ πFIGUR (ROLLE ))) 73 / 277 Relationenalgebra Beispiele f.) Zeichnen Sie den Operatorbaum für folgende Anfrage: πNAME (SCHAUSPIELER (πPNR,FIGUR (DARSTELLER) ÷ πFIGUR (ROLLE ))) πNAME ÷ SCHAUSPIELER πPNR,FIGUR πFIGUR DARSTELLER ROLLE 74 / 277 Infrastruktur Datenbankserver I mtsthelens I krakatau I pinatubo 75 / 277 Infrastruktur mtsthelens.informatik.hs-fulda.de Plattform: Sun Fire V445 Betriebssystem: Solaris 10 Datenbank: Oracle 10g SID: ORALV9A Kapazität: ca. 584 GB 76 / 277 Infrastruktur krakatau.informatik.hs-fulda.de Plattform: Sun Blade 2000 Betriebssystem: Solaris 10 Datenbank: Oracle 10g SID: ORALV10A Kapazität: ca. 200 GB 77 / 277 Infrastruktur pinatubo.informatik.hs-fulda.de Plattform: Compaq ML 530 Betriebssystem: Solaris 10 x86 Datenbank: Oracle 10g SID: ORALV8A Kapazität: ca. 80 GB 78 / 277 Infrastruktur Möglichkeiten des Zugriffs I Oracle Client (Windows, Unix, Mac PPC) I Oracle SQL Developer (Windows, Unix, Mac PPC + Intel) I iSQL*Plus (Zugang über Webbrowser) 79 / 277 Infrastruktur Oracle Client I Beinhaltet SQLPlus und SQLPlus Worksheet I Benötigt TNSNAMES.ORA Anleitung unter http://wi-labor.informatik.hs-fulda.de 80 / 277 Infrastruktur Oracle SQL Developer I Verfügbar auch für Mac OS X Intel 81 / 277 Infrastruktur Oracle iSQL*Plus I Zugriff auf Datenbanken über Webbrowser Zugang über http://isqlplus.informatik.hs-fulda.de 82 / 277 SQL SELECT SelectExpression::= SELECT [ALL|DISTINCT] SelectItemCommaList FROM TableReferenceCommalist [WHERE ConditionExpression] [GROUP BY ColumnReferenceCommaList [HAVING ConditionExpression]] [ORDER BY ColumnReferenceCommaList] 83 / 277 SQL SELECT SelectExpression SELECT ALL DISTINCT TableReferenceCommaList GROUP ORDER BY BY SelectItemCommaList FROM WHERE ColumnReferenceCommaList ColumnReferenceCommaList ConditionExpression HAVING ConditionExpression 84 / 277 SQL SELECT (2) I Mit SELECT * werden komplette Tupel ausgewählt I FROM-Klausel spezifiziert das Objekt (Relation, Sicht), das durch SELECT verarbeitet werden soll I WHERE-Klausel kann eine Sammlung von Prädikaten enthalten, die mit AND oder OR verknüpft sein können I Prädikate (Verbundterme) können sich folgendermaßen zusammensetzen: Ai θan ,θ ∈ {=, ! =, <, <=, >, >=} Ai θAj ,θ ∈ {=, ! =, <, <=, >, >=} 85 / 277 SQL SELECT * Finde alle Dichter (mit allen Attributen): SELECT * FROM DICHTER AUTOR Schiller Goethe Kleist Lessing G_ORT Marbach Frankfurt Kamenz Frankfurt G_JAHR 1759 1749 1777 1729 86 / 277 SQL SELECT Kartesisches Produkt Finde alle Kombinationen Dichtern und Dramen mit allen Attributen (d.h. Kartesisches Produkt): SELECT * FROM DICHTER, DRAMA AUTOR Schiller Goethe Kleist Lessing Schiller Goethe Kleist Lessing Schiller Goethe .. . G_ORT Marbach Frankfurt Kamenz Frankfurt Marbach Frankfurt Kamenz Frankfurt Marbach Frankfurt .. . G_JAHR 1759 1749 1777 1729 1759 1749 1777 1729 1759 1749 .. . TITEL Maria Stuart Maria Stuart Maria Stuart Maria Stuart Wallenstein Wallenstein Wallenstein Wallenstein Tell Tell .. . U_ORT Weimar Weimar Weimar Weimar Jena Jena Jena Jena Weimar Weimar .. . U_JAHR 1800 1800 1800 1800 1799 1799 1799 1799 1804 1804 .. . AUTOR Schiller Schiller Schiller Schiller Schiller Schiller Schiller Schiller Schiller Schiller .. . 87 / 277 SQL WHERE Bedingung Welche Dramen (TITEL) wurden weder in Weimar noch in Frankfurt uraufgeführt? SELECT TITEL FROM DRAMA WHERE U_ORT!=’Weimar’ AND U_ORT!=’Frankfurt’ . . . oder auch: SELECT TITEL FROM DRAMA WHERE NOT (U_ORT=’Weimar’ OR U_ORT=’Frankfurt’) TITEL Wallenstein Iphigenie Nathan 88 / 277 SQL SELECT Beispiel Welche Dramen von Schiller wurden nach 1800 uraufgeführt? SELECT TITEL FROM DRAMA WHERE AUTOR=’Schiller’ AND U_JAHR>1800 TITEL Tell 89 / 277 SQL SELECT DISTINCT Welche Schauspieler (PNR) haben am Schloßtheater gespielt? Jeder Schauspieler soll nur einmal ausgegeben werden! SELECT DISTINCT PNR FROM DARSTELLER WHERE THEATER=’Schloßtheater’ PNR 2 I Duplikate werden in der Ausgabeliste normalerweise nicht eliminiert I DISTINCT erzwingt Duplikateleminierung 90 / 277 SQL SELECT Benennung von Ergebnisspalten I Ausgabe von Attributen, Text oder Ausdrücken durch SELECT I Spalten der Ergebnisrelation können umbenannt werden I Spaltennamen sensitiv für Groß- bzw. Kleinschreibung wenn in Anführungszeichen eingeschlossen ("Ort" 6= "ORT") SELECT TITEL AS "Titel", ’uraufgeführt in:’ AS TEXT, U_ORT AS "Ort", ’im Jahr:’ AS TEXT, U_JAHR-1800 AS AUSDRUCK, ’nach 1800’ AS TEXT FROM DRAMA WHERE AUTOR=’Schiller’ Titel Maria Stuart Wallenstein Tell TEXT uraufgeführt in: uraufgeführt in: uraufgeführt in: Ort Weimar Jena Weimar TEXT im Jahr: im Jahr: im Jahr: AUSDRUCK 0 -1 4 TEXT nach 1800 nach 1800 nach 1800 91 / 277 SQL SELECT Benennung von Ergebnisspalten I Konkatenation von Attributen und Text SELECT TITEL || ’ wurde im Jahr ’ || U_JAHR || ’ in ’ || U_ORT || ’ uraufgeführt.’ AS "Überschrift" FROM DRAMA WHERE AUTOR=’Schiller’ Überschrift Maria Stuart wurde im Jahr 1800 in Weimar uraufgeführt. Wallenstein wurde im Jahr 1799 in Jena uraufgeführt. Tell wurde im Jahr 1804 in Weimar uraufgeführt. 92 / 277 SQL Funktionen in Ausdrücken Welche Dramen (TITEL, U_JAHR) wurden am Anfang eines Jahrzehnts uraufgeführt? SELECT TITEL, U_JAHR FROM DRAMA WHERE MOD(U_JAHR,10)=0 . . . oder unter Benutzung der TRUNC-Funktion: SELECT TITEL, U_JAHR FROM DRAMA WHERE U_JAHR=TRUNC(U_JAHR/10)*10 . . . oder unter Benutzung der FLOOR-Funktion: SELECT TITEL, U_JAHR FROM DRAMA WHERE U_JAHR=FLOOR(U_JAHR/10)*10 TITEL Maria Stuart Faust U_JAHR 1800 1790 93 / 277 SQL Arithmetische Funktionen Funktion ABS(n) Bedeutung (Absolut-)Betrag CEIL(n) kleinste ganze Zahl größer oder gleich n COS(n) COSH(n) EXP(n) Kosinus Kosinus hyperbolicus Expontentialfunktion (Euler’sche Zahl e) FLOOR(n) größte ganze Zahl kleiner oder gleich n LN(n) Logarithmus naturalis LOG(m,n) Logarithmus (zur Basis m) MOD(n,m) Modulo (m)-Funktion, Rest bei zahliger Division Expotentialfunktion (zur Basis n) POWER(n,m) ganz- ROUND(m[,m]) Rundung (auf m (>0) Stellen nach dem Komma bzw. auf Vielfache der m-ten Potenz (m<0) von 10) SIGN(N) Signum (Vorzeichen) SIN(n) SINH(n) SQRT(n) TAN(n) TANH(n) TRUNC(n[,m]) Sinus Sinus hyperbolicus Quadratwurzel Tangens Tanges hyperbolicus Abschneiden (bis auf m (>0) Stellen nach dem Komma bzw. auf Vielfache der m-ten Potenz (m<0) von 10) Beispiele ABS(-5) ABS(33) CEIL(-3.8) CEIL(4.5) COS(0) COS(3.141592) EXP(1) EXP(-1) FLOOR(-3.8) FLOOR(-2) LN(1) LN(EXP(1)) LOG(5,125) LOG(2,1024) MOD(8,5) MOD(10,3) Ergebnisse 5 33 -3 5 1 -1 2.7182818 0.36787944 -4 -2 0 1 3 10 3 1 POWER(4,3) POWER(12,2) ROUND(3.75) ROUND(3.75,1) ROUND(-3.759 ROUND(-3.75,1) ROUND(4771.3,2) SIGN(3) SIGN(0) SIGN(-2) SIN(0) SINH(1.570796) SQRT(36) TAN(0) TAN(0.785398163) TRUNC(12.2082) TRUNC(12.2082,2) TRUNC(1209,-2) 64 144 4 3.8 -4 -3.8 4800 1 0 -1 0 1 6 0 1 12 12.2 1200 94 / 277 SQL Zeichenketten-Funktionen Funktion ASCII(c) CHR(n) CONCAT(str1,str2) INITCAP(str) INSTR(str1,str2) LENGTH(str) LOWER(str) LPAD(str,n[,padstr]) LTRIM(str[,trimset]) Bedeutung Dezimalcode (des ASCII-Zeichens) ASCII-Zeichen (mit dezimalen Code n) Verkettung (Konkatenation) zweier Zeichenketten Umsetzung der ersten Buchstaben jedes Wortes in Großschreibung Position von Zeichenkette str2 als Bestandteil von Zeichkette str1 Länge der Zeichenkette (str) in Zeichen Umsetzung in Kleinbuchstaben Zeichenkette str nach links bis Maximallänge n mit Zeichenkette padstr auffüllen Entfernen aller Zeichen (trimset) vom Anfang der Zeichenkette str Beispiele ASCII(’7’) ASCII(’N’) CHR(55) CHR(78) Ergebnisse 55 78 CONCAT(’SQL’,’-Standard’) CONCAT(’SQL’,CONCAT(’’,’Standard’)) INITCAP(’Aller Anfang ist schwer’) INITCAP(’Aller*Anfang;ist+schwer’) ’SQL-Standard’ ’SQL-Standard’ INSTR(’Pineapple’,’ea’) INSTR(’Pineapple’,’P’) INSTR(’bubblegum’,’BB’) 4 1 0 LENGTH(’potato’) LENGTH(’bubblegum’) LOWER(’SMALL IS FUL’) LPAD(’Pad’,10,’_#’) LPAD(’Pad’,10) 6 9 LTRIM(’bubblegum’,’b’) LTRIM(’bubblegum’,’bu’) ’7’ ’N’ BEAUTI- ’Aller Anfang Ist Schwer’ ’Aller*Anfang;Ist+Schwer’ ’small is beautiful’ ’_#_#_#_Pad’ ’ Pad’ ’ubblegum’ ’legum’ 95 / 277 SQL Zeichenketten-Funktionen (2) Funktion REPLACE(str, search-str[,replstr]) Bedeutung Suchen aller Vorkommen von search-str in str und Ersetzen durch repl-str, wenn spezifiziert; sonst Löschen aller Vorkommen von search-str in str RPAD(str,n[,padstr]) Zeichenkette str nach rechts bis Maximallänge n mit Zeichenkette padstr auffüllen RTRIM(str[,trimset]) Entfernen aller Zeichen trimset vom ende der Zeichenkette str SOUNDEX(str) Phonetische Repräsentation von str zum Vergleich mit anderen Schreibweisen SUBSTR(str,m[,n]) Bestimmung einer SUBSTRB(str,m[,n]) Teil-Zeichenkette von str, beginnend mit dem m-ten Zeichen; der Länge n, wenn angegeben; alle restlichen Zeichen, wenn nicht spzifiziert TRANSLATE(str,from-Zeichenweise Umsetset,to-set) zung von str; kommt ein zeichen c aus str als i-tes Zeichen in from-set vor, so wird es in das i-te Zeichen aus to-set umgesetzt UPPER(str) Umsetzung in Großbuchstaben Beispiele REPLACE(’banana’,’an’) REPLACE(’banana’,’an’,’el’) Ergebnisse ’ba’ ’belela’ RPAD(’Pad’,10,’_#’) RPAD(’Pad’,10) ’Pad_#_#_#_’ ’Pad ’ RTRIM(’Risotto’,’o’) RTRIM(’Risotto’,’ot’) ’Risott’ ’Ris’ SOUNDEX(’trick’) SOUNDEX(’trik’) SOUNDEX(’trikk’) ’T620’ ’T620’ ’T620’ SUBSTR(’Pineapple’,5) SUBSTR(’Pineapple’1,4) SUBSTR(’Pineapple’,-4) SUBSTR(’Pineapple’,-6,2) ’apple’ ’Pine’ ’pple’ ’ea’ TRANSLATE(’xkhxcecbkm’, ’ehxvkc’, ’lmsbia’) ’simsalabim’ UPPER(’the big apple’) UPPER(’the<big>apple’) ’THE BIG APPLE’ ’THE<BIG>APPLE’ 96 / 277 SQL Datums- und Zeitfunktionen Datentyp(en) zur Speicherung von Zeitgrößen I Oracle kennt nur einen Datentyp DATE der sowohl Datum als auch Uhrzeit beinhaltet I Standard-SQL kennt DATE für ein Datum, TIME für eine Uhrzeit und TIMESTAMP für einen Zeitstempel I der Oracle-Datentyp DATE ist weitestgehend äquivalent zum Typ TIMESTAMP von Standard-SQL Konvertierungs- und Formatierungsfunktionen Zeitgröße → Zeichenkette: TO_CHAR(time, format-string) Zeichenkette → Zeitgröße: TO_DATE(string, format-string) 97 / 277 SQL Datums- und Zeitfunktionen (2) Formatelement -,/;: "text" AD A.D. AM A.M. BC B.C. CC SCC DAY D DD DDD DY IW IYY IY I IYYY HH HH12 Bedeutung einstreubarer Text Beispiele MM". Monat" Ergebnisse 9. Monat AD-Indikator (anno domini - nach Chr.) YYYYAD YYYYA.D. HH:MIAM HH:MIA.M. YYYYBC YYYYB.C. CC". century" 1995AD 1995A.D. 10:30AM 10:30A.M. 1995BC 1995B.C. 20. century DAY D DD DDD DY IW". week of "YYYY IYY IY I IYYY HH HH12 FRIDAY 6 01 244 FRI 35. week of 95 995 95 5 1995 10 2 ante meridian - vor Mittag) BC-Indikator (before Christ - vor Chr.) Jahrhundert mit ’-’ für vor Chr. ausgeschriebener Tag Wochentag (1-7 Tag des Monats (1-31) Tag des Jahres (1-366) dreibuchstabiges Kürzel Woche es Jahres (ISO) letzte 3, 2 oder 1 Stellen des ISO-Jahres ISO-Jahr Stunde am Tag (1-12) 98 / 277 SQL Datums- und Zeitfunktionen (3) Formatelement HH24 Bedeutung Stunde am Tag (0-23) Beispiele HH24 J MI MM MONTH MON RM Q RR W WW PM P.M. SS SSSSS YEAR SYEAR YYYY SYYYY YYY YY Y julianischer Tag (seit 01.01.4712 vor Chr.) Minute (0-59) Monat (1-12) ausgeschriebener Monat 3-buchstabiges Kürzel Monat (römische Zahl) Quartal (1-4) Notlösung für Jahr > 2000 Woche des Monats Woche des Jahres PM-Indikator (post meridian - nach Mittag) Sekunde (0-59) Sekunden am Tag (0-86399) ausgeschriebene jahreszahl (v.Chr. mit ’-’) J" julian day" HH24:MI DD-MM-YY MONTH DD-MON-YY DD-RM-YY Q". quarter "YYYY Jahreszahl Jahreszahl (v.Chr. mit ’-’) letzte 3, 2 oder 1 Stellen der Jahreszahl YYYY SYYYY YYY YY Y W". week in"MON WW HH:MIPM HH:MIP.M. SS SSSSS YEAR Ergebnisse 10 14 2449962 julian day 10:30 01-09-95 SEPTEMBER 01-SEP-95 01-IX-95 3. quarter 1995 1. week in SEP 35 10:30PM 10:30P.M. 00 37800 NINETEEN NINETY-FIVE 1995 1995 995 95 5 99 / 277 SQL Beispiel Datums- und Zeitfunktionen Gib von allen Projekten, deren Nummer höchstens 4 ist, Nummer, Projektbeginn und den wöchentlichen Termin der Projektsitzung aus? SELECT JNR, JBEGINN, TO_CHAR(JSITZUNG,’HH24:MI’) AS JSITZUNG FROM PROJ WHERE JNR<=4 JNR 1 2 3 4 JBEGINN 01-SEP-95 01-FEB-94 05-JUN-96 01-JAN-94 JSITZUNG 10:30 11:00 9:00 100 / 277 SQL Beispiel Datums- und Zeitfunktionen (2) Welche Projekte wurden vor dem 30.09.1995 beendet? Projektnummer, Projektname und Projektende sollen unter den genannten Überschriften ausgegeben werden. Das Projektende soll in der Form Wochentag als Text, Bindestrich, Tag als Zahl, Punkt, Monat als Zahl, Punkt, Jahr (vierstellige Zahl) ausgegeben werden. SELECT JNR "Projektnummer", JNAME "Projektname", TO_CHAR(JENDE,’DAY-DD.MM.YYYY’) "Projektende" FROM PROJ WHERE JENDE < TO_DATE(’30.09.1995’,’DD.MM.YYYY’) Projektnummer 4 Projektname ABC-Analyse Projektende TUESDAY-20.06.1995 101 / 277 SQL Vergleich von Datums- und Zeittypen I Zeichenketten (z.B. ’30.09.1995’) müssen vor dem Vergleich mit einem Zeitwert zunächst in den Typ DATE umgewandelt werden. I Ein Vergleich von JENDE < ’30.09.1995’ führt zu falschen Ergebnissen, da Zeichenkettentypen (CHAR, VARCHAR) einer anderen Ordnung unterliegen als der Typ DATE. 102 / 277 SQL Überprüfung eines Attributs mit einer Menge Das Prädikat IN kann in einer WHERE-Klausel ein Attribut auf Zugehörigkeit zu einer Menge prüfen. I Ai IN (a1 , . . . , ak ) I Ai IN (SELECT ...) Finde die Schauspieler (PNR, FIGUR), die Faust, Hamlet oder Wallenstein gespielt haben. SELECT PNR, FIGUR FROM DARSTELLER WHERE FIGUR IN (’Faust’,’Hamlet’,’Wallenstein’) PNR 1 1 2 FIGUR Faust Wallenstein Faust 103 / 277 SQL Überprüfung eines Attributs mit einer Menge (2) Finde die Figuren, die in Dramen von Schiller oder Goethe vorkommen. SELECT FIGUR FROM ROLLE WHERE TITEL IN (SELECT TITEL FROM DRAMA WHERE AUTOR IN (’Goethe’,’Schiller’)) FIGUR Faust Mephisto Gretchen Wallenstein Piccolomini Tell Geßler Maria Stuart Elisabeth Iphigenie 104 / 277 SQL Überprüfung eines Attributs mit einer Menge (3) Finde die Schauspieler (PNR) die nie gespielt haben. SELECT PNR FROM SCHAUSPIELER WHERE PNR NOT IN (SELECT PNR FROM DARSTELLER) PNR 3 6 7 8 105 / 277 SQL Symmetrische Notation (Realisierung von Joins) Finde die Schauspieler (NAME) aus Berlin und die Theater, an denen sie gespielt haben. SELECT NAME, THEATER FROM SCHAUSPIELER, DARSTELLER WHERE SCHAUSPIELER.PNR=DARSTELLER.PNR AND W_ORT=’Berlin’ NAME George George THEATER Theater des Westens Pfalztheater Äquivalente vollqualifizierte Anfrage: SELECT SCHAUSPIELER.NAME, DARSTELLER.THEATER FROM SCHAUSPIELER, DARSTELLER WHERE SCHAUSPIELER.PNR=DARSTELLER.PNR AND SCHAUSPIELER.W_ORT=’Berlin’ 106 / 277 SQL Symmetrische Notation (Tupelvariablen) Finde die Figuren und ihre Autoren, die in Dramen von Schiller und Goethe vorkommen. SELECT FIGUR, AUTOR FROM ROLLE R, DRAMA D WHERE R.TITEL=D.TITEL AND AUTOR IN (’Goethe’,’Schiller’) FIGUR Faust Mephisto Gretchen Wallenstein Piccolomini Tell Geßler Maria Stuart Elisabeth Iphigenie AUTOR Goethe Goethe Goethe Schiller Schiller Schiller Schiller Schiller Schiller Goethe 107 / 277 SQL Beispiel Symmetrische Notation Finde alle Schurken aus Dramen von Dichtern, die nicht in Frankfurt geboren sind. Auszugeben sind die Figur, das Uraufführungsjahr des Stückes, der Autor und dessen Geburtsjahr. SELECT R.FIGUR, D.U_JAHR, A.AUTOR, A.G_JAHR FROM ROLLE R, DRAMA D, DICHTER A WHERE R.TITEL=D.TITEL AND A.AUTOR=D.AUTOR AND A.G_ORT<>’Frankfurt’ AND R.R_GESCHLECHT=’Schurke’ FIGUR Piccolomini Geßler Elisabeth U_JAHR 1799 1804 1800 AUTOR Schiller Schiller Schiller G_JAHR 1759 1759 1759 108 / 277 SQL Korrelierende Sub-Queries Finde die Mitarbeiter (PNR, PNAME, PALTER), die älter als ihre Vorgesetzten sind. SELECT P.PNR, P.PNAME, P.PALTER FROM PERS P WHERE P.PALTER>(SELECT M.PALTER FROM PERS M WHERE M.PNR=P.MNR) PNR PNAME PALTER 102 Mohican 30 I pro Ausprägung (Tupel) der äußeren Abfrage wird die innere Anfrage genau einmal ausgewertet. I dabei werden die aktuellen Werte des Tupels der äußeren Anfrage als Konstanten in die jeweilige innere Anfrage eingesetzt I die tatsächliche Auswertungsstrategie wird durch den Anfrage-Optimierer bestimmt I Überdeckungen beachten! 109 / 277 SQL Korrelierende Sub-Queries (2) Finde die Projekte (JNR, JNAME, JMNR, JBEGINN, JENDE, JSITZUNG), in denen der Projektmanager nicht zu 100 Prozent mitarbeitet. SELECT JNR, JNAME, JMNR, JBEGINN, JENDE, JSITZUNG FROM PROJ WHERE PROJ.JMNR IN (SELECT MITARB.PNR FROM MITARB WHERE MITARB.JNR=PROJ.JNR AND MITARB.ZEIT_ANTEIL!=100) JNR 2 3 JNAME NT 4.0 JMNR 100 100 JBEGINN 01-FEB-94 05-JUN-96 JENDE JSITZUNG 01-MAY-97 110 / 277 SQL Reihenfolge der Ausgabe / Sortierung Gib Name, Alter und ANR aller Angestellten aufsteigend sortiert nach Alter aus. Gleich alte Personen sollen aufsteigend nach ANR erscheinen. SELECT PNAME, PALTER, ANR FROM PERS ORDER BY PALTER ASC, ANR ASC PNAME Gerneboss Cherokee Goldon Mohican Adlatus Miniboss Apache Sioux Bigboss PALTER 25 25 28 30 30 40 40 40 50 ANR 55 55 100 55 56 45 45 45 56 I Aufsteigende (ASC) und absteigende (DESC) Sortierung möglich I Mehrere Kriterien möglich I Spaltennamen und positionale Angaben möglich 111 / 277 SQL Reihenfolge der Ausgabe / Sortierung (2) Gib Name, Gehalt, Bonus und Gesamtbezüge (Gehalt+Bonus) aufsteigend sortiert nach Gesamtbezügen aus. Gleiche Gesamtbezüge sollen absteigend nach dem Verhältnis von Bonus zu Gehalt ausgegeben werden. SELECT PNAME, PGEHALT, PBONUS, PGEHALT+PBONUS "GESAMTBEZÜGE" FROM PERS ORDER BY 4, PBONUS/PGEHALT DESC oder auch: SELECT PNAME, PGEHALT, PBONUS, PGEHALT+PBONUS "GESAMTBEZÜGE" FROM PERS ORDER BY PGEHALT+PBONUS ASC, PBONUS/PGEHALT DESC 112 / 277 SQL Aggregatfunktionen Bestimme die Anzahl, das Spitzengehalt, das durchschnittliche Monatsgehalt aller Angestellten, sowie die Gesamtbezüge (Gehälte plus Boni). SELECT COUNT(*) "Anzahl Angestellte", MAX(PGEHALT) "Spitzengehalt", AVG(PGEHALT/12) "mittleres Monatsgehalt", SUM(PGEHALT+PBONUS) "Summe Bezüge" FROM PERS Anzahl Angestellte 9 Spitzengehalt 100000 mittleres Monatsgehalt 4953.7037 Summe Bezüge 610000 113 / 277 SQL Aggregatfunktionen (2) I Built-In-Funktionen AVG, MAX und SUM werden angewendet auf einstellige Ergebnislisten I COUNT(*) zählt die Anzahl der qualifizierten Tupel I per Default keine Eliminierung von Duplikaten (ALL) I mit DISTINCT werden Duplikate eliminiert 114 / 277 SQL Aggregatfunktionen (3) Bestimme die Anzahl aller Angestellten, die Anzahl unterschiedlicher Gehaltswerte (Gehaltsstufen) und den Mittelwert aller Gehaltsstufen. SELECT COUNT(*) "Anzahl Angestellte", COUNT(DISTINCT PGEHALT) "Gehaltsstufen", AVG(DISTINCT PGEHALT) "Mittelwert Gehaltsstufen" FROM PERS Anzahl Angestellte 9 Gehaltsstufen 6 Mittelwert Gehaltsstufen 69166.667 115 / 277 SQL Aggregatfunktionen (4) Finde alle Angestellten (PNR, PNAME, PGEHALT), deren Gehalt um mehr als 40% vom Durchschnittsgehalt der Firma abweicht. SELECT PNR, PNAME, PGEHALT FROM PERS WHERE PGEHALT<(SELECT 0.6*AVG(PGEHALT) FROM PERS) OR PGEHALT>(SELECT 1.4*AVG(PGEHALT) FROM PERS) PNR 1 300 PNAME Bigboss Goldon PGEHALT 100000 85000 116 / 277 SQL Partitionierung einer Relation in Gruppen Liste alle Abteilungen (ANR) sowie das Durchschnittsgehalt ihrer Angestellten auf. SELECT ANR, AVG(PGEHALT) DURCHSCHNITTSGEHALT FROM PERS GROUP BY ANR ANR 45 55 56 100 DURCHSCHNITTSGEHALT 53333.333 50000 70000 85000 117 / 277 SQL Partitionierung einer Relation in Gruppen (2) Liste alle Abteilungen (ANR) sowie das Durchschnittsgehalt ihrer Angestellten auf. zusätzlich soll der Abteilungsname angegeben werden. SELECT A.ANR ANR, A.ANAME ANAME, AVG(PGEHALT) DURCHSCHNITTSGEHALT FROM PERS P, ABT A WHERE P.ANR=A.ANR GROUP BY A.ANR, A.ANAME ANAME muss als zweites Gruppierungsattribbut hinzugenommen werden, da in der SELECT-Klausel nur Attribute aus der GROUP-BY-Klausel, Konstanten oder Built-In-Funktionen angegeben werden dürfen. ANR 45 55 56 100 ANAME Beschaffung Produktion Leitung Vertrieb DURCHSCHNITTSGEHALT 53333.333 50000 70000 85000 118 / 277 SQL Auswahl von Gruppen Liste die Abteilungen zwischen 50 und 60 auf, bei denen das Durchschnittsalter ihrer Angestellten kleiner als 30 ist. SELECT ANR, AVG(PALTER) DURCHSCHNITTSALTER FROM PERS WHERE ANR<=60 AND ANR>=50 GROUP BY ANR HAVING AVG(PALTER)<30 ANR 55 DURCHSCHNITTSALTER 26.666667 I HAVING-Klausel wird immer im Zusammenhang mit einer GROUP-BY-Klausel verwendet I die Bedingung wird auf Tupel einer Gruppe angewendet, d.h. muss für die gesamte Gruppe erfüllt sein I Bedingung mit gruppenweise auswertbar sein, d.h. Gruppierungsspalten, Konstanten, Build-In-Funktionen 119 / 277 SQL Auswahl von Gruppen (2) Finde die Schauspieler (PNR, NAME), die mindestens 2 verschiedene Rollen dargestellt haben und dabei an einem Theater jeweils genau einmal aufgetreten sind. SELECT S.PNR PNR, S.NAME NAME FROM SCHAUSPIELER S, DARSTELLER D WHERE S.PNR=D.PNR GROUP BY S.PNR, S.NAME HAVING COUNT(*)>=2 AND COUNT(*)=COUNT(DISTINCT THEATER) PNR 1 4 5 NAME Schön Schiller George 120 / 277 SQL Auswertung von SQL-Anweisungen 1. Die auszuwertenden Relationen werden durch die FROM-Klausel bestimmt 2. Das Kartesische Produkt aller Relationen der FROM-Klausel wird gebildet 3. Tupel werden anhand der WHERE-Klausel selektiert 4. Aus den übrig gebliebenden Tupeln werden Gruppen gemäß der GROUP-BY-Klausel gebildet, d.h. die Tupel einer Gruppe haben hinsichtlich der GROUP-BY-Klausel den gleichen Wert 121 / 277 SQL Auswertung von SQL-Anweisungen (2) 5. es werden die Gruppen gewählt, die die HAVING-Klausel erfüllen - dabei dürfen sich die Prädikate der HAVING-Klausel nur auf Gruppeneigenschaften beziehen 6. Die Ausgabe wird durch die Auswertung der SELECT-Klausel bestimmt - bei Verwendung von GROUP-BY-Klausel dürfen nur Ausdrücke genutzt werden, die für eine Gruppe nur genau einen Wert haben 7. Die Ausgabereihenfolge wird durch die ORDER-BY-Klausel bestimmt - wird keine ORDER-BY-Klausel verwendet, so ist das Ergebnis (in der Reihenfolge) nicht deterministisch 122 / 277 SQL Beispiel Auswertung von SQL-Anweisungen (1) SELECT A, SUM(B), 12 FROM R WHERE B<=50 GROUP BY A HAVING MAX(C)>=50 ORDER BY A R A Rot Rot Rot Gelb Gelb Blau Blau Blau B 10 20 10 10 80 10 80 20 C 10 10 20 50 180 10 10 200 123 / 277 SQL Beispiel Auswertung von SQL-Anweisungen (2) SELECT A, SUM(B), 12 FROM R WHERE B<=50 GROUP BY A HAVING MAX(C)>=50 ORDER BY A R0 A Rot Rot Rot Gelb Gelb Blau Blau Blau B 10 20 10 10 80 10 80 20 C 10 10 20 50 180 10 10 200 124 / 277 SQL Beispiel Auswertung von SQL-Anweisungen (3) SELECT A, SUM(B), 12 FROM R WHERE B<=50 GROUP BY A HAVING MAX(C)>=50 ORDER BY A R00 A Rot Rot Rot Gelb Blau Blau B 10 20 10 10 10 20 C 10 10 20 50 10 200 125 / 277 SQL Beispiel Auswertung von SQL-Anweisungen (4) SELECT A, SUM(B), 12 FROM R WHERE B<=50 GROUP BY A HAVING MAX(C)>=50 ORDER BY A R000 A Rot Rot Rot Gelb Blau Blau B 10 20 10 10 10 20 C 10 10 20 50 10 200 126 / 277 SQL Beispiel Auswertung von SQL-Anweisungen (5) SELECT A, SUM(B), 12 FROM R WHERE B<=50 GROUP BY A HAVING MAX(C)>50 ORDER BY A R0000 A Gelb Blau SUM(B) 10 30 12 12 12 127 / 277 SQL Beispiel Auswertung von SQL-Anweisungen (6) SELECT A, SUM(B), 12 FROM R WHERE B<=50 GROUP BY A HAVING MAX(C)>50 ORDER BY A R00000 A Blau Gelb SUM(B) 30 10 12 12 12 128 / 277 SQL Dynamisch erzeugte Tabellen In der FROM-Klausel sind drei Arten von Tabellenreferenzen erlaubt: I gespeicherte persistente Tabellen I logische Sichten auf Tabellen und Sichten mit gespeicherter persistenter Sichtendefinition (Views) I dynamisch berechnete Tabellen, deren Schema und Inhalt durch eine SELECT-Anweisung in der FROM-Klausel festgelegt wird 129 / 277 SQL Beispiel Dynamisch erzeugte Tabellen Es soll eine Statistik erstellt werden, aus der für jede Abteilung ihre Nummer, das durchschnittliche bezahlte Gehalt, sowie der Anteil (in Prozent) an der Gehaltssumme der Firma hervorgeht. SELECT ANR, AVG(PGEHALT) DURCHSCHNITTSGEHALT, SUM(PGEHALT)/GEHSUM*100 "ANTEIL GEHALTSSUMME" FROM PERS, (SELECT SUM(PGEHALT) GEHSUM FROM PERS) GROUP BY ANR, GEHSUM ANR 45 55 56 100 DURCHSCHNITTSGEHALT 53333.333 50000 70000 85000 ANTEIL GEHALTSSUMME 29.906542 28.037383 26.168224 15.88785 130 / 277 SQL Dynamisch erzeugte Tabellen / Tupelvariablen Bei dynamisch berechneten Tabellen I können die Spalten in der SELECT-Klausel neu bzw. alternativ benannt werden I können Tupelvariablen zur Berechnung in der üblichen Weise benutzt werden SELECT P.ANR, AVG(P.PGEHALT) DURCHSCHNITTSGEHALT, SUM(P.PGEHALT)/S.GEHSUM*100 "ANTEIL GEHALTSSUMME" FROM PERS P, (SELECT SUM(Q.PGEHALT) GEHSUM FROM PERS Q) S GROUP BY P.ANR, S.GEHSUM 131 / 277 SQL Suchbedingungen Sammlung von Prädikaten I Verknüpfung mit AND, OR, NOT I Auswertungsreihenfolge bestimmbar durch Klammerung nicht-quantifizierte Prädikate I Vergleichsprädikate θ I LIKE-, BETWEEN-, IN-Prädikate I Test auf Nullwert I MATCH-Prädikate I UNIQUE-Prädikate quantifizierte Prädikate I ALL, ANY, EXISTS 132 / 277 SQL Tupel-Konstruktor Finde die Angestellten (PNR, PNAME), die das gleiche Alter und Gehalt sowie den gleichen Manager haben wie der Angestellte Sioux. SELECT PNR, PNAME FROM PERS WHERE (PALTER, PGEHALT, MNR) IN (SELECT PALTER, PGEHALT, MNR FROM PERS WHERE PNAME=’Sioux’) PNR, PNAME 46 47 Apache Sioux 133 / 277 SQL LIKE-Prädikat I Unterstützung der Suche nach Daten, von denen nur Teile des Inhaltes bekannt sind I LIKE-Prädikate vergleichen einen Datenwert mit einem Muster bzw. Maske dabei können zwei spezielle Symbole verwendet werden I I I % "null oder mehr beliebige Zeichen" _ "genau ein beliebiges Zeichen" LIKE-Prädikat ist wahr, wenn der Datenwert auf das entsprechende Muster mit zulässigen Substitutionen für % und _ passt. 134 / 277 SQL LIKE-Prädikat (2) NAME LIKE ’%ERD%’ wird z.B. erfüllt von "ERDMANN", "WERDER", "HERD", "ERD" ANR LIKE ’_7%’ wird erfüllt von Abteilungen mit 7 als zweitem Zeichen NAME NOT LIKE ’%-%’ wird erfüllt von Namen ohne Bindestrich Suche nach ’%’ oder ’_’ durch Voranstellen eines ESCAPE-Zeichens möglich: STRING LIKE ’%\_%’ ESCAPE ’\’ wird erfüllt von Zeichenketten mit Unterstrich Keine allgemeinen regulären Ausdrücke möglich → REGEXP_LIKE 135 / 277 SQL Beispiel LIKE-Prädikat Finde alle Theater, die in ihrem Namen die Zeichenkette ’Theater’ oder ’theater’ enthalten. SELECT DISTINCT THEATER FROM DARSTELLER WHERE THEATER LIKE ’%Theater%’ OR THEATER LIKE ’%theater%’ THEATER Schillertheater Schloßtheater Theater des Westens Pfalztheater 136 / 277 SQL Beispiel LIKE-Prädikat (2) Finde alle Theater, deren Name aus mindestens drei (durch Leerzeichen getrennte) Worten besteht. Das mittlere Wort soll drei Zeichen lang sein und mit ’d’ beginnen. SELECT DISTINCT THEATER FROM DARSTELLER WHERE THEATER LIKE ’_% d__ _%’ THEATER Theater des Westens 137 / 277 SQL BETWEEN-Prädikat Finde die Angestellten, die zwischen 80000 und 150000 verdienen. SELECT PNAME FROM PERS WHERE PGEHALT BETWEEN 80000 AND 150000 PNAME Bigboss Miniboss Goldon y BETWEEN x AND z ⇔ x<=y AND y<=z y NOT BETWEEN x AND z ⇔ NOT (y BETWEEN x AND z) 138 / 277 SQL IN-Prädikat Finde die Nummern der Schauspieler, die den Faust gespielt haben. SELECT S.NAME FROM SCHAUSPIELER S WHERE ’Faust’ IN (SELECT FIGUR FROM DARSTELLER D WHERE D.PNR=S.PNR) oder auch SELECT S.NAME FROM SCHAUSPIELER S WHERE S.PNR IN (SELECT D.PNR FROM DARSTELLER D WHERE FIGUR=’Faust’) NAME Schön Müller x IN (a,b,...,z) ⇔ x=a OR x=b OR...OR x=z x IN (...) ⇔ x = ANY (...) x NOT IN y ⇔ NOT (x IN y) 139 / 277 SQL IN-Prädikat (2) Finde die Nummern der Schauspieler, die den Faust gespielt haben. SELECT NAME FROM SCHAUSPIELER WHERE PNR = (SELECT PNR FROM DARSTELLER WHERE FIGUR=’Faust’) Fehler in Zeile 1: ORA-01427: Unterabfrage für eine Zeile liefert mehr als eine Zeile Vergleich mit IN-Prädikat: I Prädikat ist erfüllt, wenn Gleichheit für mindestens eines der Tupel des Sub-Selects festgestellt wird I Prädikat ist nicht erfüllt, wenn Sub-Select die leere Menge liefert Operator-Vergleich (z.B. ’=’): I wahr, wenn Sub-Select genau ein Tupel liefert und dieses die Vergleichsbedingung erfüllt, undefiniert bei mehreren Tupeln 140 / 277 SQL NULL-Werte Bei der Spezifikation kann für jedes Attribut festgelegt werden, ob NULL-Werte zugelassen sind oder nicht. I das Ergebnis einer arithmetischen Operation (+,-,*,/) mit einem NULL-Wert ist ein NULL-Wert. I in der Ausgabe kein Wert, wenn Attribut in SELECT-Klausel NULL-Wert annimmt I ein NULL-Term in einem komplexen Ausdruck impliziert NULL als Ergebnis des Ausdrucks I die Auswertung eines NULL-Wertes in einem Vergleichsprädikat mit irgendeinem Wert ist UNKNOWN (?) 141 / 277 SQL NULL-Werte (2) Bei der Auswertung von Booleschen Ausdrücken wird eine dreiwertige Logik verwendet: NOT T F ? F T ? AND T F ? T T F ? F F F F ? ? F ? OR T F ? T T T T F T F ? ? T ? ? 142 / 277 SQL NULL-Werte (3) Erstelle eine Liste der Projekte (JNR, JNAME), die auch den Namen des Projektmanagers umfaßt. SELECT PNAME, JNR, JNAME FROM PERS, PROJ WHERE PNR=JMNR Tupel mit NULL-werten im Verbundattribut nehmen am Verbund nicht teil. PNAME Goldon Gerneboss Gerneboss Apache JNR 1 2 3 4 JNAME Jahresabschluß NT 4.0 ABC-Analyse 143 / 277 SQL NULL-Werte (4) Finde die Personen, die älter als 30 Jahre sind und deren Gehalt kleiner als 40000 ist. SELECT * FROM PERS WHERE PALTER>30 OR PGEHALT<40000 PERS-Tupel wird ausgegeben, wenn eines von folgendem gilt: I PALTER nicht NULL und größer 30 (PGEHALT darf NULL sein) I PGEHALT nicht NULL und kleiner 40000 (PALTER darf NULL sein) 144 / 277 SQL Prädikat zum Testen auf NULL-Werte Finde die Projekte, denen kein Manager zugeordnet ist. SELECT JNR, JNAME FROM PROJ WHERE JMNR IS NULL JNR 5 6 JNAME ISO 9000 Arithmetischer Vergleich mit NULL ergibt immer NULL: SELECT JNR, JNAME FROM PROJ WHERE JMNR=NULL Es wurden keine Zeilen gefunden. 145 / 277 SQL NULL-Werte und Aggregatsfunktionen Berechnung von Built-In-Funktionen ignoriert NULL-Werte I COUNT(*) zählt alle Zeilen I AVG, MIN, MAX, SUM berücksichtigen keine Zeilen mit NULL-Werten I DISTINCT zählt NULL nicht als Wert 146 / 277 SQL NULL-Werte und Aggregatsfunktionen (2) Erstellen einer Statistik der unterschiedlichen Zeitanteile, die durchschnittliche Stundenzahl und den Durchschnitt der unterschiedlichen Stunden. SELECT COUNT(*), COUNT(DISTINCT ZEITANTEIL), AVG(STUNDEN), AVG(DISTINCT STUNDEN) FROM MITARB COUNT(*) 14 COUNT(DISTINCT ZEITANTEIL) 6 AVG(STUNDEN) 131.25 AVG(DISTINCT STUNDEN) 133.33333 ...WHERE STUNDEN IS NOT NULL COUNT(*) 8 COUNT(DISTINCT ZEITANTEIL) 4 AVG(STUNDEN) 131.25 AVG(DISTINCT STUNDEN) 133.33333 147 / 277 SQL NULL-Werte sichtbar machen Spezielle Built-In-Funktion NVL(Argument, Default) von ORACLE zum Sichtbarmachen von NULL-Werten. I Funktionswert ist Wert von Argument, falls nicht NULL-Wert I Funktionswert ist Default, falls Argument NULL-Wert SELECT JNR, NVL(JNAME,’#undefined#’) JNAME, NVL(JMNR,-1) JMNR FROM PROJ WHERE JMR>2 JNR 3 4 5 6 JNAME #undefined# ABC-Analyse ISO 9000 #undefined# JMNR 100 46 -1 -1 148 / 277 SQL Quantifizierte Prädikate row-constr θ (ALL|ANY) (table-exp) θ ALL: Prädikat wird als wahr ausgewertet, wenn der θ-Vergleich für alle Ergebniswerte von table-exp wahr ist. θ ANY: wahr, wenn der θ-Vergleich für einen Ergebniswert wahr ist. 149 / 277 SQL Beispiel ANY-Prädikat Finde die Mitarbeiter (PNR, PNAME) aus anderen Abteilungen, die jünger sind als irgendein Mitarbeiter aus Abteilung 55. SELECT PNR, PNAME FROM PERS WHERE ANR!=55 AND PALTER < ANY (SELECT PALTER FROM PERS WHERE ANR=55) PNR 300 PNAME Goldon I Existenzquantor wird erfüllt, wenn der Vergleich für mindestens eines der durch das geschachtelte SELECT gefundene Tupel den Wert wahr ergibt I Existenzquantor kann nicht erfüllt werden, wenn geschachteltes SELECT kein Tupel findet I Existanzquantor kann nicht erfüllt werden, wenn geschachteltes SELECT nur NULL-Werte liefert 150 / 277 SQL Beispiel ANY-Prädikat (2) Finde die Nummern der Schauspieler, die den Faust gespielt haben. Formulierung mit quantifiziertem Präfikat: SELECT NAME FROM SCHAUSPIELER WHERE PNR = ANY (SELECT PNR FROM DARSTELLER WHERE FIGUR=’Faust’) NAME Schön Müller 151 / 277 SQL Beispiel ALL-Prädikat Finde die Projekte (JNR, JNAME), die vor allen OS/2-Projekten ("OS/2" Bestandteil des Projektnamens) beendet wurden. SELECT JNR, JNAME FROM PROJ WHERE JENDE < ALL (SELECT JENDE FROM PROJ WHERE JNAME LIKE ’%OS/2%’) JNR 1 2 3 4 5 6 JNAME Jahresabschluß NT 4.0 ABC-Analyse ISO 9000 I Allquantor wird erfüllt, wenn der Vergleich für alle durch das geschachtelte SELECT gefundenen Tupel den Wert wahr ergibt I Allquantor wird immer erfüllt, wenn geschachteltes SELECT kein Tupel findet I Allquantor kann nicht erfüllt werden, wenn geschachteltes SELECT mindestens einen NULL-Wert zurückgibt 152 / 277 SQL Test auf Existenz [NOT] EXISTS (table-exp) I Prädikat wir als falsch ausgewertet, wenn table-exp auf die leere Menge führt, ansonsten wahr Semantik x θ ANY (SELECT y FROM T WHERE p) ⇔ EXISTS (SELECT * FROM T WHERE p AND x θ T.y x θ ALL (SELECT y FROM T WHERE p) ⇔ NOT EXISTS (SELECT * FROM T WHERE p AND NOT (x θ T.y)) 153 / 277 SQL Beispiel EXISTS-Prädikat Name, Alter und Gehalt aller Manager sollen ausgegeben werden. SELECT PNAME, PALTER, PGEHALT FROM PERS M WHERE EXISTS (SELECT * FROM PERS P WHERE P.MNR=M.PNR) PNAME Bigboss Miniboss Gerneboss PALTER 50 40 25 PGEHALT 100000 80000 50000 I Spezieller Existenzquantor wird erfüllt, wenn durch das geschachtelte SELECT mindestens ein Tupel gefunden wird 154 / 277 SQL Mengentheoretische Operatoren Vereingung (UNION), Durchschnitts- (INTERSECT) und Differenzbildung (MINUS) von Relationen bzw. Query-Ergebnissen. (table-exp) {UNION|INTERSECT|MINUS} [ALL] (table-exp) I vor Ausführung werden alle Duplikate aus den Operanden eliminiert, außer wenn ALL spezifiziert wurde I für die Operanden wird Vereinigungsverträglichkeit gefordert 155 / 277 SQL Beispiel UNION Finde die Gesamtmenge der Orte in der Dichter-DB, und zwar Wohnorte, Aufführungsorte und Geburtsorte. (SELECT UNION (SELECT UNION (SELECT UNION (SELECT G_ORT ORTE FROM DICHTER) U_ORT FROM DRAMA) A_ORT FROM DARSTELLER) W_ORT FROM SCHAUSPIELER) ORTE Berlin Bonn Dresden Frankfurt Fulda Jena Kaiserslautern Kamenz Mannheim Marbach Weimar 156 / 277 SQL JOIN-Ausdrücke SELECT * FROM SCHAUSPIELER S, DARSTELLER D WHERE S.PNR=D.PNR ist äquivalent zu: SELECT * FROM SCHAUSPIELER NATURAL JOIN DARSTELLER SELECT * FROM SCHAUSPIELER JOIN DARSTELLER USING (PNR) SELECT * FROM SCHAUSPIELER S JOIN DARSTELLER D ON S.PNR=D.PNR I Outer Join: LEFT JOIN, RIGHT JOIN, FULL JOIN I Kartesisches Produkt: CROSS JOIN A CROSS JOIN B ⇔ SELECT * FROM A,B 157 / 277 SQL JOIN-Ausdrücke (ORACLE Syntax) Äußerer Verbund wird in ORACLE abweichend vom SQL-Standard durch den Ausdruck (+) spezifiziert I R.A=S.B(+) ergibt linken äußeren Verbund (alle Tupel der Relation R nehmen am Verbund teil; in der mit (+) bezeichneten Realtion werden ggf. NULL-Werte ergänzt) I R.A(+)=S.B ergibt rechten äußeren Verbund (alle Tupel der Relation S nehmen am Verbund teil) 158 / 277 SQL JOIN-Ausdrücke (ORACLE Syntax) (2) Eine Liste aller Projekte ist zu erstellen (JNR, JNAME); der Name des Projektmanagers (MGRNAME) soll, wo möglich, ebenfalls ausgegeben werden. SELECT JNR, JNAME, PNAME MGRNAME FROM PROJ, PERS WHERE JMNR=PNR(+) JNR 1 2 3 4 5 6 JNAME Jahresabschluß NT 4.0 ABC-Analyse ISO 9000 MGRNAME Goldon Gerneboss Gerneboss Apache 159 / 277 SQL JOIN-Ausdrücke (ORACLE Syntax) (3) Finde die Namen (Ang.-Name) und das Alter (Ang.-Alter) aller Angestellten, die älter als 35 sind, sowie die Namen ihrer Personalvorgesetzten (Vorg.-name). SELECT P.PNAME "Ang.-Name", P.PALTER "Ang.-Alter", D.PNAME "Vorg.-Name" FROM PERS P, PERS D WHERE P.MNR=D.PNR(+) AND P.PALTER>35 Ang.-Name Bigboss Miniboss Apache Sioux Ang.-Alter 50 40 40 40 Vorg.-Name Bigboss Miniboss Miniboss 160 / 277 SQL Wiederholung/Beispiele Gegeben sei folgende Anfrage und die resultierenden Ergebnisse: Welche Mitarbeiter (PNR, PNAME, PALTER) sind älter als ihre Vorgesetzten? PNR 102 PNAME Mohican PALTER 30 Welche der folgenden SQL-Statements liefern die richtigen Ergebnisse? 161 / 277 SQL Wiederholung/Beispiele (1) SELECT PNR, PNAME, PALTER FROM PERS WHERE MNR=(SELECT PNR FROM PERS WHERE PNR=MNR AND PALTER<PALTER); 162 / 277 SQL Wiederholung/Beispiele (2) SELECT PNR, PNAME, PALTER FROM PERS WHERE MNR=(SELECT PNR FROM PERS WHERE PNR=MNR AND PALTER<PALTER); I die Tabelle PERS im geschachtelten SELECT überdeckt äußere Tabelle PERS, daher Bezug auf äußere Tabelle PERS im geschachtelten SELECT-Block unmöglich I es werden keine Tupel gefunden! 163 / 277 SQL Wiederholung/Beispiele (3) SELECT PNR, PNAME, PALTER FROM PERS WHERE MNR=(SELECT M.PNR FROM PERS M WHERE M.PNR=MNR AND M.PALTER<PALTER); 164 / 277 SQL Wiederholung/Beispiele (4) SELECT PNR, PNAME, PALTER FROM PERS WHERE MNR=(SELECT M.PNR FROM PERS M WHERE M.PNR=MNR AND M.PALTER<PALTER); I Bezeichner für äußere Tabelle ist PERS, für die innere Tabelle M I unqualifizierte Attribute werden mit M ergänzt, daher ist die Anfrage inkorrekt I es werden keine Tupel gefunden! 165 / 277 SQL Wiederholung/Beispiele (5) SELECT PNR, PNAME, PALTER FROM PERS WHERE MNR=(SELECT M.PNR FROM PERS M WHERE M.PNR=PERS.MNR AND M.PALTER<PERS.PALTER); 166 / 277 SQL Wiederholung/Beispiele (6) SELECT PNR, PNAME, PALTER FROM PERS WHERE MNR=(SELECT M.PNR FROM PERS M WHERE M.PNR=PERS.MNR AND M.PALTER<PERS.PALTER); I Bezeichner für äußere Tabelle ist PERS, für die innere Tabelle M I es gibt keine unqualifizierten Attribute in der inneren Anfrage, also werden keine Attribute mit M ergänzt I es werden die korrekten Tupel gefunden! 167 / 277 SQL Wiederholung/Beispiele (7) Finde die Schauspieler (alle Attribute), deren Wohnort nicht mit dem Buchstaben ’n’ endet. Die Länge des Namens der gesuchten Schauspieler soll gleich der irgendeiner Figur sein. 168 / 277 SQL Wiederholung/Beispiele (8) Finde die Schauspieler (alle Attribute), deren Wohnort nicht mit dem Buchstaben ’n’ endet. Die Länge des Namens der gesuchten Schauspieler soll gleich der irgendeiner Figur sein. SELECT * FROM SCHAUSPIELER WHERE LENGTH(NAME) IN (SELECT LENGTH(FIGUR) FROM ROLLE) AND SUBSTR(W_ORT,-1)!=’n’ PNR 1 2 4 6 7 W_ORT Frankfurt Frankfurt Jena Frankfurt Marbach NAME Schön Müller Schiller Mann Krug 169 / 277 SQL Wiederholung/Beispiele (9) Finde Titel und Uraufführungsort der Stücke, die höchstens 35 Jahre nach der Geburt ihres Autor uraufgeführt wurden. 170 / 277 SQL Wiederholung/Beispiele (10) Finde Titel und Uraufführungsort der Stücke, die höchstens 35 Jahre nach der Geburt ihres Autor uraufgeführt wurden. SELECT TITEL, U_ORT FROM DRAMA D WHERE U_JAHR<=(SELECT G_JAHR+35 FROM DICHTER A WHERE A.AUTOR=D.AUTOR) TITEL Iphigenie Zerbrochene Krug U_ORT Mannheim Weimar 171 / 277 SQL Wiederholung/Beispiele (11) Finde die Angestellten, die mehr als ihre (direkten) Manager verdienen (Ausgabe: PNAME, PGEHALT, PNAME des Managers). 172 / 277 SQL Wiederholung/Beispiele (12) Finde die Angestellten, die mehr als ihre (direkten) Manager verdienen (Ausgabe: PNAME, PGEHALT, PNAME des Managers). SELECT P.PNAME, P.PGEHALT, M.PNAME FROM PERS P, PERS M WHERE P.MNR=M.PNR AND P.PGEHALT>M.PGEHALT P.PNAME Cherokee P.PGEHALT 60000 M.PNAME Gerneboss 173 / 277 SQL Transitive Hülle Z 5 2 1 I B 3 E STRUK A 3 5 8 C 3 D 1 10 F G 3 H OTNR Z Z A A A B B C C D G UTNR I B B C D E F F G G H MENGE 5 1 2 5 8 3 3 3 1 10 3 174 / 277 SQL Transitive Hülle (2) Finde alle Teile, die bei der Montage des Teils X benötigt werden. Probleme: I beliebig tiefe Schachtelung möglich I Schachtelungstiefe nicht bekannt I im SQL-Standard eigentlich nicht unterstützt 175 / 277 SQL Transitive Hülle (2) Finde alle Teile, die bei der Montage des Teils X benötigt werden. Behelfslösung für fest Schachtelungstiefe 2: (SELECT UTNR FROM STRUK WHERE OTNR=’A’) UNION (SELECT UTNR FROM STRUK WHERE OTNR IN (SELECT UTNR FROM STRUK WHERE OTNR=’A’)) UTNR B C D E F G 176 / 277 SQL Transitive Hülle / ORACLE Erweiterung Finde alle Teile, die bei der Montage des Teils X benötigt werden. Lösung mit ORACLE-Erweiterung möglich: SELECT UTNR FROM STRUK START WITH OTNR=’A’ CONNECT BY PRIOR UTNR=OTNR UTNR B C D E F G H 177 / 277 SQL Transitive Hülle / ORACLE Erweiterung (2) I CONNECT BY-Klausel zur Spezifikation einer Rekursion auf einer Relation. I I Prädikat zur Beschreibung der Ausgangsmenge der Rekursion (START WITH) Rekursionsbedingung CONNECT BY PRIOR A θ B; θ ∈ {=, <, . . . } I I I Restriktion der im Verlauf der Rekursion gefundenen Werte durch WHERE-Bedingung möglich keine Join-Bedingung möglich inkompatibel mit GROUP BY und HAVING 178 / 277 SQL Transitive Hülle / Beispiel Finde alle Teile, in die Teil G eingebaut wird, mit Angabe der Ebene in der Baugruppenhierarchie. SELECT OTNR, LEVEL FROM STRUK START WITH UTNR=’G’ CONNECT BY UTNR=PRIOR OTNR LEVEL-Pseudospalte gibt Auskunft über die aktuelle Tiefe der Rekursion I kann zur Ausgabe genutzt werden I kann zur Auswahl genutzt werden (in CONNECT BY-Klausel oder auch WHERE-Bedingung) OTNR C A D A LEVEL 1 2 1 2 179 / 277 SQL Datenmanipulation Füge den Schauspieler Garfield mit der PNR 4711 ein (satzweises Einfügen). INSERT INTO SCHAUSPIELER (PNR, NAME) VALUES (4711, ’Garfield’) I falls die Werte in der richtigen Reihenfolge angegeben werden, kann die Attributliste wegfallen 180 / 277 SQL Datenmanipulation Füge den Schauspieler Garfield mit der PNR 4711 ein (satzweises Einfügen). INSERT INTO SCHAUSPIELER VALUES (4711, NULL, ’Garfield’) I alle nicht angesprochenen Attribute erhalten NULL-Wert 181 / 277 SQL Datenmanipulation Füge die Schauspieler aus Frankfurt in die Relation TEMP ein. INSERT INTO TEMP (SELECT * FROM SCHAUSPIELER WHERE W_ORT=’Frankfurt’) I mengenorientiertes Einfügen ist möglich, wenn die einzufügenden Tupel aus einer anderen Relation mit Hilfe einer SELECT-Anweisung ausgewählt werden können I eine leere Relation TEMP sei vorhanden I Datentypen der Attribute müssen kompatibel sein I die eingefügten Tupel sind unabhängig von denen, von denen sie abgeleitet/kopiert wurden 182 / 277 SQL Datenmanipulation Füge Forschung als Abteilung 200 und die Mitarbeiter Newboss, Kiowa und Shoshone mit den Nummern 301, 310 und 320, dem Alter 35, 32 und 30 in die Datenbank ein. Newboss arbeitet für den Bigboss, die beiden anderen Neulinge arbeiten für Newboss. Alle erhalten ein Gehalt von 60000, der Bonus wird auf 0 gesetzt. INSERT INTO INSERT INTO ANR) VALUES INSERT INTO ANR) VALUES INSERT INTO ANR) VALUES ABT (ANR, ANAME) VALUES (200, ’Forschung’); PERS (PNR, PNAME, PALTER, PGEHALT, PBONUS, MNR, (301, ’Newboss’, 35, 60000, 0, 1, 200); PERS (PNR, PNAME, PALTER, PGEHALT, PBONUS, MNR, (310, ’Kiowa’, 32, 60000, 0, 301, 200); PERS (PNR, PNAME, PALTER, PGEHALT, PBONUS, MNR, (320, ’Shoshone’, 30, 60000, 0, 301, 200); 183 / 277 SQL Löschen von Tupeln Lösche den Schauspieler mit der PNR 8. DELETE FROM SCHAUSPIELER WHERE PNR=8 I Aufbau der WHERE-Klausel entspricht dem in der SELECT-Anweisung 184 / 277 SQL Löschen von Tupeln (2) Lösche alle Schauspieler, die nie gespielt haben. DELETE FROM SCHAUSPIELER WHERE PNR NOT IN (SELECT PNR FROM DARSTELLER) 185 / 277 SQL Modifikation von Tupeln Gib den Angestellten aus Abteilung 55, die zur Zeit weniger als 55000 verdienen, eine Gehaltserhöhung von 10%. UPDATE PERS SET PGEHALT=PGEHALT*1.1 WHERE ANR=55 AND PGEHALT<55000 I Aufbau der WHERE-Klausel entspricht dem in der SELECT-Anweisung 186 / 277 SQL Modifikation von Tupeln (2) Gib den am schlechtesten verdienenden Angestellten aller Abteilungen eine Gehaltserhöhung von 10% und setze ihren Bonus auf 20000. UPDATE PERS P SET PGEHALT=PGEHALT*1.1, PBONUS=20000 WHERE PGEHALT=(SELECT MIN(S.PGEHALT) FROM PERS S WHERE S.ANR=P.ANR) I gemäß Standard, ist eine Referenzierung der Relation einer Änderungs- bzw. Löschanweisung im FROM-Klausel nicht erlaubt I ORACLE erlaubt dies! 187 / 277 SQL Modifikation von Tupeln (3) Angestellten aus den Abteilungen 55 und 56, die zur Zeit noch keinen Bonus erhalten, soll ab sofort ein solcher gewährt werden, und zwar in Höhe von 50% des durchschnittlich in der Abteilung gezahlten Bonus. UPDATE PERS P SET BONUS=(SELECT 0.5*AVG(PBONUS) FROM PERS B WHERE B.ANR=P.ANR) WHERE ANR IN (55,56) AND (PBONUS=0 OR PBONUS IS NULL) 188 / 277 SQL Übung Gruppierung Bestimmen Sie die Ergebnisse für die folgenden Anfragen auf der gegebenen Relation R. R A 1 2 3 4 5 6 7 8 9 10 11 B rot rot rot blau blau grün grün gelb gelb gelb gelb C alt alt neu neu neu alt alt neu neu neu alt D 10 20 10 20 30 20 30 20 20 30 10 189 / 277 SQL Übung Gruppierung (2) SELECT SUM(D) FROM R WHERE MOD(A,6)=0 SUM(D) 190 / 277 SQL Übung Gruppierung (3) SELECT SUM(D) FROM R WHERE MOD(A,6)=0 SUM(D) 20 191 / 277 SQL Übung Gruppierung (4) SELECT B, C, SUM(A) FROM R GROUP BY B, C HAVING COUNT(*)=2 B C SUM(A) 192 / 277 SQL Übung Gruppierung (5) SELECT B, C, SUM(A) FROM R GROUP BY B, C HAVING COUNT(*)=2 B C SUM(A) rot alt 3 blau neu 9 grün alt 13 193 / 277 SQL Übung Gruppierung (6) SELECT B, SUM(A) FROM R WHERE MOD(A,10)!=0 GROUP BY B, C HAVING MAX(D)<30 B SUM(A) 194 / 277 SQL Übung Gruppierung (7) SELECT B, SUM(A) FROM R WHERE MOD(A,10)!=0 GROUP BY B, C HAVING MAX(D)<30 B rot SUM(A) 3 gelb 11 gelb 17 rot 3 195 / 277 SQL Konzepte von SQL-Datenbanken Daten-Objekte: Tabellen, Spalten, Schemata, Kataloge Benutzer Wertebereiche SQL-Datenbank Rechte Integritätsbedingungen 196 / 277 SQL Konzepte von SQL-Datenbanken (2) SQL-Umgebung - "Die Datenbank" Katalog Schema Tabellen und Spalten Zeilen und Spalten 197 / 277 SQL Konzepte von SQL-Datenbanken (3) I Begriff der Datenbank ist in SQL2 nicht normiert I SQL-Umgebung umfaßt alle von einem DBMS verwalteten Daten I organisatorische Trennung bei SQL2 in Kataloge (ORACLE spricht hier von "Datenbank-Instanz") I SQL-Umgebung enthält Daten und Meta-Daten, wobei alles in Tabellenform 198 / 277 SQL Aufbau eines Katalogs (ORACLE) Tabellenname CATALOG COL_COMMENTS COL_PRIVS CONSTRAINTS INDEXES IND_COLUMNS OBJECTS SEQUENCES SYNONYMS TABLES TAB_COLUMNS TAB_COMMENTS TAB_PRIVS TRIGGERS USERS VIEWS Inhaltsbeschreibung Tabellen, Sichten, Synonyme, Sequenzen Kommentare auf Tabellenspalten Rechte auf Tabellenspalten Integritätsbedingungen Indices Tabellenspalten als Teil von Indices SQL-Objekte (Tabellen, Synonyme, Spalten,. . . ) Sequenzen (Zähler-Objekte mit spezieller Mehrbenutzersemantik) Synonyme (oder Alias-Namen) Tabellen Tabellenspalten Kommentare auf Tabellen Rechte auf Tabellen Trigger Benutzer Sichten 199 / 277 SQL Datentypen (ORACLE) Datentyp Kommentar VARCHAR2(size) NVARCHAR2(size) Character-String mit variabler Länge bis zu 4000 Zeichen Character-String mit variabler Länge im nationalem Zeichensatz bis zu 4000 Zeichen Numerischer Datentyp mit Gesamtstellen size und Nachkommastellen d Character-Daten variabler Länge bis zu 2GB, keine Vewendung in WHERE-Klausel, Funktionen, Indizes oder ähnlichem Datumswerte inlusive Zeitangabe Zeitstempel, Genauigkeit precision gibt die Anzahl der Nachkommastellen für die Sekunden an Zeitstempel mit Wert für Zeitzonenverschiebung NUMBER(size,d) LONG DATE TIMESTAMP(precision) TIMESTAMP(precision) WITH TIME ZONE TIMESTAMP(precision) WITH LOCAL TIME ZONE Zeitstempel, normalisiert auf die lokale Zeitzone 200 / 277 SQL Datentypen (ORACLE) (2) Datentyp Kommentar INTERVAL YEAR(precision) TO MONTH INTERVAL DEAY(day_precision) TO SECOND(second_precision) RAW(size) LONG RAW ROWID Periode in Jahren und Monaten, wobei precision die Anzahl der Ziffern des Jahres spezifiziert CHAR(size) NCHAR(size) CLOB NCLOB BLOB BFILE Periode in Tagen, Stunden, Minuten und Sekunden Binäre Daten bis maximal 255 Bytes Binäre Daten bis zu 2GB Wert, der eine Zeile in einer ORACLE-Datenbank eindeutig identifiziert Character-Daten mit fixer Länge bis zu 2000 Zeichen Multibyte-Zeichensatzversion von CHAR Große alphanumerische Daten bis zu 4GB wie CLOB nur für Mehrbyte-Zeichensätze Binärdaten bis zu 4GB Zeiger auf eine binäre Systemdatei 201 / 277 SQL Erzeugung von Basisrelationen (ORACLE) Die Erzeugung von Basisrelationen umfaßt I Spaltennamen und Datentyp I Definition des Primärschlüssels I Fremdschlüsselbeziehungen I Integritätsbedingungen 202 / 277 SQL Erzeugung von Basisrelationen Syntax (ORACLE) CREATE TABLE base-table [(base-table-element-commalist)] [{ENABLE|DISABLE}CONSTRAINT constraint] [AS select-exp] base-table-element::= column-def|base-table-constraint-def base-table-constraint-def::= [CONSTRAINT constraint] {{PRIMARY KEY|UNIQUE}(column-commalist)| FOREIGN KEY (column-commalist) references-def| CHECK(cond-exp)}[DISABLE] 203 / 277 SQL Erzeugung von Spalten (ORACLE) CREATE TABLE STUDENT ( MATRIKELNR INT, NAME VARCHAR(40), VORNAME VARCHAR(40), GESCHLECHT VARCHAR(1) ); 204 / 277 SQL Definition des Primärschlüssels (ORACLE) CREATE TABLE STUDENT ( MATRIKELNR INT PRIMARY KEY, NAME VARCHAR(40), VORNAME VARCHAR(40), GESCHLECHT VARCHAR(1) ); 205 / 277 SQL Fremdschlüsselbeziehungen (ORACLE) CREATE TABLE STUDENT ( MATRIKELNR INT PRIMARY KEY, NAME VARCHAR(40), VORNAME VARCHAR(40), GESCHLECHT VARCHAR(1) ); CREATE TABLE PRUEFUNG ( MATRIKELNR INT, LEHRVERANSTALTUNG VARCHAR(40), NOTE DECIMAL(2,1), VERSUCH INT, CONSTRAINT PK PRIMARY KEY(MATRIKELNR, VERSUCH, LEHRVERANSTALTUNG), CONSTRAINT FK_MATRIKELNR FOREIGN KEY (MATRIKELNR) REFERENCES STUDENT(MATRIKELNR) ON DELETE CASCADE ); I Benennung von Integritätsbedingungen kann weggelassen werden I Benennung wird dringend empfohlen (Testbarkeit, Dokumentation) 206 / 277 SQL Integritätsbedingungen (ORACLE) CREATE TABLE STUDENT ( MATRIKELNR INT PRIMARY KEY, NAME VARCHAR(40) NOT NULL, VORNAME VARCHAR(40) NOT NULL, GESCHLECHT VARCHAR(1) NOT NULL, CONSTRAINT CHK_MATRIKELNR CHECK (MATRIKELNR>=100000 AND MATRIKELNR<=999999), CONSTRAINT CHK_GESCHLECHT CHECK (GESCHLECHT=’w’ OR GESCHLECHT=’m’) ); CREATE TABLE PRUEFUNG ( MATRIKELNR INT, LEHRVERANSTALTUNG VARCHAR(40), NOTE DECIMAL(2,1), VERSUCH INT, CONSTRAINT PK PRIMARY KEY(MATRIKELNR, VERSUCH, LEHRVERANSTALTUNG), CONSTRAINT FK_MATRIKELNR FOREIGN KEY (MATRIKELNR) REFERENCES STUDENT(MATRIKELNR) ON DELETE CASCADE ); Integritätsbedingungen können bei der Definition deaktiviert (DISABLE) oder aktiviert (ENABLE) werden. 207 / 277 SQL Integritätsbedingungen (2) Transaktionskonzept I Verarbeitungsfenster für die Einhaltung von semantischen Integritätsbedingungen I Verdeckung von Nebenläufigkeit (concurrency isolation) I Verdeckung von Fehlerfällen (failure isolation) I Logging und Recovery (COMMIT WORK, ROLLBACK WORK) 208 / 277 SQL Integritätsbedingungen (3) SET AUTOCOMMIT OFF INSERT INTO STUDENT INSERT INTO STUDENT INSERT INTO STUDENT INSERT INTO STUDENT COMMIT (MATRIKELNR, (MATRIKELNR, (MATRIKELNR, (MATRIKELNR, NAME, NAME, NAME, NAME, VORNAME, VORNAME, VORNAME, VORNAME, GESCHLECHT) GESCHLECHT) GESCHLECHT) GESCHLECHT) VALUES VALUES VALUES VALUES (... (... (... (... Abschließen einer Transaktion: I Transaktion erfolgreich, persistent speichern (COMMIT) I Fehler, zurücknehmen der Änderungen (ROLLBACK) 209 / 277 SQL Integritätsbedingungen I CHECK-Bedingungen I Verbot von NULL-Werten, UNIQUE, PRIMARY KEY I Fremdschlüsselbedingungen Dabei Festlegung des Überprüfungszeitpunktes möglich: I IMMEDIATE: am Ende einer Änderungsoperation (Default) I DEFFERED: am Transaktionsende (COMMIT) Steuerung des Überprüfungszeitpunktes: SET CONSTRAINTS {ALL|constraint-commalist} {DEFERRED|IMMEDIATE} 210 / 277 SQL Überprüfungszeitpunkt Beispiel CREATE TABLE A (ID_A NUMBER PRIMARY KEY, CONTENT_A VARCHAR2(255)); CREATE TABLE B (ID_B NUMBER PRIMARY KEY, CONTENT_B VARCHAR2(255)); ALTER TABLE A ADD REF_B NUMBER NOT NULL; ALTER TABLE A ADD CONSTRAINT FKAB FOREIGN KEY (REF_B) REFERENCES B(ID_B) DEFERRABLE INITIALLY IMMEDIATE; ALTER TABLE B ADD REF_A NUMBER NOT NULL; ALTER TABLE B ADD CONSTRAINT FKBA FOREIGN KEY (REF_A) REFERENCES A(ID_A) DEFERRABLE INITIALLY IMMEDIATE; 211 / 277 SQL Überprüfungszeitpunkt Beispiel (2) INSERT INTO A (ID_A, REF_B, CONTENT_A) VALUES (1, 2, ’textA’); INSERT INTO B (ID_B, REF_A, CONTENT_B) VALUES (2, 1, ’textB’); SELECT * FROM A; SELECT * FROM B; INSERT INTO A (ID_A, REF_B, CONTENT_A) VALUES (1, 2, ’textA’) * FEHLER in Zeile 1: ORA-02291: Integritäts-Constraint (DBS2P20.FKAB) verletzt - übergeordneter Schlüssel nicht gefunden INSERT INTO B (ID_B, REF_A, CONTENT_B) VALUES (2, 1, ’textB’) * FEHLER in Zeile 1: ORA-02291: Integritäts-Constraint (DBS2P20.FKBA) verletzt - übergeordneter Schlüssel nicht gefunden Es wurden keine Zeilen ausgewählt Es wurden keine Zeilen ausgewählt 212 / 277 SQL Überprüfungszeitpunkt Beispiel (3) SET AUTOCOMMIT OFF; SET CONSTRAINT FKAB DEFERRED; SET CONSTRAINT FKBA DEFERRED; INSERT INTO A (ID_A, REF_B, CONTENT_A) VALUES (1, 2, ’textA’); INSERT INTO B (ID_B, REF_A, CONTENT_B) VALUES (2, 1, ’textB’); COMMIT SELECT * FROM A; SELECT * FROM B; Constraint wurde festgelegt. Constraint wurde festgelegt. 1 Zeile wurde erstellt. 1 Zeile wurde erstellt. ID_A CONTENT_A REF_B ---------- ------------ ---------1 textA 2 1 Zeile wurde ausgewählt. ID_B CONTENT_B REF_A ---------- ------------ ---------2 textB 1 1 Zeile wurde ausgewählt. 213 / 277 SQL Erzeugung einer Relation durch Anfrage Beispiel (ORACLE) CREATE TABLE C ( C1 PRIMARY KEY, C2 DEFAULT 5, C3 CHECK (C3>0) DISABLE) AS SELECT B1,B2,B3 FROM B Die SELECT-Klausel I definiert Datentypen I definiert Spaltennamen, wenn nicht angegeben I füllt die neue Relation 214 / 277 SQL Änderung einer Relation (ORACLE) ALTER TABLE base-table {ADD (column data-type [DEFAULT default-expr] [column-constraint-def]...)| MODIFY (column [data-type][DEFAULT default-expr] [column-constraint-def]...)| ADD (base-table-constraint-def)} [ENABLE enable-clause]... [DISABLE disable-clause]... . . . Hinzufügen einer deaktivierten Integritätsbedingung und anschließende Aktivierung: ALTER TABLE PRUEFUNG ADD (CONSTRAINT CHK_VERSUCH CHECK (VERSUCH IN (1,2,3))) ALTER TABLE PRUEFUNG DISABLE CONSTRAINT CHK_VERSUCH; 215 / 277 SQL Änderung einer Relation Beispiele (ORACLE) Hinzufügen von zwei Spalten: ALTER TABLE STUDENT ADD (SEMESTER INT, WOHNORT VARCHAR(40)); Modifizierung von Spalten ALTER TABLE PRUEFUNG MODIFY (WOHNORT NOT NULL); I I Hinzufügen von Integritätsbedingungen eingeschränkte Änderung des Datentyps I I Erhöhung der Präzision bei numerischen Datentypen Vergrößerung der maximalen Länge bei Zeichenketten 216 / 277 SQL Löschen einer Relation (ORACLE) DROP {TABLE base-table [CASCADE CONSTRAINTS]| VIEW view} I mit CASCADE CONSTRAINTS werden referentielle Integritätsbedingungen automatisch mitentfernt I fehlt die Option CASCADE CONSTRAINTS wird das Löschen verhindert, falls noch Abhängigkeiten bestehen I Sichten werden generell durch das Löschen nicht beeinträchtigt, aber intern als ungültig markiert 217 / 277 SQL Sichtkonzept (ORACLE) CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view [(column-commalist)] AS table-exp [WITH CHECK OPTION [CONSTRAINT constraint]| WITH READ ONLY] I Modifikation einer bestehenden Sicht möglich (OR REPLACE) I Sichten können unabhängig von der Existenz der Basisrelationen erzeugt werden (FORCE) I Verbot von Änderungsoperationen (WITH READ ONLY) I Änderungen auf eine Sicht, die zum "Herausfallen" der geänderten Tupel aus der Sicht führen würden I I können unterbunden werden (WITH CHECK OPTION) die entsprechende Integritätsbedingung kann benannt werden (CONSTRAINT) 218 / 277 SQL Beispiel Sichtkonzept (ORACLE) Auf der Relation PERS soll eine strukturgleiche, jedoch nicht änderbare Sicht READPERS erzeugt werden. CREATE VIEW READPERS AS SELECT * FROM PERS WITH READ ONLY Die Sicht READPERS soll unter Beibehaltung ihrer Struktur jetzt als änderbar definiert werden. CREATE OR REPLACE VIEW READPERS AS SELECT * FROM PERS 219 / 277 SQL Beispiel Sichtkonzept (ORACLE) (2) Es soll eine Sicht KEINBONUS aller Mitarbeiter erzeugt werden, so daß Änderungen nicht "aus der Sicht heraus" führen können. CREATE VIEW KEINBONUS AS SELECT * FROM PERS WHERE PBONUS IS NULL OR PBONUS=0 WITH CHECK OPTION CONSTRAINT KBON 220 / 277 SQL Beispiel Sichtkonzept (ORACLE) (3) Es soll die Sicht PRODBESCH aller Mitarbeiter der Abteilungen Produktion und Beschaffung definiert werden. Änderungen dürfen nicht "aus der Sicht heraus" führen. CREATE VIEW PRODBESCH AS SELECT * FROM PERS WHERE ANR IN (SELECT ANR FROM ABT WHERE ANAME IN (’Produktion’,’Beschaffung’)) WITH CHECK OPTION CONSTRAINT BRBE 221 / 277 SQL Beispiel Sichtkonzept (ORACLE) (4) Es soll die Sicht PRODBESCH aller Mitarbeiter der Abteilungen Produktion und Beschaffung definiert werden. Änderungen dürfen nicht "aus der Sicht heraus" führen. (Alternative Definition) CREATE VIEW PRODBESCH AS SELECT P.* FROM PERS P, ABT A WHERE P.ANR=A.ANR AND A.ANAME IN (’Produktion’,’Beschaffung’) WITH CHECK OPTION CONSTRAINT BRBE 222 / 277 SQL Erzeugung von Indexstrukturen (ORACLE) I Einrichtung von Indexstrukturen durch DBA oder Benutzer I Nutzung eines Index wird durch den DBS-Optimizer entschieden I Im SQL-Standard keine Anweisung vorgesehen 223 / 277 SQL Erzeugung von Indexstrukturen (ORACLE) (2) Erzeugung eines Index: CREATE [UNIQUE|BITMAP] INDEX index ON base-table (column [ORDER][, column [ORDER]...) Beispiel: CREATE UNIQUE INDEX PERSIND1 ON PERS (PNR) I Realisierung bspw. durch B-Bäume I keine Duplikate erlaubt 224 / 277 SQL Erzeugung von Indexstrukturen (ORACLE) (3) Annahme: In der PERS-Tabelle existiert zusätzlich eine Spalte PGESCHLECHT, in der nur die Werte ’w’ und ’m’ vorkommen. Außerdem enthalte die Tabelle ca. 2 Millionen Zeilen. Indexgröße Laufzeit (COUNT) B-Baum 29,69 MB 1,01 sek Bitmap 753 KB 0,03 sek Bei wenigen Werten und wenigen nachträglichen Änderungen sollte statt dem B-Baum (Default) ein Bitmap-Index genutzt werden. 225 / 277 SQL EXPLAIN PLAN Analyse von SQL-Anfragen: I Untersuchung der Kosten einer Abfrage I Anzeige des Ausführungsplans I abhängig von Größe der beteiligten Relationen 226 / 277 SQL EXPLAIN PLAN Beispiel Welche Schauspieler haben die Rolle ’Faust’ gespielt? Alternative 1: SELECT S.NAME FROM SCHAUSPIELER S WHERE ’Faust’ IN (SELECT FIGUR FROM DARSTELLER D WHERE D.PNR=S.PNR); Alternative 2: SELECT S.NAME FROM SCHAUSPIELER S WHERE S.PNR IN (SELECT D.PNR FROM DARSTELLER D WHERE FIGUR=’Faust’); 227 / 277 SQL EXPLAIN PLAN Beispiel (2) EXPLAIN PLAN SET STATEMENT_ID=’stmt1’ FOR SELECT S.NAME FROM SCHAUSPIELER S WHERE ’Faust’ IN (SELECT FIGUR FROM DARSTELLER D WHERE D.PNR=S.PNR); SELECT PLAN_TABLE_OUTPUT FROM TABLE(DBMS_XPLAN.DISPLAY(NULL, ’stmt1’, ’TYPICAL’)); 228 / 277 SQL EXPLAIN PLAN Beispiel (3) PLAN_TABLE_OUTPUT ----------------------------------------------------------------------------------Plan hash value: 451918592 ----------------------------------------------------------------------------------| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ----------------------------------------------------------------------------------| 0 | SELECT STATEMENT | | 32 | 800 | 2953 (1)| 00:00:36 | |* 1 | FILTER | | | | | | | 2 | TABLE ACCESS FULL| SCHAUSPIELER | 91478 | 2233K| 87 (5)| 00:00:02 | |* 3 | INDEX UNIQUE SCAN| SYS_C0055527 | 1 | 25 | 1 (0)| 00:00:01 | ----------------------------------------------------------------------------------Predicate Information (identified by operation id): --------------------------------------------------1 - filter( EXISTS (SELECT /*+ */ 0 FROM "DARSTELLER" "D" WHERE "FIGUR"=’Faust’ AND "D"."PNR"=:B1)) 3 - access("D"."PNR"=:B1 AND "FIGUR"=’Faust’) Note ----- dynamic sampling used for this statement 21 Zeilen ausgewählt. 229 / 277 SQL EXPLAIN PLAN Beispiel (4) EXPLAIN PLAN SET STATEMENT_ID=’stmt2’ FOR SELECT S.NAME FROM SCHAUSPIELER S WHERE S.PNR IN (SELECT D.PNR FROM DARSTELLER D WHERE FIGUR=’Faust’); SELECT PLAN_TABLE_OUTPUT FROM TABLE(DBMS_XPLAN.DISPLAY(NULL, ’stmt2’, ’TYPICAL’)); 230 / 277 SQL EXPLAIN PLAN Beispiel (5) PLAN_TABLE_OUTPUT ----------------------------------------------------------------------------------Plan hash value: 587324159 ----------------------------------------------------------------------------------| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ----------------------------------------------------------------------------------| 0 | SELECT STATEMENT | | 1090 | 54500 | 119 (31)| 00:00:02 | | 1 | NESTED LOOPS SEMI | | 1090 | 54500 | 119 (31)| 00:00:02 | | 2 | TABLE ACCESS FULL| SCHAUSPIELER | 91478 | 2233K| 87 (5)| 00:00:02 | |* 3 | INDEX UNIQUE SCAN| SYS_C0055527 | 13 | 325 | 0 (0)| 00:00:01 | ----------------------------------------------------------------------------------Predicate Information (identified by operation id): --------------------------------------------------3 - access("S"."PNR"="D"."PNR" AND "FIGUR"=’Faust’) Note ----- dynamic sampling used for this statement 19 Zeilen ausgewählt. 231 / 277 Programmierschnittstellen Übersicht Beispiele für Programmierschnittstellen: I PL/SQL I Embedded SQL, Oracle Call Interface (OCI) I Open Database Connectivity (Microsoft) I Java Database Connectivity (JDBC) 232 / 277 Programmierschnittstellen PL/SQL PL/SQL (Procedural Language/SQL) I proprietäre Programmiersprache von Oracle I ausgelegt auf die Arbeit mit der Datenbank I SQL-Statements nicht als Zeichenketten eingebunden, sondern gelten als Programmcode I Korrektheit kann vor der Laufzeit verifiziert werden 233 / 277 Programmierschnittstellen PL/SQL Grundlegender Aufbau DECLARE -- Deklarationsblock BEGIN -- Eigentliches Programm EXCEPTION -- Ausnahmeverarbeitung END; 234 / 277 Programmierschnittstellen PL/SQL Cursor-Konzept I Cursor ist symbolischer Name, der einer Abfrage zugeordnet ist I Abfrage der Ergebnistupel mit dem Cursor (one tuple at a time) I Übergabe von Werten in Variablen der Wirtssprache mit INTO I Kovertierung der Datentypen Beispiel: OPEN c1; FETCH C1 INTO VAR1, VAR2, ..., VARN CLOSE c1; 235 / 277 Programmierschnittstellen PL/SQL Beispiel Cursor CREATE OR REPLACE PROCEDURE testCursor (autor_in IN VARCHAR2) IS titel VARCHAR(30); u_ort VARCHAR(30); u_jahr INT; CURSOR myCursor IS SELECT TITEL, U_ORT, U_JAHR FROM DRAMA WHERE AUTOR=autor_in; BEGIN OPEN myCursor; LOOP FETCH myCursor INTO titel, u_ort, u_jahr; EXIT WHEN myCursor%NOTFOUND; dbms_output.put(titel); dbms_output.put(’ ’); dbms_output.put(u_ort); dbms_output.put(’ ’); dbms_output.put(u_jahr); dbms_output.new_line; END LOOP; CLOSE myCursor; END testCursor; 236 / 277 Programmierschnittstellen PL/SQL Beispiel Schleife Auch Schleifen ohne explizite Deklaration eines Cursors möglich: CREATE OR REPLACE PROCEDURE testPlSql (autor_in IN VARCHAR2) IS BEGIN FOR row IN (SELECT TITEL, U_ORT, U_JAHR FROM DRAMA WHERE AUTOR=autor_in) LOOP dbms_output.put(row.TITEL); dbms_output.put(’ ’); dbms_output.put(row.U_ORT); dbms_output.put(’ ’); dbms_output.put(row.U_JAHR); dbms_output.new_line; END LOOP; END testPlSql; Aufruf: EXEC testCursor(’Schiller’); Maria Stuart Weimar 1800 Wallenstein Jena 1799 Tell Weimar 1804 237 / 277 Programmierschnittstellen PL/SQL Beispiel Funktion CREATE OR REPLACE FUNCTION getAuthor (drama_in IN VARCHAR2) RETURN VARCHAR2 IS autor_out VARCHAR2(30); BEGIN SELECT AUTOR INTO autor_out FROM DRAMA WHERE TITEL=drama_in; RETURN autor_out; END getAuthor; Aufruf der Funktion: SELECT * FROM DICHTER WHERE AUTOR=getAuthor(’Faust’); 238 / 277 Programmierschnittstellen Embedded SQL Embedded SQL I Präcompiler, erzeugt ORACLE-spezifischen Code I ermöglicht einfache Erstellung von DB-gestützten Programmen, ohne Detail-Wissen über die ORACLE-Api zu haben 239 / 277 Programmierschnittstellen Embedded SQL - Funktionsweise 240 / 277 Programmierschnittstellen Embedded SQL Beispiel #include <stdio.h> #include <sqlca.h> void sqlerror(); // Definition von Variablen EXEC SQL BEGIN DECLARE SECTION; // Connection-String Benutzername/Passwort char *connstr = "dbs2p20/dbs2p20"; // Variable zur Aufnahme von TITEL char db_titel[30]; // Variable zur Aufnahme von U_ORT char db_uort[30]; // Variable zur Aufnahme von U_JAHR int db_ujahr; EXEC SQL END DECLARE SECTION; 241 / 277 Programmierschnittstellen Embedded SQL Beispiel (2) //Main-Methode int main() { // bei jedem Fehler die Methode sqlerror() aufrufen EXEC SQL WHENEVER SQLERROR DO sqlerror(); // bei Warnungen einfach fortfahren EXEC SQL WHENEVER SQLWARNING CONTINUE; // Verbindung zu Datenbank aufbauen EXEC SQL CONNECT :connstr; // Cursor mit entsprechendem SELECT-Statement definieren EXEC SQL DECLARE drama_cursor CURSOR FOR SELECT TITEL, U_ORT, U_JAHR FROM DRAMA WHERE AUTOR = ’Schiller’; 242 / 277 Programmierschnittstellen Embedded SQL Beispiel (3) //Main-Methode Fortsetzung // Cursor "öffnen" um die Ergebnisse zu durchlaufen EXEC SQL OPEN drama_cursor; // wenn keine Ergebnisse mehr, mit break die Schleife verlassen EXEC SQL WHENEVER NOT FOUND DO break; for (;;) { // jedes Tupel in die entsprechenden Variablen schreiben... EXEC SQL FETCH drama_cursor INTO :db_titel, :db_uort, :db_ujahr; // ...und ausgeben printf("\t%s\t%s\t%i\n", db_titel, db_uort, db_ujahr); } // Cursor schliessen EXEC SQL CLOSE drama_cursor; // Transaktion wurde erfolgreich ausgeführt EXEC SQL COMMIT WORK RELEASE; // Main-Methode ohne Fehlercode verlassen return 0; } 243 / 277 Programmierschnittstellen Embedded SQL Beispiel (4) //Methode sqlerror() zur Ausgabe von Fehlerinformationen void sqlerror() { // Fehlernummer ausgeben printf("Oracle error code: %i\nOracle error description: sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc); // hier einfach weiter machen EXEC SQL WHENEVER SQLERROR CONTINUE; // Rollback durchführen... EXEC SQL ROLLBACK WORK RELEASE; // ...und Programm verlassen exit(1); return; } %s\n", 244 / 277 Programmierschnittstellen Embedded SQL Beispiel Kompilierung -bash-3.00$ proc iname=testProC.pc -bash-3.00$ gcc testProC.c -o testProC -lclntsh -L/opt/oracle/oracle/product/ 10.2.0/db_1/lib32 -I/opt/oracle/oracle/product/10.2.0/db_1/precomp/public -bash-3.00$ ./testProC Maria Stuart Weimar 1800 Wallenstein Jena 1799 Tell Weimar 1804 245 / 277 Programmierschnittstellen ORACLE Call Interface OCI I Mächtige Schnittstelle zur ORACLE-Datenbank I relativ komplex, viele Funktionen und Parameter I hoher Programmieraufwand, selbst bei einfachen Anfragen I sehr performante Applikationen möglich die ORACLE-Api zu haben 246 / 277 Programmierschnittstellen OCI Beispiel #include #include #include #include <stdio.h> <stdlib.h> <string.h> <oci.h> /* Definition von Variablen */ static OCIEnv *p_env; static OCIError *p_err; static OCISvcCtx *p_svc; static OCIStmt *p_sql; static OCIDefine *p_dfn = (OCIDefine *) 0; static OCIBind *p_bnd = (OCIBind *) 0; 247 / 277 Programmierschnittstellen OCI Beispiel (2) /* Main-Methode */ int main() { int p_bvi; char p_sli1[40]; char p_sli2[40]; int p_sli3; int rc; char errbuf[100]; int errcode; /* OCI initialisieren */ rc = OCIInitialize((ub4) OCI_DEFAULT, (dvoid *)0, (dvoid * (*)(dvoid *, size_t)) 0, (dvoid * (*)(dvoid *, dvoid *, size_t))0, (void (*)(dvoid *, dvoid *)) 0 ); 248 / 277 Programmierschnittstellen OCI Beispiel (3) /* Umgebung initialisieren */ rc = OCIEnvInit( (OCIEnv **) &p_env, OCI_DEFAULT, (size_t) 0, (dvoid **) 0 ); /* Handler initialisieren */ rc = OCIHandleAlloc( (dvoid *) p_env, (dvoid **) &p_err, OCI_HTYPE_ERROR, (size_t) 0, (dvoid **) 0); rc = OCIHandleAlloc( (dvoid *) p_env, (dvoid **) &p_svc, OCI_HTYPE_SVCCTX, (size_t) 0, (dvoid **) 0); /* Verbindung zu Datenbank herstellen */ rc = OCILogon(p_env, p_err, &p_svc, "dbs2p20",7, "dbs2p20",7, "oralv10a",8); if (rc != 0) { OCIErrorGet((dvoid *)p_err, (ub4) 1, (text *) NULL, &errcode, errbuf, (ub4) sizeof(errbuf), OCI_HTYPE_ERROR); printf("Error - %.*s\n", 512, errbuf); exit(8); } 249 / 277 Programmierschnittstellen OCI Beispiel (4) /* Statement vorbereiten */ rc = OCIHandleAlloc( (dvoid *) p_env, (dvoid **) &p_sql, OCI_HTYPE_STMT, (size_t) 0, (dvoid **) 0); rc = OCIStmtPrepare(p_sql, p_err, "SELECT TITEL, U_ORT, U_JAHR FROM DRAMA WHERE AUTOR=’Schiller’", (ub4) 61, (ub4) OCI_NTV_SYNTAX, (ub4) OCI_DEFAULT); /* Variable für TITEL binden */ rc = OCIDefineByPos(p_sql, &p_dfn, p_err, (sword) 40, SQLT_STR, (dvoid *) 0, (ub2 (ub2 *)0, OCI_DEFAULT); /* Variable für U_ORT binden */ rc = OCIDefineByPos(p_sql, &p_dfn, p_err, (sword) 40, SQLT_STR, (dvoid *) 0, (ub2 (ub2 *)0, OCI_DEFAULT); /* Variable für U_JAHR binden */ rc = OCIDefineByPos(p_sql, &p_dfn, p_err, (sword) sizeof(sword), SQLT_INT, (dvoid (ub2 *)0, OCI_DEFAULT); 1, (dvoid *) &p_sli1, *)0, 2, (dvoid *) &p_sli2, *)0, 3, (dvoid *) &p_sli3, *) 0, (ub2 *)0, 250 / 277 Programmierschnittstellen OCI Beispiel (5) /* Statement ausführen */ rc = OCIStmtExecute(p_svc, p_sql, p_err, (ub4) 1, (ub4) 0, (CONST OCISnapshot *) NULL, (OCISnapshot *) NULL, OCI_DEFAULT); /* Ergebnisse ausgeben */ while (rc != OCI_NO_DATA) { printf("%s %s %i\n",p_sli1, p_sli2, p_sli3); rc = OCIStmtFetch(p_sql, p_err, 1, 0, 0); } /* Verbindung beenden und Handler freigeben */ rc = OCILogoff(p_svc, p_err); rc = OCIHandleFree((dvoid *) p_sql, OCI_HTYPE_STMT); rc = OCIHandleFree((dvoid *) p_svc, OCI_HTYPE_SVCCTX); rc = OCIHandleFree((dvoid *) p_err, OCI_HTYPE_ERROR); return 0; } 251 / 277 Programmierschnittstellen ODBC Open Database Connectivity I ursprünglich von Microsoft entwickelt I standardisierte Datenbankschnittstelle für SQL I Programmierschnittstelle um eine Anwendung relativ unabhängig vom DBMS zu entwickeln 252 / 277 Programmierschnittstellen ODBC C# Beispiel using using using using System; System.Collections.Generic; System.Text; System.Data.Odbc; namespace TestODBC { class Program { static void Main(string[] args) { // Datenbankverbindung erzeugen... OdbcConnection DbConnection = new OdbcConnection( "Driver=Microsoft ODBC for Oracle;Server=ORALV9A;UID=dbs2p20;PWD=dbs2p20 // ...und öffnen DbConnection.Open(); // Statement erzeugen OdbcCommand DbCommand = DbConnection.CreateCommand(); DbCommand.CommandText = "SELECT TITEL, U_JAHR, U_ORT FROM DRAMA WHERE AUTOR=’Schiller’"; 253 / 277 Programmierschnittstellen ODBC C# Beispiel (2) // Statement ausführen OdbcDataReader DbReader = DbCommand.ExecuteReader(); // Ergebniszeilen ausgeben while( DbReader.Read()) { for (int i = 0; i < DbReader.FieldCount; i++) { String col = DbReader.GetString(i); Console.Write(col + "\t"); } Console.WriteLine(); } // Aufräumen DbReader.Close(); DbCommand.Dispose(); DbConnection.Close(); } } } 254 / 277 Programmierschnittstellen JDBC Java Database Connectivity I entwickelt von Sun Microsystems I Datenbankschnittstelle der Java-Plattform I JDBC-ODBC-Bridge 255 / 277 Programmierschnittstellen JDBC Beispiel import java.sql.*; public class TestJDBC { public static void main(String[] args) { try { DriverManager.registerDriver(new oracle.jdbc.OracleDriver()); Connection connection = DriverManager.getConnection( "jdbc:oracle:thin:@mtsthelens.informatik.hs-fulda.de:1521:ORALV9A", "DBS2P20","DBS2P20"); Statement stmt = connection.createStatement(); ResultSet resultSet = stmt.executeQuery( "SELECT TITEL, U_JAHR, U_ORT FROM DRAMA WHERE AUTOR=’Schiller’"); while (resultSet.next()) { System.out.println(resultSet.getString("TITEL") + "\t" + resultSet.getInt("U_JAHR") + "\t" + resultSet.getString("U_ORT")); } } catch (SQLException ex) { ex.printStackTrace(); } } } 256 / 277 Datenkontrolle Möglichkeiten Semantische Integritätskontrolle I Kontrolle, welche Daten "sinnvoll" und "gültig" sind (NOT NULL, UNIQUE, . . . ) Zugriffkontrolle I Maßnahmen zur Datensicherung I Definition von Zugriffsobjekten I Vergabe und Kontrolle von Zugriffsrechten 257 / 277 Datenkontrolle Konsistenz - Integrität Konsistenz beschreibt die Korrektheit der DB-internen Speicherstrukturen, Zugriffspfade und sonstigen Verwaltungsinformationen. Integrität beschreibt die Korrektheit der Abbildung der Miniwelt auf die in der DB gespeicherten Daten ⇒ die Integrität kann verletzt sein, obwohl die Konsistenz der Datenbank gewahrt bleibt ⇒ ein DBMS kann nur die Konsistenz der Daten sichern 258 / 277 Datenkontrolle Trigger-Konzept I "Anstossen" von Aktionen vor bzw. nach Änderung von Daten I mehrere Trigger pro Tabelle erlaubt I Rekursionen müssen vermieden werden 259 / 277 Datenkontrolle Trigger-Konzept in ORACLE CREATE [OR REPLACE] TRIGGER trigger {BEFORE|AFTER} {DELETE|INSERT|UPDATE[OF column-commalist]} [OR {DELETE|INSERT|UPDATE[OF column-commalist]}] ... ON table [ [REFERENCING {OLD [AS] old|NEW [AS] new}...] FOR EACH ROW[WHEN (condition)]] pl/sql-block 260 / 277 Datenkontrolle Beispiel Trigger CREATE TABLE LEHRVERANSTALTUNG ( NAME VARCHAR(40) PRIMARY KEY, DOZENT VARCHAR(40), RAUM VARCHAR(40) ); CREATE TABLE PRUEFUNG ( MATRIKELNR INT, LEHRVERANSTALTUNG VARCHAR(40), NOTE DECIMAL(2,1), VERSUCH INT, CONSTRAINT PK PRIMARY KEY(MATRIKELNR, VERSUCH, LEHRVERANSTALTUNG), CONSTRAINT CHK_VERSUCH CHECK (VERSUCH IN (1,2,3)), CONSTRAINT CHK_NOTE CHECK (NOTE IN (1.0,1.3,1.7,2.0,2.3,2.7,3.0,3.3,3.7,4.0,5. CONSTRAINT FK_MATRIKELNR FOREIGN KEY (MATRIKELNR) REFERENCES STUDENT(MATRIKELNR) ON DELETE CASCADE, CONSTRAINT FK_LVA FOREIGN KEY (LEHRVERANSTALTUNG) REFERENCES LEHRVERANSTALTUNG(NAME) ); 261 / 277 Datenkontrolle Beispiel Trigger (2) CREATE OR REPLACE TRIGGER erzeugeLVA BEFORE INSERT ON PRUEFUNG FOR EACH ROW DECLARE rowCount NUMBER; BEGIN SELECT COUNT(*) INTO rowCount FROM LEHRVERANSTALTUNG WHERE NAME=:new.LEHRVERANSTALTUNG; IF (rowCount=0) THEN INSERT INTO LEHRVERANSTALTUNG (NAME, DOZENT, RAUM) VALUES (:new.LEHRVERANSTALTUNG, ’Unbekannt’, ’Unbekannt’); END IF; END erzeugeLVA; / 262 / 277 Datenkontrolle Beispiel Trigger (3) CREATE TABLE LOG ( ZEITPUNKT DATE, VORGANG VARCHAR(255) ); CREATE OR REPLACE TRIGGER schreibeLog AFTER UPDATE ON PRUEFUNG FOR EACH ROW BEGIN INSERT INTO LOG (ZEITPUNKT, VORGANG) VALUES (SYSDATE(), ’Eintrag (’ || :old.MATRIKELNR || ’/’ || :old.LEHRVERANSTALTUNG || ’/’ || :old.VERSUCH || ’/’ || :old.NOTE || ’) wurde geändert zu (’ || :new.MATRIKELNR || ’/’ || :new.LEHRVERANSTALTUNG || ’/’ || :new.VERSUCH || ’/’ || :new.NOTE || ’)’); END schreibeLog; / 263 / 277 Datenkontrolle Beispiel Trigger (4) UPDATE PRUEFUNG SET NOTE=1.3 WHERE MATRIKELNR=100010 AND VERSUCH=3 AND LEHRVERANSTALTUNG=’Prog I’; 1 rows updated SELECT * FROM LOG; ZEITPUNKT VORGANG –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– 19.12.07 Eintrag (100010/Prog I/3/5) wurde geändert zu (100010/Prog I/3/1,3) 1 rows selected 264 / 277 Datenkontrolle Steuerung Trigger I Entfernen von Triggern: DROP TRIGGER trigger I Aktivierung bzw. Deaktivierung: ALTER TRIGGER trigger {ENABLE|DISABLE} I Alle Trigger einer Tabelle aktivieren/deaktivieren: ALTER TABLE ...[{ENABLE|DISABLE} ALL TRIGGERS] 265 / 277 Datenkontrolle Zugriffskontrolle GRANT {privileges-commalist|ALL PRIVILEGES} ON accessible-object TO grantee-commalist [WITH GRANT OPTION] REVOKE[GRANT OPTION FOR] privileges-commalist ON accessible-object FROM grantee-commalist I Zugriffsrechte: SELECT, INSERT, UPDATE, DELETE, REFERENCES I Erzeugung einer abhängigen Relation benötigt REFERENCES-Recht I Weitergabe von Zugriffsrechten mit WITH GRANT OPTION Beispiele: GRANT SELECT, INSERT ON PERS TO DBS2P19; REVOKE SELECT, INSERT ON PERS FROM DBS2P19; 266 / 277 Datenkontrolle Transaktionsparadigma Eine Transaktion ist eine ununterbrechbare Folge von Befehlen, welcher eine Datenbank von einem konsistenten Zustand in einen neuen konsistenten Zustand überführt. Man spricht dabei auch vom ACID-Prinzip: Atomicity ’Alles oder Nichts’-Eigenschaft (Fehlerisolierung) Consistency eine erfolgreiche TA erhält die DB-Konsistenz Isolation alle Aktionen innerhalb einer TA müssen vor parallel ablaufenden TA verborgen werden Durability sobald eine TA ihre Änderungen freigegeben hat, muss das System das Überleben dieser Änderungen trotz beliebiger Fehler garantieren (Persistenz) 267 / 277 Datenkontrolle Anomalien - Lost Update read A(100) A(110):=A+10 T1 COMMIT read A(100) A(150):=A+50 T2 COMMIT ZEIT A(100) A(150) A(110) 268 / 277 Datenkontrolle Anomalien - Dirty Read read A(100) A(110):=A+10 read B(20) T1 ABORT read A(110) read C(50) C(160):=C+A T2 COMMIT ZEIT A(100) A(110) A(100) B(20) C(50) C(160) 269 / 277 Datenkontrolle Anomalien - Non-repeatable Read A(150):=150 T1 read A(100) Liste read A(150) Details T2 ZEIT A(100) A(150) 270 / 277 Datenkontrolle Anomalien - Inkonsistente Analyse A(110):=110 B(60):=60 C(30):=30 T1 COMMIT read A(100) S(100):=S+A read B(60) S(160):=S+B read C(30) S(190):=S+C T2 COMMIT ZEIT A(100) A(110) B(50) B(60) C(20) S(0) C(30) S(100) S(160) S(190) 271 / 277 Datenkontrolle RX Sperrverfahren I Sperrmodus eines Objektes: I I I I NL (no lock) R (read) X (exclusive/write) Sperranforderung einer Transaktion: I I R (read) X (exclusive/write) Kompatibilitätsmatrix: R X NL + + R + - X - 272 / 277 Datenkontrolle Zwei-Phasen-Sperrverfahren (2PL) Sperren W S Zeit Wachstumsphase (W): Sperren werden nur gesetzt, aber keine freigegeben Schrumpfungsphase (S): Sperren werden freigegeben, aber keine angefordert 273 / 277 Datenkontrolle Konservatives Zwei-Phasen-Sperrverfahren (C2PL) Sperren W S Zeit I alle Sperren werden vor Beginn der Transaktion gesetzt I bereits vor dem Ende der Transaktion können Sperren freigegeben werden I keine Deadlocks möglich I Verlust von Parallelität 274 / 277 Datenkontrolle Striktes Zwei-Phasen-Sperrverfahren (S2PL) Sperren W S Zeit I alle Sperren werden erst am Ende der Transaktion freigegeben I lange Wartezeit von blockierten Transaktionen 275 / 277 Quellen Christian Böhm Skript zur Vorlesung Datenbanksysteme Universität Heidelberg, Institut für Informatik, Lehrstuhl für Datenbanksysteme, 2005 Prof. Dr. Dietmar Seipel Skript Vorlesung Datenbanken Universität Würzburg, Institut für Informatik, Lehrstuhl für Informatik I, 2006 Prof. Dr. Gottfried Vossen Datenmodelle, Datenbanksprachen und Datenbankmanagementsysteme 4. korrigierte und ergänzte Auflage, Oldenbourg Wissenschaftsverlag GmbH, München, 2000 Prof. Dr.-Ing. Stefan Deßloch Skript zur Vorlesung Informationssysteme Technische Universität Kaiserslautern, Fachbereich Informatik, AG Heterogene Informationssysteme, 2007 276 / 277 Quellen (2) Prof. Dr. Peter Peinl Skript zur Vorlesung Datenbanksysteme II Hochschule Fulda, Fachbereich Angewandte Informatik, 2006 Kevin Loney, George Koch ORACLE 9i - Die umfassende Referenz Carl Hanser Verlag, München, Wien, 2003 Badran Farwati Renntrimm - Tipps für das Datenbank-Tuning Linux Magazin, 04/2005 277 / 277