Relationale Anfragesprachen Structured Query Language: SQL Query by Example: QBE SQL standardisierte Datendefinitions (DDL) Datenmanipulations (DML) Anfrage (Query)Sprache derzeit aktueller Standard ist SQL 99 objektrelationale Erweiterung Die Syntax ist in Kap. des DatenbankSkripts von Prof. Wegner spezifiziert siehe Vorlesungshomepage Kapitel 1 UniSchema MatrNr Semester PersNr Fachgebiet Studenten N Note Assistenten N N voraussetzen Nachfolger Vorgänger N M hören Vorlesungen prüfen arbeitenfür M 1 M N lesen 1 Professoren PersNr 1 SWS Titel Rang Raum PersNr 15 16 17 1 1 16 17 Professoren Rang Raum MatrNr 6 00 Xenokrates Russel Kopernikus Popper Augustinus Curie C C C voraussetzen 10 5 09 6 Vorgänger Nachfolger 50 505 prüfen 50 509 516 505 505 559 MatrNr PersNr Note 8106 16 1 7 7550 Schopenhauer Feuerbach Semester 18 50 15 9555 50 007 Spinoza Gott und Natur 16 7550 60 17 50 50 50 610 680 8106 910 9555 MatrNr 610 7550 7550 8106 8106 8106 8106 910 910 910 Studenten Jonas Fichte Aristoxenos Carnap Theophrastos hören 05 505 516 559 509 1 10 8 6 PerslNr 00 00 00 005 006 50 509 05 505 516 559 50 60 Platon Aristoteles Wittgenstein Rhetikus Newton Vorlesungen Titel SWS Grundzüge Ethik Erkenntnistheorie Mäeutik Logik Wissenschaftstheorie Bioethik Der Wiener Kreis Glaube und Wissen Die Kritiken Assistenten Fachgebiet Ideenlehre Syllogistik Sprachtheorie Planetenbewegung Keplersche Gesetze gelesen Von 17 15 16 15 15 16 16 1 1 17 Boss 15 15 16 17 17
(Einfache) Datendefinition in SQL Datentypen character (n), char (n) character varying (n), varchar (n) numeric (p,s), integer blob oder raw für sehr große binäre Daten clob für sehr große StringAttribute date für Datumsangaben Anlegen von Tabelle create table Professoren (PersNr integer not null, varchar (0) not null Rang character () ); Veränderung am Datenbestand Einfügen von Tupeln insert into hören select MatrNr, from Studenten, Vorlesungen where Titel= `Logik ; insert into Studenten (MatrNr, ) values (811, `Archimedes ); 5 6 MatrNr 910 9555 811 Studenten Theophrastos Feuerbach Archimedes Semester Veränderungen am Datenbestand Löschen von Tupeln delete Studenten where Semester > 1; NullWert Verändern von Tupeln update Studenten set Semester= Semester + 1; 7 8
Einfache SQLAnfrage Einfache SQLAnfragen Sortierung select PersNr, select PersNr,, Rang from Professoren from Professoren where Rang= ; PersNr 15 16 16 17 Russel Curie order by Rang desc, asc; PersNr 16 17 16 15 1 17 1 Curie Russel Augustinus Kopernikus Popper Rang C C C 9 10 Duplikateliminierung select distinct Rang from Professoren Rang In der relationalen Algebra werden Duplikate automatisch eliminiert, aufgrund der Mengensemantik In SQL wird dies aus Effizienzgründen standardmäßig nicht gemacht. Auf Wunsch kann die Eliminierung mit distinct erzwungen werden. C 11 PersNr 15 16 17 1 1 16 17 Professoren Rang Raum MatrNr 6 00 Xenokrates Russel Kopernikus Popper Augustinus Curie C C C voraussetzen 10 5 09 6 Vorgänger Nachfolger 50 505 50 509 516 505 505 559 MatrNr PersNr Note 8106 16 1 50 7550 prüfen 60 15 17 7 50 610 680 7550 Schopenhauer 8106 910 9555 MatrNr 610 7550 7550 8106 8106 8106 8106 910 910 910 9555 50 Studenten Jonas Fichte Aristoxenos Carnap Theophrastos Feuerbach hören 05 505 516 559 509 50 50 Semester 18 1 10 8 6 PerslNr 00 00 00 005 006 007 50 509 05 505 516 559 50 60 Platon Aristoteles Wittgenstein Rhetikus Newton Spinoza Vorlesungen Titel SWS Grundzüge Ethik Erkenntnistheorie Mäeutik Logik Wissenschaftstheorie Bioethik Der Wiener Kreis Glaube und Wissen Die Kritiken Assistenten Fachgebiet Ideenlehre Syllogistik Sprachtheorie Planetenbewegung Keplersche Gesetze Gott und Natur gelesen Von 17 15 16 15 15 16 16 1 1 17 Boss 15 15 16 17 17 16 1
Anfragen über mehrere Relationen Welcher Professor liest "Mäeutik"? select, Titel from Professoren, Vorlesungen where PersNr = gelesenvon and Titel = `Mäeutik ; PersNr 15 16 17 Anfragen über mehrere Relationen Professoren Rang Raum 6 Russel 7 509 Vorlesungen Titel SWS Grundzüge Ethik Mäeutik gelesen Von 17 15 15, Titel( PersNr gelesenvon Titel ' Mäeutik' (Professoren Vorlesungen)) 60 Verknüpfung Die Kritiken 17 1 1 PersN r 15 Rang Raum Titel SWS gelesen Von 6 Grundzüge 17 15 6 Ethik 15 15 6 509 Mäeutik 15 16 Russel Grundzüge 17 16 Russel Ethik 15 Kanonische Übersetzung in die relationale Algebra Allgemein hat eine (ungeschachtelte) SQLAnfrage die Form: Übersetzung in die relationale Algebra: A1,..., An ( P (R 1 x... x R k )) A1,..., An 17 7 60 Die Kritiken 17 select A 1,..., A n P PersN r 15 Rang Auswahl Raum 6 509 Projektion Titel Mäeutik SWS gelesen Von 15 from R 1,..., R k where P; x x x R R k Titel Mäeutik 15 16 R 1 R
Anfragen über mehrere Relationen Welche Studenten hören welche Vorlesungen? select, Titel from Studenten, hören, Vorlesungen where Studenten.MatrNr = hören.matrnr and hören. = Vorlesungen.; Alternativ: select s., v.titel from Studenten s, hören h, Vorlesungen v where s. MatrNr = h. MatrNr and h. = v. 17 PersNr 15 16 17 1 1 16 17 Professoren Rang Raum MatrNr 6 00 Xenokrates Russel Kopernikus Popper Augustinus Curie C C C voraussetzen 10 5 09 6 Vorgänger Nachfolger 50 505 50 509 516 505 505 559 MatrNr PersNr Note 8106 16 1 50 7550 prüfen 60 15 17 7 50 610 680 7550 Schopenhauer 8106 910 9555 MatrNr 610 7550 7550 8106 8106 8106 8106 910 910 910 9555 50 Studenten Jonas Fichte Aristoxenos Carnap Theophrastos Feuerbach hören 05 505 516 559 509 50 50 Semester 18 1 10 8 6 PerslNr 00 00 00 005 006 007 50 509 05 505 516 559 50 60 Platon Aristoteles Wittgenstein Rhetikus Newton Spinoza Vorlesungen Titel SWS Grundzüge Ethik Erkenntnistheorie Mäeutik Logik Wissenschaftstheorie Bioethik Der Wiener Kreis Glaube und Wissen Die Kritiken Assistenten Fachgebiet Ideenlehre Syllogistik Sprachtheorie Planetenbewegung Keplersche Gesetze Gott und Natur gelesen Von 17 15 16 15 15 16 16 1 1 17 Boss 15 15 16 17 17 16 18 Mengenoperationen und geschachtelte Anfragen Mengenoperationen union, intersect, minus Existenzquantor exists ( select from Assistenten ) union ( select from Professoren); select p. from Professoren p where not exists ( select * from Vorlesungen v where v.gelesenvon = p.persnr ); 19 0
Existenzquantor exists select p. from Professoren p where not exists ( select * from Vorlesungen v where v.gelesenvon = p.persnr ); Korrelation Mengenvergleich Unkorrelierte Unteranfrage: meist effizienter, wird nur select einmal ausgewertet from Professoren where PersNr not in ( select gelesenvon from Vorlesungen ); 1 Der Vergleich mit "all" Kein vollwertiger Allquantor! select from Studenten where Semester >= all ( select Semester from Studenten); Aggregatfunktion und Gruppierung Aggregatfunktionen avg, max, min, count, sum select avg (Semester) from Studenten; select gelesenvon, sum (SWS) from Vorlesungen group by gelesenvon; select gelesenvon,, sum (SWS) from Vorlesungen, Professoren where gelesenvon = PersNr and Rang = group by gelesenvon, having avg (SWS) >= ;
PersNr 15 16 17 1 1 16 17 Professoren Rang Raum MatrNr 6 00 Xenokrates Russel Kopernikus Popper Augustinus Curie C C C voraussetzen 10 5 09 6 Vorgänger Nachfolger 50 505 50 509 516 505 505 559 MatrNr PersNr Note 8106 16 1 50 7550 prüfen 60 15 17 7 50 610 680 7550 Schopenhauer 8106 910 9555 MatrNr 610 7550 7550 8106 8106 8106 8106 910 910 910 9555 50 Studenten Jonas Fichte Aristoxenos Carnap Theophrastos Feuerbach hören 05 505 516 559 509 50 50 Semester 18 1 10 8 6 PerslNr 00 00 00 005 006 007 50 509 05 505 516 559 50 60 Platon Aristoteles Wittgenstein Rhetikus Newton Spinoza Vorlesungen Titel SWS Grundzüge Ethik Erkenntnistheorie Mäeutik Logik Wissenschaftstheorie Bioethik Der Wiener Kreis Glaube und Wissen Die Kritiken Assistenten Fachgebiet Ideenlehre Syllogistik Sprachtheorie Planetenbewegung Keplersche Gesetze Gott und Natur gelesen Von 17 15 16 15 15 16 16 1 1 17 Boss 15 15 16 17 17 16 5 Besonderheiten bei Aggregatoperationen SQL erzeugt pro Gruppe ein Ergebnistupel Deshalb müssen alle in der selectklausel aufgeführten Attribute außer den aggregierten auch in der group byklausel aufgeführt werden Nur so kann SQL sicherstellen, dass sich das Attribut nicht innerhalb der Gruppe ändert 6 Ausführen einer Anfrage mit group by Vorl Nr... 60 Titel Grundzüge Ethik... Die Kritiken... select gelesenvon,, sum (SWS) from Vorlesungen, Professoren where gelesenvon = PersNr and Rang = group by gelesenvon, having avg (SWS) >= ; Vorlesung x Professoren SWS gelesen Von 17 15... 17 PersNr 15 15... 17 wherebedingung... Rang Raum... 6 6... 7 7 50 509 05 505 516 60 Titel Grundzüge Ethik Erkenntnistheori e Mäeutik Logik Wissenschaftsthe orie Bioethik Die Kritiken SWS select gelesenvon,, sum (SWS) from Vorlesungen, Professoren where gelesenvon = PersNr and Rang = group by gelesenvon, having avg (SWS) >= ; gelesen Von 17 15 16 15 15 16 16 17 Gruppierung PersNr 17 15 16 15 15 16 16 17 Russel Russel Russel Rang Raum 7 6 6 6 7 8
Titel SWS gelesenvon PersNr Rang Ethik 15 15 509 Mäeutik 15 15 05 Logik 15 15 50 Erkenntnistheorie 16 16 Russel 505 Wissenschaftstheo. 16 16 Russel 516 Bioethik 16 16 Russel Grundzüge 17 17 60 Die Kritiken 17 17 havingbedingung VorlN r 509 05 60 Titel Ethik Mäeutik Logik Grundzüge Die Kritiken SWS gelesenvon PersNr 15 15 15 15 15 15 17 17 17 17 Rang Raum 6 6 6 7 7 Raum 6 6 6 7 7 Aggregation (sum) und Projektion 9 gelesenvon 15 17 select gelesenvon,, sum (SWS) from Vorlesungen, Professoren where gelesenvon = PersNr and Rang = group by gelesenvon, having avg (SWS) >= ; sum (SWS) 10 8 0 Geschachtelte Anfrage (Forts.) Unteranfrage in der whereklausel Welche Prüfungen sind besser als durchschnittlich verlaufen? select * from prüfen where Note < ( select avg (Note) from prüfen ); Geschachtelte Anfrage (Forts.) Unteranfrage in der selectklausel Für jedes Ergebnistupel wird die Unteranfrage ausgeführt Man beachte, dass die Unteranfrage korreliert ist (greift auf Attribute der umschließenden Anfrage zu) select PersNr,, ( select sum (SWS) as Lehrbelastung from Vorlesungen where gelesenvon=persnr ) from Professoren; 1
PersNr 15 16 17 1 1 16 17 Professoren Rang Raum MatrNr 6 00 Xenokrates Russel Kopernikus Popper Augustinus Curie C C C voraussetzen 10 5 09 6 Vorgänger Nachfolger 50 505 50 509 516 505 505 559 MatrNr PersNr Note 8106 16 1 50 7550 prüfen 60 15 17 7 50 610 680 7550 Schopenhauer 8106 910 9555 MatrNr 610 7550 7550 8106 8106 8106 8106 910 910 910 9555 50 Studenten Jonas Fichte Aristoxenos Carnap Theophrastos Feuerbach hören 05 505 516 559 509 50 50 Semester 18 1 10 8 6 PerslNr 00 00 00 005 006 007 50 509 05 505 516 559 50 60 Platon Aristoteles Wittgenstein Rhetikus Newton Spinoza Vorlesungen Titel SWS Grundzüge Ethik Erkenntnistheorie Mäeutik Logik Wissenschaftstheorie Bioethik Der Wiener Kreis Glaube und Wissen Die Kritiken Assistenten Fachgebiet Ideenlehre Syllogistik Sprachtheorie Planetenbewegung Keplersche Gesetze Gott und Natur gelesen Von 17 15 16 15 15 16 16 1 1 17 Boss 15 15 16 17 17 16 Unkorrelierte versus korrelierte Unteranfragen korrelierte Formulierung select s.* from Studenten s where exists (select p.* from Professoren where p.gebdatum > s.gebdatum); Äquivalente unkorrelierte Formulierung select s.* from Studenten s where s.gebdatum < (select max (p.gebdatum) from Professoren p); Vorteil: Unteranfrageergebnis kann materialisiert werden Unteranfrage braucht nur einmal ausgewertet zu werden Entschachtelung korrelierter Unteranfragen Forts. select a.* from Assistenten a where exists ( select p.* from Professoren p where a.boss = p.persnr and p.gebdatum>a.gebdatum); Entschachtelung durch Join select a.* from Assistenten a, Professoren p where a.boss=p.persnr and p.gebdatum > a.gebdatum; 5 6
Verwertung der Ergebnismenge einer Unteranfrage select tmp.matrnr, tmp., tmp.vorlanzahl from (select s.matrnr, s., count(*) as VorlAnzahl from Studenten s, hören h where s.matrnr=h.matrnr group by s.matrnr, s.) tmp where tmp.vorlanzahl > ; DecisionSupportAnfrage mit geschachtelten Unteranfragen select h., h.anzprovorl, g.gesamtanz, from h.anzprovorl/g.gesamtanz as Marktanteil ( select, count(*) as AnzProVorl from hören group by ) h, ( select count (*) as GesamtAnz from Studenten) g; MatrNr 8106 910 Carnap Theophrastos VorlAnzahl 7 8 Das Ergebnis der Anfrage Weitere Anfragen mit Unteranfragen ( select 05 AnzProVorl 1 GesamtAnz 8 8 Marktanteil.15.5 from Assistenten ) union ( select from Professoren ); 50...... 8....5... select from Professoren where PersNr not in ( select gelesenvon from Vorlesungen ); 9 0
select from Studenten where Semester > = all ( select Semester from Studenten ); Quantifizierte Anfragen in SQL Existenzquantor: exists select from Professoren where not exists ( select * from Vorlesungen where gelesen Von = PersNr ); 1 Allquantifizierung SQL9 hat keinen Allquantor Allquantifizierung muß also durch eine äquivalente Anfrage mit Existenzquantifizierung ausgedrückt werden Kalkülformulierung der Anfrage: Wer hat alle vierstündigen Vorlesungen gehört? {s s Studenten v Vorlesungen (v.sws= h hören (h.=v. h.matrnr=s.matrnr)) Elimination von und Dazu sind folgende Äquivalenzen anzuwenden Umformung des KalkülAusdrucks... Wir erhalten {s s Studenten ( v Vorlesungen ( (v.sws=) V h hören (h.=v. h.matrnr=s.matrnr)) Anwendung von DeMorgan ergibt schließlich: {s s Studenten ( v Vorlesungen (v.sws= ( h hören (h.=v. h.matrnr=s.matrnr)))) t R (P(t)) = ( t R( P(t))) R T = R V T
SQLUmsetzung folgt direkt: select s.* from Studenten s where not exists (select * from Vorlesungen v where v.sws = and not exists (select * from hören h where h. = v. and h.matrnr=s.matrnr ) ); Allquantifizierung durch countaggregation Allquantifizierung kann immer auch durch eine count Aggregation ausgedrückt werden Wir betrachten dazu eine etwas einfachere Anfrage, in der wir die (MatrNr der) Studenten ermitteln wollen, die alle Vorlesungen hören: select h.matrnr from hören h group by h.matrnr having count (*) = (select count (*) from Vorlesungen); 5 6 Herausforderung Wie formuliert man die komplexere Anfrage: Wer hat alle vierstündigen Vorlesungen gehört Grundidee besteht darin, vorher durch einen Join die Studenten/VorlesungsPaare einzuschränken und danach das Zählen durchzuführen Nullwerte unbekannter Wert wird vielleicht später nachgereicht Nullwerte können auch im Zuge der Anfrageauswertung entstehen (Bsp. äußere Joins) manchmal sehr überraschende Anfrageergebnisse, wenn Nullwerte vorkommen select count (*) from Studenten where Semester < 1 or Semester > =1 7 Wenn es Studenten gibt, deren SemesterAttribut den Wert null hat, werden diese nicht mitgezählt Der Grund liegt in folgenden Regeln für den Umgang mit null Werten begründet: 8
Auswertung bei NullWerten 1. In arithmetischen Ausdrücken werden Nullwerte propagiert, d.h. sobald ein Operand null ist, wird auch das Ergebnis null. Dementsprechend wird z.b. null + 1 zu null ausgewertetaber auch null * 0 wird zu null ausgewertet.. SQL hat eine dreiwertige Logik, die nicht nur true und false kennt, sondern auch einen dritten Wert unknown. Diesen Wert liefern Vergleichsoperationen zurück, wenn mindestens eines ihrer Argumente null ist. Beispielsweise wertet SQL das Prädikat (PersNr=...) immer zu unknown aus, wenn die PersNr des betreffenden Tupels den Wert null hat.. Logische Ausdrücke werden nach den folgenden Tabellen berechnet: Diese Berechnungsvorschriften sind recht intuitiv. Unknown or true wird z.b. zu true die Disjunktion ist mit dem true Wert des rechten Arguments immer erfüllt, unabhängig von der Belegung des linken Arguments. Analog ist unknown and false automatisch false keine Belegung des linken Arguments könnte die Konjunktion mehr erfüllen.. In einer wherebedingung werden nur Tupel weitergereicht, für die die Bedingung true ist. Insbesondere werden Tupel, für die die Bedingung zu unknown auswertet, nicht ins Ergebnis aufgenommen. 5. Bei einer Gruppierung wird null als ein eigenständiger Wert aufgefaßt und in eine eigene Gruppe eingeordnet. 9 50 not true false unknown unknown false true and true unknown true true unknown unknown unknown unknown false false false or true unknown true true true unknown true unknown false true unknown false false false false false true unknown false Spezielle Sprachkonstrukte ("syntaktischer Zucker") select * from Studenten where Semester > = 1 and Semester < = ; select * from Studenten where Semester between 1 and ; select * from Studenten where Semester in (1,,,); 51 5
select * from Studenten where like `T%eophrastos ; Das casekonstrukt select MatrNr, ( case when Note < 1.5 then sehr gut when Note <.5 then gut select distinct s. from Vorlesungen v, hören h, Studenten s where s.matrnr = h.matrnr and h. = v. and v.titel like `%thik% ; from prüfen; when Note <.5 then befriedigend when Note <.0 then ausreichend else nicht bestanden end) Die erste qualifizierende whenklausel wird ausgeführt 5 5 Vergleiche mit like Platzhalter "%" ; "_" "%" steht für beliebig viele (auch gar kein) Zeichen "_" steht für genau ein Zeichen select * from Studenten where like T%eophrastos ; select distinct from Vorlesungen v, hören h, Studenten s Joins in SQL9 cross join: Kreuzprodukt natural join: natürlicher Join Join oder inner join: ThetaJoin left, right oder full outer join: äußerer Join union join: VereinigungsJoin (wird hier nicht vorgestellt) select * from R 1, R where = R 1.A = R.B; select * from R 1 join R on R 1.A = R.B; where s.matrnr = h.matrnr and h. = v. and v.titel = %thik% ; 55 56
Äußere Joins select p.persnr, p., f.persnr, f.note, f.matrnr, s.matrnr, s. from Professoren p left outer join (prüfen f left outer join Studenten s on f.matrnr= s.matrnr) on p.persnr=f.persnr; PersNr 16 15 17 16 p. Russel Curie f.persnr 16 15 17 f.note 1 f.matrnr 8106 50 7550 s.matrnr 8106 50 7550 s. Carnap Jonas Äußere Joins select p.persnr, p., f.persnr, f.note, f.matrnr, s.matrnr, s. from Professoren p right outer join (prüfen f right outer join Studenten s on f.matrnr= s.matrnr) on p.persnr=f.persnr; PersNr p. f.persnr f.note f.matrnr s.matrnr s. 16 Russel 16 1 8106 8106 Carnap 15 17 15 17 50 7550 50 7550 610 Jonas Schopenhauer Schopenhauer Fichte 57 58 Äußere Joins select p.persnr, p., f.persnr, f.note, f.matrnr, s.matrnr, s. from Professoren p full outer join (prüfen f full outer join Studenten s on f.matrnr= s.matrnr) on p.persnr=f.persnr; p.persnr p. 16 Russel 15 17 16 Curie f.persnr 16 15 17 f.note 1 f.matrnr 8106 50 7550 s.matrnr 8106 50 7550 610 s. Carnap Jonas Schopenhauer Fichte 59 60
Rekursion select Vorgänger from voraussetzen, Vorlesungen where Nachfolger= and Titel= `Der Wiener Kreis Der Wiener Kreis Wissenschaftstheorie Bioethik Erkenntnistheorie Ethik Mäeutik Grundzüge 61 6 Rekursion select v1.vorgänger from voraussetzen v1, voraussetzen v, Vorlesungen v where v1.nachfolger= v.vorgänger and v.nachfolger= v. and v.titel=`der Wiener Kreis 6 Vorgänger des Wiener Kreises der Tiefe n select v1.vorgänger from voraussetzen v1 voraussetzen vn_minus_1 voraussetzen vn, Vorlesungen v where v1.nachfolger= v.vorgänger and vn_minus_1.nachfolger= vn.vorgänger and vn.nachfolger = v. and v.titel= `Der Wiener Kreis 6
Transitive Hülle Der Wiener Kreis trans A,B (R)= {(a,b) k IN ( t 1,..., t k R ( t 1.A= t.b Wissenschaftstheorie Bioethik t k1.a= t k.b t 1.A= a t k.b= b)) Erkenntnistheorie Ethik Mäeutik Grundzüge Die transitive Hülle ist mit relationaler Algebra (und daher auch mit relationalem Kalkül) nicht zu realisieren. Datalog 65 66 Die connect byklausel select Titel from Vorlesungen where in (select Vorgänger from voraussetzen Grundzüge Ethik Erkenntnistheorie Wissenschaftstheorie connect by Nachfolger=prior Vorgänger start with Nachfolger= (select from Vorlesungen where Titel= `Der Wiener Kreis )); 67 68
Rekursion in DB/SQL99: gleiche Anfrage with TransVorl (Vorg, Nachf) as (select Vorgänger, Nachfolger from voraussetzen union all select t.vorg, v.nachfolger from TransVorl t, voraussetzen v where t.nachf= v.vorgänger) zuerst wird eine temporäre Sicht TransVorl mit der with Klausel angelegt Diese Sicht TransVorl ist rekursiv definiert, da sie selbst in der Definition vorkommt Aus dieser Sicht werden dann die gewünschten Tupel extrahiert select Titel from Vorlesungen where in Ergebnis ist natürlich wie gehabt (select Vorg from TransVorl where Nachf in (select from Vorlesungen where Titel= `Der Wiener Kreis ) ) 69 70 Veränderung am Datenbestand Einfügen von Tupeln MatrNr Studenten Semester insert into hören select MatrNr, from Studenten, Vorlesungen 910 9555 811 Theophrastos Feuerbach Archimedes where Titel= `Logik ; insert into Studenten (MatrNr, ) values (811, `Archimedes ); 71 7
Veränderungen am Datenbestand Zweistufiges Vorgehen bei Änderungen Löschen von Tupeln delete Studenten where Semester > 1; Verändern von Tupeln update Studenten set Semester= Semester + 1; 1. die Kandidaten für die Änderung werden ermittelt und ''markiert''. die Änderung wird an den in Schritt 1. ermittelten Kandidaten durchgeführt Anderenfalls könnte die Änderungsoperation von der Reihenfolge der Tupel abhängen, wie folgendes Beispiel zeigt: delete from voraussetzen where Vorgänger in (select Nachfolger from voraussetzen); 7 7 Vorgänger vorausssetzen Nachfolger Sichten... 50 509 für den Datenschutz 516 50 505 505 505 59 Ohne einen Markierungsschritt hängt das Ergebnis dieser Anfrage von der Reihenfolge der Tupel in der Relation ab. Eine Abarbeitung in der Reihenfolge der Beispielausprägung würde das letzte Tupel (505, 59) fälschlicherweise erhalten, da vorher bereits alle Tupel mit 505 als Nachfolger entfernt wurden. 75 create view prüfensicht as select MatrNr,, PersNr from prüfen 76
Sichten... für die Vereinfachung von Anfragen create view StudProf (Sname, Semester, Titel, Pname) as select s., s.semester, v.titel, p. from Studenten s, hören h, Vorlesungen v, Professoren p where s.matr.nr=h.matrnr and h.=v. and v.gelesenvon = p.persnr select distinct Semester from StudProf where P=` ; Sichten zur Modellierung von Generalisierung create table Angestellte (PersNr integer not null, varchar (0) not null); create table ProfDaten (PersNr integer not null, Rang character(), Raum integer); create table AssiDaten (PersNr integer not null, Fachgebiet varchar(0), Boss integer); 77 78 create view Professoren as select * from Angestellte a, ProfDaten d where a.persnr=d.persnr; create view Assistenten as select * from Angestellte a, AssiDaten d where a.persnr=d.persnr; Untertypen als Sicht create table Professoren (PersNr integer not null, varchar (0) not null, Rang character (), Raum integer); create table Assistenten (PersNr integer not null, varchar (0) not null, Fachgebiet varchar (0), Boss integer); create table AndereAngestellte (PersNr integer not null, varchar (0) not null); 79 80
create view Angestellte as (select PersNr, from Professoren) union (select PersNr, from Assistenten) union (select* from AndereAngestellte); Obertypen als Sicht Sichten zur Gewährleistung von Datenunabhängigkeit logische Datenunabhängigkeit Benutzer Sicht 1 Sicht Sicht Relation 1 Relation Relation physische Datenunabhängigkeit 81 8 Änderbarkeit von Sichten Beispiele für nicht änderbare Sichten create view WieHartAlsPrüfer (PersNr, Durchschnittsnote) as select PersNr, avg(note) from prüfen group by PersNr; create view VorlesungenSicht as select Titel, SWS, from Vorlesungen, Professoren where gelesen Von=PersNr; insert into VorlesungenSicht values (`Nihilismus,, `Nobody ); Änderbarkeit von Sichten in SQL nur eine Basisrelation Schlüssel muss vorhanden sein keine Aggregatfunktionen, Gruppierung und Duplikateliminierung alle Sichten theoretisch änderbare Sichten in SQL änderbare Sichten 8 8
Embedded SQL #include <stdio.h> /*Kommunikationsvariablen deklarieren */ exec sql begin declare section; varchar user_passwd[0]; int exmatrnr; exec sql end declare section; exec sql include SQLCA; main() { printf("/password:"); user_passwd.len=strlen(user_passwd.arr); exec sql wheneversqlerror goto error; exec sql connect :user_passwd; while (1) { printf("matrikelnummer (0 zum beenden):"); scanf("%d", &ecmatrnr); if (!exmatrnr) break; exec sql delete from Studenten where MatrNr= :exmatrnr; exec sql commit work release; exit(0); scanf("%", user_passwd.arr); 85 86 error: exec sql whenever sqlerror continue; exec sql rollback work release; printf("fehler aufgetreten!\n"); exit(1); Anfragen in Anwendungsprogrammen genau ein Tupel im Ergebnis exec sql select avg (Semester) into :avgsem from Studenten; 87 88
Anfragen in Anwendungsprogrammen mehrere Tupelim Ergebnis Satzorientierte Programmiersprache. Tupel sequentiell verarbeiten CursorSchnittstelle in SQL 1. exec sql declare cprofs cursor for select, Raum from Professoren where Rang= ;. exec sql open cprofs; 1. Anfrage. Cursor/Iterator schließen. exec sql fetch cprofs into :pname, :praum;. exec sql close cprofs; mengenorientiertes DBMS. Anfrage auswerten, Ergebnistupel im Cursor/Iterator/ ResultSet bereitstellen 89 90 JDBC: Java Database Connectivity Standardisierte Schnittstelle zur Anbindung von relationalen Datenbanken an Java Wird heute fast immer für die Anbindung von Datenbanken an das Internet/Web verwendet Java Servlets als dynamische Erweiterung von Webservern Java Server Pages (JSP): HTMLSeiten mit eingebetteten Java Programmfragmenten Zugriff auf Datenbanken via JDBC JDBC Treiber 1 standardisierte Schnittstelle JavaProgramm mit Zugriff auf zwei unterschiedliche (heterogene) Datenbanken JDBC Treiber Datenbank 1 DBMSspezifische Implementierung Datenbank 91 9
WebAnbindung von Datenbanken via Servlets/JDBC Browser Internet Webserver Vorlesungs Verzeichnis.html ServletEngine Servlet VrlVrz Servlet VrlVrz Servlet VrlVrz JDBC (Java Database Conn.) Datenbank 9 JDBCBeispielprogramm import java.sql.*; import java.io.*; public class ResultSetExample { public static void main(string[] argv) { Statement sql_stmt = null; Connection conn = null; try { Class.for("oracle.jdbc.driver.OracleDriver"); conn = DriverManager.getConnection ("jdbc:oracle:oci8:@lsinterndb", "nobody", "Passwort"); sql_stmt = conn.createstatement(); catch (Exception e) { System.err.println("Folgender Fehler ist aufgetreten: " + e); System.exit(1); 9 try { ResultSet rset = sql_stmt.executequery( "select avg(semester) from Studenten"); rset.next(); // eigentlich zu prüfen, ob Ergebnis leer System.out.println("Durchschnittsalter: " + rset.getdouble(1)); rset.close(); catch(sqlexception se) { System.out.println("Error: " + se); 95 try { ResultSet rset = sql_stmt.executequery( "select, Raum from Professoren where Rang = ''"); System.out.println("Professoren:"); while(rset.next()) { System.out.println(rset.getString("") + " " + rset.getint("raum")); rset.close(); catch(sqlexception se) {System.out.println("Error: " + se); try { sql_stmt.close(); conn.close(); catch (SQLException e) { System.out.println("Fehler beim Schliessen der DB: " + e); 96
Vorübersetzung von SQLAusdrücken PreparedStatement sql_exmatrikuliere = conn.preparestatement ("delete from Studenten where MatrNr =?"); int VomBenutzerEingeleseneMatrNr; // zu löschende MatrNr einlesen sql_exmatrikuliere.setint(1,vombenutzereingelesenematrnr); int rows = sql_exmatrikuliere.executeupdate(); if (rows == 1) System.out.println("StudentIn gelöscht."); else System.out.println("Kein/e StudentIn mit dieser MatrNr."); SQL/JBeispielprogramm import java.io.*; import java.sql.*; import sqlj.runtime.*; import sqlj.runtime.ref.*; #sql iterator StudentenItr (String, int Semester); public class SQLJExmp { public static void main(string[] argv) { try { Class.for("COM.ibm.db.jdbc.app.DBDriver"); Connection con = DriverManager.getConnection ("jdbc:db:uni"); con.setautocommit(false); DefaultContext ctx = new DefaultContext(con); DefaultContext.setDefaultContext(ctx); 97 98 StudentenItr Methusaleme; #sql Methusaleme = { select s., s.semester from Studenten s where s.semester > 1 ; while (Methusaleme.next()) { System.out.println(Methusaleme.() + ":" + Methusaleme.Semester()); Methusaleme.close(); #sql { delete from Studenten where Semester > 1 ; #sql { commit ; catch (SQLException e) { System.out.println("Fehler mit der DBVerbindung: " + e); catch (Exception e) { System.err.println("Folgender Fehler ist aufgetreten: " + e); System.exit(1); 99 Query by Example Vorlesungen Analog Join in QBE Titel p._t SWS > {[t] v, s, r ([v,t,s,r] Vorlesungen s > ) Vorlesungen Professoren PersNr _x Titel Mäeutik p._n SWS Rang gelesen Von gelesen Von _x Raum 100
Die Condition Box Studenten MatrNr Semester _s _a Studenten MatrNr Semester _t _b Betreuen potentieller Tutor Betreuter p. _s _t Aggregatfunktion und Gruppierung conditions _a > _b Updates in QBE: ist von uns gegangen Professoren d. Vorlesungen d. PersNr _x _y Titel Rang SWS Raum gelesen Von _x Vorlesungen Titel SWS p.sum.all._x gelesen Von p.g. hören d. _y MatrNr conditions avg.all._x> 101 10