Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

 standardisierte -Datendefinitionssprache (DDL) -Datenmanipulationssprache (DML) -Anfragesprache (Query)  derzeit aktueller Standard ist SQL 3  objektrelationale.

Ähnliche Präsentationen


Präsentation zum Thema: " standardisierte -Datendefinitionssprache (DDL) -Datenmanipulationssprache (DML) -Anfragesprache (Query)  derzeit aktueller Standard ist SQL 3  objektrelationale."—  Präsentation transkript:

1  standardisierte -Datendefinitionssprache (DDL) -Datenmanipulationssprache (DML) -Anfragesprache (Query)  derzeit aktueller Standard ist SQL 3  objektrelationale Erweiterungen  Etablierter Vorgänger ist SQL 92 (kurz SQL 2) SQL

2 Studenten Assistenten MatrNr PersNr Semester Name Fachgebiet Note hören prüfen arbeitenFür Professoren Vorlesungen lesen voraussetzen SWS VorlNr Titel Raum Rang PersNr Nach- folger Vorgänger Name Uni-Schema 1 N 1 1 N N N M M MN

3 Professoren PersNrNameRangRaum 2125SokratesC4226 2126RusselC4232 2127KopernikusC3310 2133PopperC352 2134AugustinusC3309 2136CurieC436 2137KantC47 Studenten MatrNrNameSemester 24002Xenokrates18 25403Jonas12 26120Fichte10 26830Aristoxenos8 27550Schopenhauer6 28106Carnap3 29120Theophrastos2 29555Feuerbach2 Vorlesungen VorlNrTitelSWSgelesen Von 5001Grundzüge42137 5041Ethik42125 5043Erkenntnistheorie32126 5049Mäeutik22125 4052Logik42125 5052Wissenschaftstheorie32126 5216Bioethik22126 5259Der Wiener Kreis22133 5022Glaube und Wissen22134 4630Die 3 Kritiken42137 voraussetzen VorgängerNachfolger 50015041 50015043 50015049 50415216 50435052 50415052 5259 hören MatrNrVorlNr 261205001 275505001 275504052 281065041 281065052 281065216 281065259 291205001 291205041 291205049 295555022 254035022 Assistenten PerslNrNameFachgebietBoss 3002PlatonIdeenlehre2125 3003AristotelesSyllogistik2125 3004WittgensteinSprachtheorie2126 3005RhetikusPlanetenbewegung2127 3006NewtonKeplersche Gesetze2127 3007SpinozaGott und Natur2126 prüfen MatrNrVorlNrPersNrNote 28106500121261 25403504121252 27550463021372

4 (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 String-Attribute  date für Datumsangaben Anlegen von Tabelle  create table Professoren (PersNrinteger not null, Namevarchar (30) not null Rangcharacter (2) default „C3“);

5 DDL (ctd.) Löschen einer Tabelle  drop table Professoren; Verändern einer Tabelle  alter table Professoren add column(alter integer); Verwaltung von Indexen (Performancetuning)  create index myIndex on Professoren(name, alter);  drop index myIndex;

6 Veränderung am Datenbestand Einfügen von Tupeln insert into hören select MatrNr, VorlNr from Studenten, Vorlesungen where Titel= `Logik‘ ; insert into Studenten (MatrNr, Name) values (28121, `Archimedes‘);

7 Studenten MatrNrNameSemester 29120Theophrastos2 29555Feuerbach2 28121Archimedes- Null-Wert

8 Sequence Types (Automatische Hochzählen)  create sequence PersNr_seq increment by 1 start with 1  insert into Professoren(PersNr, Name) values(PerNr_seq.nextval, „Roscoe“)  sehr unterschiedliche Lösungen der Hersteller  z.B. AUTO-INCREMENT Option in MySQL  standardisiert in SQL 2003

9 Veränderungen am Datenbestand Löschen von Tupeln delete Studenten where Semester > 13; Verändern von Tupeln update Studenten set Semester= Semester + 1;

10 Einfache SQL-Anfrage PersNrName 2125Sokrates 2126Russel 2136Curie 2137Kant selectPersNr, Name fromProfessoren whereRang= ´C4´;

11 Einfache SQL-Anfragen Sortierung select PersNr, Name, Rang fromProfessoren order by Rang desc, Name asc; PersNrNameRang 2136CurieC4 2137KantC4 2126RusselC4 2125SokratesC4 2134AugustinusC3 2127KopernikusC3 2133PopperC3

12 select distinct Rang from Professoren Rang C3 C4 Duplikateliminierung

13 Professoren PersNrNameRangRaum 2125SokratesC4226 2126RusselC4232 2127KopernikusC3310 2133PopperC352 2134AugustinusC3309 2136CurieC436 2137KantC47 Studenten MatrNrNameSemester 24002Xenokrates18 25403Jonas12 26120Fichte10 26830Aristoxenos8 27550Schopenhauer6 28106Carnap3 29120Theophrastos2 29555Feuerbach2 Vorlesungen VorlNrTitelSWSgelesen Von 5001Grundzüge42137 5041Ethik42125 5043Erkenntnistheorie32126 5049Mäeutik22125 4052Logik42125 5052Wissenschaftstheorie32126 5216Bioethik22126 5259Der Wiener Kreis22133 5022Glaube und Wissen22134 4630Die 3 Kritiken42137 voraussetzen VorgängerNachfolger 50015041 50015043 50015049 50415216 50435052 50415052 5259 hören MatrNrVorlNr 261205001 275505001 275504052 281065041 281065052 281065216 281065259 291205001 291205041 291205049 295555022 254035022 Assistenten PerslNrNameFachgebietBoss 3002PlatonIdeenlehre2125 3003AristotelesSyllogistik2125 3004WittgensteinSprachtheorie2126 3005RhetikusPlanetenbewegung2127 3006NewtonKeplersche Gesetze2127 3007SpinozaGott und Natur2126 prüfen MatrNrVorlNrPersNrNote 28106500121261 25403504121252 27550463021372

14 Anfragen über mehrere Relationen Welcher Professor liest "Mäeutik"? select Name, Titel from Professoren, Vorlesungen where PersNr = gelesenVon and Titel = `Mäeutik‘ ;

15 Anfragen über mehrere Relationen RaumRangNamePersNr 226 232 7 C4 Sokrates Russel Kant 2125 2126 2137 Professoren gelesen VonSWSTitelVorlNr 21374Grundzüge5001 21374Die 3 Kritiken4630 21252Mäeutik5049 21254Ethik5041 Vorlesungen Verknüpfung 

16 4630 5041 5001 5049 5041 5001 VorlNr Die 3 Kritiken Ethik Grundzüge Mäeutik Ethik Grundzüge Titel 4 4 4 2 4 4 SWS 2137 2125 2137 2125 2137 gelesen Von 7 232 226 Raum C4Kant2137 RangNamePersN r C4Sokrates2125 C4Russel2126 C4Russel2126 C4Sokrates2125 C4Sokrates1225 PersNrNameRangRaumVorlNrTitelSWSgelesen Von 2125SokratesC42265049Mäeutik22125 NameTitel SokratesMäeutik Auswahl Projektion

17 Kanonische Übersetzung in die relationale Algebra Allgemein hat eine (ungeschachtelte) SQL- Anfrage die Form: select A 1,..., A n from R 1,..., R k where P;  A1,..., An (  P (R 1 x... x R k ))  A1,..., An PP x x RkRk x R3R3 R2R2 R1R1 Übersetzung in die relationale Algebra:

18 Anfragen über mehrere Relationen Welche Studenten hören welche Vorlesungen? select Name, Titel from Studenten, hören, Vorlesungen where Studenten.MatrNr = hören.MatrNr and hören.VorlNr = Vorlesungen.VorlNr; Alternativ: select s.Name, v.Titel from Studenten s, hören h, Vorlesungen v where s. MatrNr = h. MatrNr and h.VorlNr = v.VorlNr

19 Professoren PersNrNameRangRaum 2125SokratesC4226 2126RusselC4232 2127KopernikusC3310 2133PopperC352 2134AugustinusC3309 2136CurieC436 2137KantC47 Studenten MatrNrNameSemester 24002Xenokrates18 25403Jonas12 26120Fichte10 26830Aristoxenos8 27550Schopenhauer6 28106Carnap3 29120Theophrastos2 29555Feuerbach2 Vorlesungen VorlNrTitelSWSgelesen Von 5001Grundzüge42137 5041Ethik42125 5043Erkenntnistheorie32126 5049Mäeutik22125 4052Logik42125 5052Wissenschaftstheorie32126 5216Bioethik22126 5259Der Wiener Kreis22133 5022Glaube und Wissen22134 4630Die 3 Kritiken42137 voraussetzen VorgängerNachfolger 50015041 50015043 50015049 50415216 50435052 50415052 5259 hören MatrNrVorlNr 261205001 275505001 275504052 281065041 281065052 281065216 281065259 291205001 291205041 291205049 295555022 254035022 Assistenten PerslNrNameFachgebietBoss 3002PlatonIdeenlehre2125 3003AristotelesSyllogistik2125 3004WittgensteinSprachtheorie2126 3005RhetikusPlanetenbewegung2127 3006NewtonKeplersche Gesetze2127 3007SpinozaGott und Natur2126 prüfen MatrNrVorlNrPersNrNote 28106500121261 25403504121252 27550463021372

20 Mengenoperationen und geschachtelte Anfragen Mengenoperationen union, intersect, minus ( select Name from Assistenten ) union ( select Name from Professoren);

21 Existenzquantor exists select p.Name from Professoren p where not exists ( select * from Vorlesungen v where v.gelesenVon = p.PersNr );

22 Existenzquantor exists select p.Name from Professoren p where not exists ( select * from Vorlesungen v where v.gelesenVon = p.PersNr ); Korrelation

23 Mengenvergleich select Name from Professoren where PersNr not in ( select gelesenVon from Vorlesungen ); Unkorrelierte Unteranfrage: meist effizienter, wird nur einmal ausgewertet

24 Der Vergleich mit "all" Kein vollwertiger Allquantor! select Name from Studenten where Semester >= all ( select Semester from Studenten);

25 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, Name, sum (SWS) from Vorlesungen, Professoren where gelesenVon = PersNr and Rang = ´C4´ group by gelesenVon, Name having avg (SWS) >= 3;

26 Professoren PersNrNameRangRaum 2125SokratesC4226 2126RusselC4232 2127KopernikusC3310 2133PopperC352 2134AugustinusC3309 2136CurieC436 2137KantC47 Studenten MatrNrNameSemester 24002Xenokrates18 25403Jonas12 26120Fichte10 26830Aristoxenos8 27550Schopenhauer6 28106Carnap3 29120Theophrastos2 29555Feuerbach2 Vorlesungen VorlNrTitelSWSgelesen Von 5001Grundzüge42137 5041Ethik42125 5043Erkenntnistheorie32126 5049Mäeutik22125 4052Logik42125 5052Wissenschaftstheorie32126 5216Bioethik22126 5259Der Wiener Kreis22133 5022Glaube und Wissen22134 4630Die 3 Kritiken42137 voraussetzen VorgängerNachfolger 50015041 50015043 50015049 50415216 50435052 50415052 5259 hören MatrNrVorlNr 261205001 275505001 275504052 281065041 281065052 281065216 281065259 291205001 291205041 291205049 295555022 254035022 Assistenten PerslNrNameFachgebietBoss 3002PlatonIdeenlehre2125 3003AristotelesSyllogistik2125 3004WittgensteinSprachtheorie2126 3005RhetikusPlanetenbewegung2127 3006NewtonKeplersche Gesetze2127 3007SpinozaGott und Natur2126 prüfen MatrNrVorlNrPersNrNote 28106500121261 25403504121252 27550463021372

27 Besonderheiten bei Aggregatoperationen  SQL erzeugt pro Gruppe ein Ergebnistupel  Deshalb müssen alle in der select-Klausel aufgeführten Attribute - außer den aggregierten – auch in der group by-Klausel aufgeführt werden  Nur so kann SQL sicherstellen, dass sich das Attribut nicht innerhalb der Gruppe ändert

28 Ausführen einer Anfrage mit group by Vorlesung x Professoren VorlNrTitelSWSgelesen Von PersNrNameRangRaum 5001Grundzüge421372125SokratesC4226 5041Ethik42125 SokratesC4226... 4630Die 3 Kritiken 42137 KantC47 where-Bedingung

29 VorlNrTitelSWSgelesen Von PersNrNameRangRaum 5001Grundzüge42137 KantC47 5041Ethik42125 SokratesC4226 5043Erkenntnis- theorie 32126 RusselC4232 5049Mäeutik22125 SokratesC4226 4052Logik42125 SokratesC4226 5052Wissenschafts- theorie 32126 RusselC4232 5216Bioethik22126 RusselC4232 4630Die 3 Kritiken42137 KantC47 Gruppierung

30 having-Bedingung 232 226 7 7 Raum C4Russel2126 3Erkenntnistheorie5043 C4Russel2126 3Wissenschaftstheo.5052 C4Russel2126 2Bioethik5216 C4Sokrates2125 4Logik4052 C4Sokrates2125 4Ethik5041 C4Sokrates2125 2Mäeutik5049 C4Kant2137 4Die 3 Kritiken4630 C4 Rang 4 SWS Grundzüge TitelNamePersNrgelesenVonVorlNr Kant2137 5001 RaumRangNamePersNrgelesenVonSWSTitelVorlN r 7777 C4 Kant 2137 4444 Grundzüge Die 3 Kritiken 5001 4630 C4 226 424424 Ethik Mäeutik Logik Sokrates 2125 5041 5049 4052 Aggregation (sum) und Projektion

31 gelesenVonNamesum (SWS) 2125Sokrates10 2137Kant8

32 Geschachtelte Anfrage (Forts.)  Unteranfrage in der select-Klausel  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, Name, ( select sum (SWS) as Lehrbelastung from Vorlesungen where gelesenVon=PersNr ) from Professoren;

33 Professoren PersNrNameRangRaum 2125SokratesC4226 2126RusselC4232 2127KopernikusC3310 2133PopperC352 2134AugustinusC3309 2136CurieC436 2137KantC47 Studenten MatrNrNameSemester 24002Xenokrates18 25403Jonas12 26120Fichte10 26830Aristoxenos8 27550Schopenhauer6 28106Carnap3 29120Theophrastos2 29555Feuerbach2 Vorlesungen VorlNrTitelSWSgelesen Von 5001Grundzüge42137 5041Ethik42125 5043Erkenntnistheorie32126 5049Mäeutik22125 4052Logik42125 5052Wissenschaftstheorie32126 5216Bioethik22126 5259Der Wiener Kreis22133 5022Glaube und Wissen22134 4630Die 3 Kritiken42137 voraussetzen VorgängerNachfolger 50015041 50015043 50015049 50415216 50435052 50415052 5259 hören MatrNrVorlNr 261205001 275505001 275504052 281065041 281065052 281065216 281065259 291205001 291205041 291205049 295555022 254035022 Assistenten PerslNrNameFachgebietBoss 3002PlatonIdeenlehre2125 3003AristotelesSyllogistik2125 3004WittgensteinSprachtheorie2126 3005RhetikusPlanetenbewegung2127 3006NewtonKeplersche Gesetze2127 3007SpinozaGott und Natur2126 prüfen MatrNrVorlNrPersNrNote 28106500121261 25403504121252 27550463021372

34 Unkorrelierte versus korrelierte Unteranfragen  korrelierte Formulierung select s.* from Studenten s where exists (select p.* from Professoren where p.GebDatum > s.GebDatum);

35  Ä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

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

37 Verwertung der Ergebnismenge einer Unteranfrage select tmp.MatrNr, tmp.Name, tmp.VorlAnzahl from (select s.MatrNr, s.Name, count(*) as VorlAnzahl from Studenten s, hören h where s.MatrNr=h.MatrNr group by s.MatrNr, s.Name) tmp where tmp.VorlAnzahl > 2; MatrNrNameVorlAnzahl 28106Carnap4 29120Theophrastos3

38 Decision-Support-Anfragen mit geschachtelten Unteranfragen select h.VorlNr, h.AnzProVorl, g.GesamtAnz, h.AnzProVorl/g.GesamtAnz as Marktanteil from ( select VorlNr, count(*) as AnzProVorl from hören group by VorlNr ) h, ( select count (*) as GesamtAnz from Studenten) g;

39 VorlNrAnzProVorlGesamtAnzMarktanteil 405218.125 500148.5 502228.25... Das Ergebnis der Anfrage

40 Allquantifizierung  SQL hat keinen Allquantor  Allquantifizierung muss 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=4   h  hören (h.VorlNr=v.VorlNr  h.MatrNr=s.MatrNr))}  Elimination von  und   Dazu sind folgende Äquivalenzen anzuwenden  t  R (P(t)) = ¬(  t  R(¬ P(t))) R  T = ¬R V T

41 Umformung des Kalkül-Ausdrucks...  Wir erhalten {s | s  Studenten  ¬ (  v  Vorlesungen ¬(¬(v.SWS=4) V  h  hören (h.VorlNr=v.VorlNr  h.MatrNr=s.MatrNr))}  Anwendung von DeMorgan ergibt schließlich: {s | s  Studenten  ¬ (  v  Vorlesungen (v.SWS=4  ¬ (  h  hören (h.VorlNr=v.VorlNr  h.MatrNr=s.MatrNr))))}

42  SQL-Umsetzung folgt direkt: select s.* from Studenten s where not exists (select * from Vorlesungen v where v.SWS = 4 and not exists (select * from hören h where h.VorlNr = v.VorlNr and h.MatrNr=s.MatrNr ) );

43 Allquantifizierung durch count-Aggregation  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);

44 Herausforderung  Wie formuliert man die komplexere Anfrage: Wer hat alle vierstündigen Vorlesungen gehört  Grundidee besteht darin, vorher durch einen Join die Studenten/Vorlesungs-Paare einzuschränken und danach das Zählen durchzuführen

45 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: select count (*) from Studenten where Semester =13  Wenn es Studenten gibt, deren Semester-Attribut den Wert null hat, werden diese nicht mitgezählt  Der Grund liegt in folgenden Regeln für den Umgang mit null-Werten begründet:

46 Auswertung bei Null-Werten 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 ausgewertet- aber auch null * 0 wird zu null ausgewertet. 2.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. 3.Logische Ausdrücke werden nach den folgenden Tabellen berechnet:

47 not truefalse unknown falsetrue andtrueunknownfalse true unknownfalse unknown false ortrueunknownfalse true unknowntrueunknown falsetrueunknownfalse

48 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. 4. In einer where-Bedingung 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.

49 Spezielle Sprachkonstrukte ("syntaktischer Zucker") select * from Studenten where Semester > = 1 and Semester < = 6; select * from Studenten where Semester between 1 and 6; select * from Studenten where Semester in (2,4,6);

50 Das case-Konstrukt  Die erste qualifizierende when-Klausel wird ausgeführt select MatrNr, ( case when Note >= 5.5 then ´sehr gut´ when Note >= 5.0 then ´gut´ when Note >= 4.5 then ´befriedigend´ when Note >= 4.0 then ´ausreichend´ else ´nicht bestanden´end) from prüfen;

51 Vergleiche mit like Platzhalter "%" ; "_" bei Vergleichen mit like  "%" steht für beliebig viele (auch gar kein) Zeichen  "_" steht für genau ein Zeichen  Vorsicht: Bei Vergleichen mit = werden Platzhalter als normale Zeichen interpretiert! select * from Studenten where Name like ´T%eophrastos´; select distinct Name from Vorlesungen v, hören h, Studenten s where s.MatrNr = h.MatrNr and h.VorlNr = v.VorlNr and v.Titel like ´%thik%´;

52 Joins in SQL-92  cross join: Kreuzprodukt  natural join: natürlicher Join  Join oder inner join: Theta-Join  left, right oder full outer join: äußerer Join  union join: Vereinigungs-Join (wird hier nicht vorgestellt) select * from R 1, R 2 where = R 1.A = R 2.B; select * from R 1 join R 2 on R 1.A = R 2.B;

53 Äußere Joins select p.PersNr, p.Name, f.PersNr, f.Note, f.MatrNr, s.MatrNr, s.Name from Professoren p left outer join (prüfen f left outer join Studenten s on f.MatrNr= s.MatrNr) on p.PersNr=f.PersNr; PersNrp.Namef.PersNrf.Notef.MatrNrs.MatrNrs.Name 2126Russel2126128106 Carnap 2125Sokrates2125225403 Jonas 2137Kant2137227550 Schopen- hauer 2136Curie-----

54 Äußere Joins select p.PersNr, p.Name, f.PersNr, f.Note, f.MatrNr, s.MatrNr, s.Name from Professoren p right outer join (prüfen f right outer join Studenten s on f.MatrNr= s.MatrNr) on p.PersNr=f.PersNr; PersNrp.Namef.PersNrf.Notef.MatrNrs.MatrNrs.Name 2126Russel2126128106 Carnap 2125Sokrates2125225403 Jonas 2137Kant2137227550 Schopen- hauer -----26120Fichte

55 Äußere Joins select p.PersNr, p.Name, f.PersNr, f.Note, f.MatrNr, s.MatrNr, s.Name from Professoren p full outer join (prüfen f full outer join Studenten s on f.MatrNr= s.MatrNr) on p.PersNr=f.PersNr;

56 p.PersNrp.Namef.PersNrf.Notef.MatrNrs.MatrNrs.Name 2126Russel2126128106 Carnap 2125Sokrates2125225403 Jonas 2137Kant2137227550 Schopen- hauer -----26120Fichte 2136Curie-----

57 Rekursion select Vorgänger from voraussetzen, Vorlesungen where Nachfolger= VorlNr and Titel= `Der Wiener Kreis´

58 Der Wiener Kreis WissenschaftstheorieBioethik ErkenntnistheorieEthikMäeutik Grundzüge

59 Rekursion select v1. Vorgänger from voraussetzen v1, voraussetzen v2, Vorlesungen v where v1.Nachfolger= v2.Vorgänger and v2.Nachfolger= v.VorlNr and v.Titel=`Der Wiener Kreis´

60 Rekursion select v1. Vorgänger from voraussetzen v1, voraussetzen v2, Vorlesungen v where v1.Nachfolger= v2.Vorgänger and v2.Nachfolger= v.VorlNr and v.Titel=`Der Wiener Kreis´

61 select v1.Vorgänger from voraussetzen v1  voraussetzen vn_minus_1 voraussetzen vn, Vorlesungen v where v1.Nachfolger= v2.Vorgänger and  vn_minus_1.Nachfolger= vn.Vorgänger and vn.Nachfolger = v.VorlNr and v.Titel= `Der Wiener Kreis´ Vorgänger des „Wiener Kreises“ der Tiefe n

62 Transitive Hülle trans A,B (R)= {(a,b)   k  IN (  1,...,  k  R (  1.A=  2.B    k-1.A=  k.B   1.A= a   k.B= b))}

63 Der Wiener Kreis WissenschaftstheorieBioethik ErkenntnistheorieEthikMäeutik Grundzüge

64 Die connect by-Klausel (Oracle) select Titel from Vorlesungen where VorlNr in (select Vorgänger fromvoraussetzen connect by Nachfolger=prior Vorgänger start with Nachfolger= (select VorlNr from Vorlesungen where Titel= `Der Wiener Kreis´));

65 Grundzüge Ethik Erkenntnistheorie Wissenschaftstheorie

66 Rekursion in DB2/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) select Titel from Vorlesungen where VorlNr in (select Vorg from TransVorl where Nachf in (select VorlNr from Vorlesungen where Titel= `Der Wiener Kreis´) )

67  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  Ergebnis ist natürlich wie gehabt

68 Veränderung am Datenbestand Einfügen von Tupeln insert into hören select MatrNr, VorlNr from Studenten, Vorlesungen where Titel= `Logik´; insert into Studenten (MatrNr, Name) values (28121, `Archimedes´);

69 Studenten MatrNrNameSemester 29120Theophrastos2 29555Feuerbach2 28121Archimedes-

70 Veränderungen am Datenbestand Löschen von Tupeln delete Studenten where Semester > 13; Verändern von Tupeln update Studenten set Semester= Semester + 1;

71 Zweistufiges Vorgehen bei Änderungen 1.die Kandidaten für die Änderung werden ermittelt und ''markiert'' 2.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);

72 vorausssetzen VorgängerNachfolger 50015041 50015043 50015049 50415216 50435052 50415052 5229 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 (5052, 5229) fälschlicherweise erhalten, da vorher bereits alle Tupel mit 5052 als Nachfolger entfernt wurden.

73 vorausssetzen VorgängerNachfolger 50015041 50015043 50015049 50415216 50435052 50415052 5229 delete from voraussetzen where Vorgänger in (select Nachfolger from voraussetzen);

74 vorausssetzen VorgängerNachfolger 50015041 50015043 50015049 50415216 50435052 50415052 5229 delete from voraussetzen where Vorgänger in (select Nachfolger from voraussetzen);

75 Sichten... für den Datenschutz create view prüfenSicht as select MatrNr, VorlNr, PersNr from prüfen

76 Sichten... für die Vereinfachung von Anfagen create view StudProf (Sname, Semester, Titel, Pname) as select s.Name, s.Semester, v.Titel, p.Name from Studenten s, hören h, Vorlesungen v, Professoren p where s.Matr.Nr=h.MatrNr and h.VorlNr=v.VorlNr and v.gelesenVon = p.PersNr select distinct Semester from StudProf where PName=`Sokrates‘;

77 Sichten zur Modellierung von Generalisierung create table Angestellte (PersNrinteger not null, Namevarchar (30) not null); create table ProfDaten (PersNrinteger not null, Rangcharacter(2), Raum integer); create table AssiDaten (PersNrinteger not null, Fachgebietvarchar(30), Bossinteger);

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

79 create table Professoren (PersNrinteger not null, Name varchar (30) not null, Rangcharacter (2), Raum integer); create table Assistenten (PersNrinteger not null, Name varchar (30) not null, Fachgebietvarchar (30), Bossinteger); create table AndereAngestellte (PersNrinteger not null, Name varchar (30) not null);

80 create view Angestellte as (select PersNr, Name from Professoren) union (select PersNr, Name from Assistenten) union (select* from AndereAngestellte);  Obertypen als Sicht

81 Sichten zur Gewährleistung von Datenunabhängigkeit Benutzer Sicht 1Sicht 2Sicht 3 Relation 1Relation 2Relation 3 logische Datenunabhängigkeit physische Datenunabhängigkeit

82 Ä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, Name from Vorlesungen, Professoren where gelesen Von=PersNr; insert into VorlesungenSicht values (`Nihilismus‘, 2, `Nobody‘);

83 Änderbarkeit von Sichten  in SQL  nur eine Basisrelation  Schlüssel muß vorhanden sein  keine Aggregatfunktionen, Gruppierung und Duplikateliminierung alle Sichten theoretisch änderbare Sichten in SQL änderbare Sichten

84 Anfragen in Anwendungsprogrammen Satzorientierte Programmiersprache mengenorientiertes DBMS 1. Anfrage 3. Tupel sequentiell verarbeiten 4. Cursor/Iterator schließen 2. Anfrage auswerten, Ergebnistupel im Cursor/Iterator/ ResultSet bereitstellen

85 JDBC  Java DataBase Connectivity  Standard zum Zugriff auf die Datenbank von Java Anwendungen  Vorgehensweise:  Erzeugen einer Verbindung zum DBMS  Erzeugen eines „Statements“ (DB-Befehl)  ggf. Parameterübergabe  Ausführen des Befehls  ggf. Auslesen des Ergebnisses  Vorsicht: JDBC legt sich nicht auf SQL fest

86 Aufbau einer Verbindung Connection conn = DriverManager.getConnection( url_der_db, username, password) Treiber wird vom DBMS mitgeliefert url_der_db: Identikator der Instanz Username, Passwort: klar Weitere Einstellungen: Transaktionslevel, Puffer, etc. durch Programm oder Konfigurationsdatei

87 Lesen der Namen aller Profs Statement s = conn.createStatement(); ResultSet r; s.execute(„SELECT name FROM professoren“); r = s.getResultSet(); while (r.next()) { output(r.getString(1)); } r.close();

88 Anfragen mit Parameter PreparedStatement s = conn.prepareStatement( „SELECT name FROM profs WHERE rang = ?“); ResultSet r;... s.setString(1, „C3“); r = s.executeQuery(); while (r.next())...

89 Tipps und Tricks Connection Pooling  Erzeuge mehrere Verbindungen zum Datenbanksystem  Vor jedem Zugriff, belege eine freie Verbindung  Führe Zugriff über diese Verbindung durch  Vorteil: Eine langandauernde Datenbankoperation blockiert nicht andere. Andere Operationen können über andere Verbindungen laufen  Typische Anzahl von Verbindungen: 5 – 10, danach kontraproduktiv

90 Tipps und Tricks Cursor Caching  PreparedStatements für typische Operationen  Beispiel: insert into profs(name, rang) values(?,?)  Belege ? mit Werten vor jeder Berufung  Vorteil: Aufwand für Berufung wird reduziert  Nachteil: Anfrageoptimierer hat keine Statistiken für ?

91 Zusammenfassung  Einfacher Mechanismus zum Senden von Befehlen und Empfangen von Ergebnissen  SQL Syntax wird nicht zur Übersetzungszeit überprüft (!!!) Aus Sicht von Java sind Anfragen einfach nur Strings  Typsicherheit der Parameter wird auch erst zur Laufzeit überprüft  Alle JDBC Statements schmeißen SQLExceptions  Neuere Standards: SQLJ – mehr Komfort und mehr Sicherheit zur Übersetzungszeit

92 SQL J  Eingebettetes SQL in Java  Strenge Typisierung durch Präprozessor  Markierung von SQL Anweisungen durch #sql  Ähnliches Iterator (Cursor) Prinzip wie in JDBC #sql iterator ProfIterator(String name, String rang); ProfIterator myProfs; #sql myProfs = { SELECT name, rang FROM Professoren }; while (myProfs.next()) { System.out.println(myProfs.name() + myProfs.rang()); }


Herunterladen ppt " standardisierte -Datendefinitionssprache (DDL) -Datenmanipulationssprache (DML) -Anfragesprache (Query)  derzeit aktueller Standard ist SQL 3  objektrelationale."

Ähnliche Präsentationen


Google-Anzeigen