Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Dr. Brigitte Mathiak Kapitel 2 SQL Anfragen. Datenbanken, SS 12 Kapitel 2: SQL Anfragen2 Lernziele Syntax von SQL Anfragen Präzise Semantik von SQL Anfragen:

Ähnliche Präsentationen


Präsentation zum Thema: "Dr. Brigitte Mathiak Kapitel 2 SQL Anfragen. Datenbanken, SS 12 Kapitel 2: SQL Anfragen2 Lernziele Syntax von SQL Anfragen Präzise Semantik von SQL Anfragen:"—  Präsentation transkript:

1 Dr. Brigitte Mathiak Kapitel 2 SQL Anfragen

2 Datenbanken, SS 12 Kapitel 2: SQL Anfragen2 Lernziele Syntax von SQL Anfragen Präzise Semantik von SQL Anfragen: Abbildung auf Relationale Algebra Erweiterte Konstrukte in SQL Abfragen: Aggregation, Gruppierung, rekursive Anfragen..

3 Professoren PersNrNameRangRaum 2125SokratesC RusselC KopernikusC PopperC AugustinusC CurieC KantC47 Studenten MatrNrNameSemester 24002Xenokrates Jonas Fichte Aristoxenos Schopenhauer Carnap Theophrastos Feuerbach2 Vorlesungen VorlNrTitelSWSgelesen Von 5001Grundzüge Ethik Erkenntnistheorie Mäeutik Logik Wissenschaftstheorie Bioethik Der Wiener Kreis Glaube und Wissen Die 3 Kritiken42137 voraussetzen VorgängerNachfolger hören MatrNrVorlNr Assistenten PerslNrNameFachgebietBoss 3002PlatonIdeenlehre AristotelesSyllogistik WittgensteinSprachtheorie RhetikusPlanetenbewegung NewtonKeplersche Gesetze SpinozaGott und Natur2126 prüfen MatrNrVorlNrPersNrNote

4 Einfache SQL-Anfragen select* fromProfessoren; PersNrNameRangRaum 2125SokratesC RusselC KopernikusC PopperC AugustinusC CurieC KantC47 select *: Wählt alles aus from wählt die Tabelle

5 Einfache SQL-Anfragen PersNrName 2125Sokrates 2126Russel 2136Curie 2137Kant selectPersNr, Name fromProfessoren whereRang= ´C4´; Bei select können auch bestimmte Spalten gewählt werden Bei where können logische Einschränkungen gemacht werden

6 Einfache SQL-Anfragen Sortierung select PersNr, Name, Rang fromProfessoren order by Rang desc, Name asc; PersNrNameRang 2136CurieC4 2137KantC4 2126RusselC4 2125SokratesC4 2134AugustinusC3 2127KopernikusC3 2133PopperC3 Mit order by kann die Reihenfolge der Anzeige verändert werden Was zuerst steht, danach wird zuerst sortiert desc ist für absteigende Ordnung, asc für aufsteigende

7 select distinct Rang from Professoren Rang C3 C4 Duplikateliminierung Mit distinct werden Duplikate herausgenommen

8 Professoren PersNrNameRangRaum 2125SokratesC RusselC KopernikusC PopperC AugustinusC CurieC KantC47 Studenten MatrNrNameSemester 24002Xenokrates Jonas Fichte Aristoxenos Schopenhauer Carnap Theophrastos Feuerbach2 Vorlesungen VorlNrTitelSWSgelesen Von 5001Grundzüge Ethik Erkenntnistheorie Mäeutik Logik Wissenschaftstheorie Bioethik Der Wiener Kreis Glaube und Wissen Die 3 Kritiken42137 voraussetzen VorgängerNachfolger hören MatrNrVorlNr Assistenten PerslNrNameFachgebietBoss 3002PlatonIdeenlehre AristotelesSyllogistik WittgensteinSprachtheorie RhetikusPlanetenbewegung NewtonKeplersche Gesetze SpinozaGott und Natur2126 prüfen MatrNrVorlNrPersNrNote

9 Anfragen über mehrere Relationen Welcher Professor liest "Mäeutik"? select Name, Titel from Professoren, Vorlesungen where PersNr = gelesenVon and Titel = `Mäeutik ; Hinter from werden nun zwei Tabellen genannt

10 Anfragen über mehrere Relationen RaumRangNamePersNr C4 Sokrates Russel Kant Professoren gelesen VonSWSTitelVorlNr 21374Grundzüge Die 3 Kritiken Mäeutik Ethik5041 Vorlesungen Verknüpfung

11 VorlNr Die 3 Kritiken Ethik Grundzüge Mäeutik Ethik Grundzüge Titel SWS gelesen Von Raum C4Kant2137 RangNamePersN r C4Sokrates2125 C4Russel2126 C4Russel2126 C4Sokrates2125 C4Sokrates1225 PersNrNameRangRaumVorlNrTitelSWSgelesen Von 2125SokratesC Mäeutik22125 NameTitel SokratesMäeutik where PersNr = gelesenVon and Titel = `Mäeutik select Name, Titel Jeder mit jedem einmal

12 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 Mit Korrelationsvariablen

13 Professoren PersNrNameRangRaum 2125SokratesC RusselC KopernikusC PopperC AugustinusC CurieC KantC47 Studenten MatrNrNameSemester 24002Xenokrates Jonas Fichte Aristoxenos Schopenhauer Carnap Theophrastos Feuerbach2 Vorlesungen VorlNrTitelSWSgelesen Von 5001Grundzüge Ethik Erkenntnistheorie Mäeutik Logik Wissenschaftstheorie Bioethik Der Wiener Kreis Glaube und Wissen Die 3 Kritiken42137 voraussetzen VorgängerNachfolger hören MatrNrVorlNr Assistenten PerslNrNameFachgebietBoss 3002PlatonIdeenlehre AristotelesSyllogistik WittgensteinSprachtheorie RhetikusPlanetenbewegung NewtonKeplersche Gesetze SpinozaGott und Natur2126 prüfen MatrNrVorlNrPersNrNote

14 Mengenoperationen und geschachtelte Anfragen Mengenoperationen union, intersect, minus (Vereinigung, Schnittmenge, Differenz) ( select Name from Assistenten ) union ( select Name from Professoren); Was passiert hier? Was würde bei intersect Passieren oder bei minus? Jeder für sich mit Zettel und Stift; 3 min.

15 Vorlesungen VorlNrTitelSWSgelesen Von 5001Grundzüge Ethik Erkenntnistheorie Mäeutik Logik Wissenschaftstheorie Bioethik Der Wiener Kreis Glaube und Wissen Die 3 Kritiken42137 Existenzquantor exists select p.Name from Professoren p where not exists ( select * from Vorlesungen v where v.gelesenVon = p.PersNr ); Korrelation Professoren PersNrNameRangRaum 2125SokratesC RusselC KopernikusC PopperC AugustinusC CurieC KantC47

16 Existenzquantor exists select p.Name from Professoren p where not exists ( select * from Vorlesungen v where v.gelesenVon = p.PersNr ); Professoren PersNrNameRangRaum 2125SokratesC RusselC KopernikusC PopperC AugustinusC CurieC KantC47 Professoren PersNrNameRangRaum 2127KopernikusC CurieC436

17 Mengenvergleich select Name from Professoren where PersNr not in ( select gelesenVon from Vorlesungen ); Unkorrelierte Unterabfragen sind meist effizienter, da sie nicht pro Zeile ausgewertet werden müssen Hatten wir das nicht gerade?

18 Datenbanken, SS 12 Kapitel 2: SQL Anfragen18 "Quantifizierte" Subqueries Die Bedingung Wert ANY Menge mit {{=,,,,, } ist erfüllt, wenn es in der Menge ein Element gibt, für das Wert Element gilt. (=ANY ist äquivalent zu IN).. SOME ist equivalent to ANY Die Bedingung Wert ALL Menge mit {=,,,,, } ist erfüllt, wenn für alle Elemente der Menge gilt: Wert Element. (<>ALL ist äquivalent zu NOT IN.) Die Bedingung EXISTS Menge ist erfüllt, wenn die Menge nicht leer ist (dies ist äquivalent zur Bedingung 0 < SELECT COUNT(*) FROM...) Achtung: Wert ALL (query_returns_no_rows) = TRUE Wert ANY (query_returns_no_rows) = FALSE

19 Datenbanken, SS 12 Kapitel 2: SQL Anfragen19 "Quantifizierte" Subqueries Anfrage: Studenten im höchsten Semester: SELECT * FROM Studenten WHERE Semester >= ALL (SELECT Semester FROM Studenten ) ; Anfrage: Studenten, für die keine Prüfungen erfasst sind: SELECT * FROM Studenten s WHERE NOT EXISTS ( SELECT * FROM Prüfen p WHERE p.MatrNr = s.MatrNr );

20 Professoren PersNrNameRangRaum 2125SokratesC RusselC KopernikusC PopperC AugustinusC CurieC KantC47 Studenten MatrNrNameSemester 24002Xenokrates Jonas Fichte Aristoxenos Schopenhauer Carnap Theophrastos Feuerbach2 Vorlesungen VorlNrTitelSWSgelesen Von 5001Grundzüge Ethik Erkenntnistheorie Mäeutik Logik Wissenschaftstheorie Bioethik Der Wiener Kreis Glaube und Wissen Die 3 Kritiken42137 voraussetzen VorgängerNachfolger hören MatrNrVorlNr Assistenten PerslNrNameFachgebietBoss 3002PlatonIdeenlehre AristotelesSyllogistik WittgensteinSprachtheorie RhetikusPlanetenbewegung NewtonKeplersche Gesetze SpinozaGott und Natur2126 prüfen MatrNrVorlNrPersNrNote

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

22 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

23 Ausführen der Anfrage mit group by Vorlesung x Professoren VorlNrTitelSWSgelesen Von PersNrNameRangRaum 5001Grundzüge SokratesC Ethik42125 SokratesC Die 3 Kritiken KantC47 where gelesenVon = PersNr and Rang = ´C4´

24 VorlNrTitelSWSgelesen Von PersNrNameRangRaum 5001Grundzüge42137 KantC Ethik42125 SokratesC Erkenntnis- theorie RusselC Mäeutik22125 SokratesC Logik42125 SokratesC Wissenschafts- theorie RusselC Bioethik22126 RusselC Die 3 Kritiken42137 KantC47 group by gelesenVon, Name

25 having avg (SWS) >= 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 Kant RaumRangNamePersNrgelesenVonSWSTitelVorlN r 7777 C4 Kant Grundzüge Die 3 Kritiken C Ethik Mäeutik Logik Sokrates Aggregation (sum(SWS)) pro Gruppe

26 gelesenVonNamesum (SWS) 2125Sokrates Kant8

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

28 Professoren PersNrNameRangRaum 2125SokratesC RusselC KopernikusC PopperC AugustinusC CurieC KantC47 Studenten MatrNrNameSemester 24002Xenokrates Jonas Fichte Aristoxenos Schopenhauer Carnap Theophrastos Feuerbach2 Vorlesungen VorlNrTitelSWSgelesen Von 5001Grundzüge Ethik Erkenntnistheorie Mäeutik Logik Wissenschaftstheorie Bioethik Der Wiener Kreis Glaube und Wissen Die 3 Kritiken42137 voraussetzen VorgängerNachfolger hören MatrNrVorlNr Assistenten PerslNrNameFachgebietBoss 3002PlatonIdeenlehre AristotelesSyllogistik WittgensteinSprachtheorie RhetikusPlanetenbewegung NewtonKeplersche Gesetze SpinozaGott und Natur2126 prüfen MatrNrVorlNrPersNrNote

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

30 Ä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

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

32 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 28106Carnap Theophrastos3

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

34 VorlNrAnzProVorlGesamtAnzMarktanteil Das Ergebnis der Anfrage

35 Datenbanken, SS 12 Kapitel 2: SQL Anfragen35 Anfrage: Wer hat alle vierstündigen Vorlesungen gehört? Problem: ist in SQL nicht vorgesehen, nur exists Idee: Elimination von und Dazu sind folgende Äquivalenzen anzuwenden: Simulation allquantifizierter Suchprädikate

36 Datenbanken, SS 12 Kapitel 2: SQL Anfragen36 Umformung der Logik (1/3) Schritt 1: Elimination

37 Datenbanken, SS 12 Kapitel 2: SQL Anfragen37 Umformung der Logik (2/3) Schritt 2: Elimination

38 Datenbanken, SS 12 Kapitel 2: SQL Anfragen38 Umformung der Logik (3/3) Schritt 3: Transformation ergibt schließlich:

39 Datenbanken, SS 12 Kapitel 2: SQL Anfragen39 SELECT s.MatrNr 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 ) ); Umsetzung der Logik in SQL Anfrage: Wer hat alle vierstündigen Vorlesungen gehört?

40 Datenbanken, SS 12 Kapitel 2: SQL Anfragen40 SELECT s.MatrNr FROM Studenten s WHERE NOT EXISTS ( SELECT v.VorlNr FROM Vorlesungen v WHERE v.SWS = 4 MINUS SELECT h.VorlNr FROM hören h WHERE h.MatrNr = s.MatrNr ) ; Simulation allquantifizierter Suchprädikate: alternative Form mit Mengenoperation Anfrage: Wer hat alle vierstündigen Vorlesungen gehört? Zwischenanfrage: Alle Vorlesungen, die 4 SWS haben MINUS Alle Vorlesungen, die der Student s gehört hat

41 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);

42 Herausforderung Wie formuliert man die komplexere Anfrage: Wer hat alle vierstündigen Vorlesungen gehört ohne Korrelation nur mit Zählen Grundidee besteht darin, vorher durch einen Join die Studenten/Vorlesungs-Paare einzuschränken und danach das Zählen durchzuführen Jeder für sich mit Zettel und Stift; 5 min

43 Datenbanken, SS 12 Kapitel 2: SQL Anfragen43 Simulation allquantifizierter Suchprädikate durch count-Aggregation SELECT h.MatrNr FROM hören h, Vorlesungen v WHERE v.SWS = 4 AND h.VorlNr = v.VorlNr GROUP BY h.MatrNr HAVING count (*) = (SELECT count (*) FROM Vorlesungen v1 WHERE v1.SWS = 4); Anfrage: Wer hat alle vierstündigen Vorlesungen gehört?

44 Datenbanken, SS 12 Kapitel 2: SQL Anfragen44 Count-Aggregation: Fehlerquellen SELECT h.MatrNr, s.Name FROM hören h, Vorlesungen v, Studenten s WHERE v.SWS = 4 AND h.VorlNr = v.VorlNr AND h.MatrNr = s.MatrNr GROUP BY h.MatrNr HAVING count (*) = (SELECT count (*) FROM Vorlesungen v1 WHERE v1.SWS = 4); Anfrage: Namen der Studenten, die alle vierstündigen Vorlesungen gehört haben Vorsicht: so geht das nicht..

45 Datenbanken, SS 12 Kapitel 2: SQL Anfragen45 Count-Aggregation: Fehlerquellen SELECT h.MatrNr, s.Name FROM hören h, Vorlesungen v, Studenten s WHERE v.SWS = 4 AND h.VorlNr = v.VorlNr AND h.MatrNr = s.MatrNr GROUP BY h.MatrNr, s.Name HAVING count (*) = ( SELECT count (*) FROM Vorlesungen v1 WHERE v1.SWS = 4); 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! Anfrage: Namen der Studenten, die alle vierstündigen Vorlesungen gehört haben

46 Datenbanken, SS 12 Kapitel 2: SQL Anfragen46 Allquantifizierung - Fazit Es geht zwar nicht direkt, aber indirekt Man kann per deMorgan den Ausdruck auf exists zurückführen Man kann per Mengenoperation minus die Fälle eliminieren, in denen es nicht übereinstimmt Man kann zählen, ob alle Fälle betrachtet sind und dies dann mit der Gesamtmenge der Fälle vergleichen Für die Prüfung reicht eine Methode

47 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:

48 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:

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

50 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 aufgefasst und in eine eigene Gruppe eingeordnet. Notecount(*) …… null248

51 Datenbanken, SS 12 Kapitel 2: SQL Anfragen51 Test auf Nullwert Anfrage: bisher unbenotete Prüfungsleistungen SELECT * FROM prüfen WHERE Note IS NULL Anfrage: Professoren mit eigenem Büro SELECT * FROM Professoren WHERE Raum IS NOT NULL

52 Spezielle Sprachkonstrukte ("syntactic sugar") 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);

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

54 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%´;

55 Behandlung spezieller Datentypen Zu Strings gibt es meist eine Reihe Zusatzfunktionen in den Datenbanken Zu erwarten ist einfache Stringmanipulation: Konkatenation, Suchen, Ersetzen; oft reguläre Ausdrücke und zunehmend Anwendungen aus NLP und Suchmaschinentechnologie, wie Synonyme, Ranking, Topic Analysis, … Die sind aber bislang noch nicht vereinheitlicht und werden daher hier nicht behandelt Weiterhin gibt es oft Methoden um komplexe Datentypen, wie Zeit, Ort, Bilder, Musik, etc. zu verarbeiten Das ist aber auch nicht standardisiert, wird hier also nicht behandelt Datenbanken, SS 12 Kapitel 2: SQL Anfragen55

56 Joins in SQL-92 cross join: Kreuzprodukt select * from R1, R2; 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)

57 Datenbanken, SS 12 Kapitel 2: SQL Anfragen57 Inner Join Anfrage: welcher Professor bietet welche Vorlesungen an? SELECT p.Name, v.Name FROM Professoren p JOIN Vorlesungen v ON p.PersNr = v.gelesenVon ; SELECT p.Name, v.Name FROM Professoren p, Vorlesungen v WHERE p.PersNr = v.gelesenVon ;

58 Datenbanken, SS 12 Kapitel 2: SQL Anfragen58 Natural Join Anfrage: Welcher Student hört welche Vorlesung? SELECT Studenten.Name, Vorlesungen.Name FROM Studenten NATURAL JOIN hören NATURAL JOIN Vorlesungen ; SELECT s.Name, v.Name FROM Studenten s, hören h, Vorlesungen v WHERE s.MatrNr = h.MatrNr AND h.VorlNr = v.vorlNr ;

59 Datenbanken, SS 12 Kapitel 2: SQL Anfragen59 Cross Join Anfrage: alle Paare "Professor – Student" : SELECT Professoren.Name, Studenten.Name FROM Professoren CROSS JOIN Studenten ; SELECT p.Name, s.Name FROM Professoren p, Studenten s ;

60 Datenbanken, SS 12 Kapitel 2: SQL Anfragen60 Outer Joins: Left Outer Join 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 ; p.PersN r p.Name f.PersN r f.Not e f.MatrN r s.Matr Nr s.Name 2126Russel Carnap 2125 Sokrate s Jonas 2137Kant Schopenhauer 2136CurieØØØØØ …………………

61 Datenbanken, SS 12 Kapitel 2: SQL Anfragen61 Outer Joins: Right Outer Join 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 = p.MatrNr) ON p.PersNr = f.PersNr ; p.PersN r p.Namef.PersNrf.Note f.MatrN r s.MatrNrs.Name 2126Russel Carnap 2125Sokrates Jonas 2137Kant Schopenhau er ØØØØØ 26120Fichte …………………

62 Datenbanken, SS 12 Kapitel 2: SQL Anfragen62 p.PersN r p.Namef.PersNrf.Notef.MatrNrs.MatrNrs.Name 2126Russel Carnap 2125 Sokrate s Jonas 2137Kant Schopenhauer ØØØØØ 26120Fichte ………………… 2136Curie ØØØØØ ………………… 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 ; Outer Joins: Full Outer Join

63 Datenbanken, SS 12 Kapitel 2: SQL Anfragen63 Outer Joins: Oracle-Syntax SELECT * FROM Studenten LEFT OUTER JOIN hören USING (MatrNr) SELECT * FROM Studenten s, hören h WHERE s.MatrNr = h.MatrNr (+) Anfrage: welche Studenten hören welche Vorlesungen

64 Ä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 2126Russel Carnap 2125Sokrates Jonas 2137Kant Schopen- hauer 2136Curie-----

65 Ä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 2126Russel Carnap 2125Sokrates Jonas 2137Kant Schopen- hauer Fichte

66 Ä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;

67 p.PersNrp.Namef.PersNrf.Notef.MatrNrs.MatrNrs.Name 2126Russel Carnap 2125Sokrates Jonas 2137Kant Schopen- hauer Fichte 2136Curie-----

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

69 Der Wiener Kreis WissenschaftstheorieBioethik ErkenntnistheorieEthikMäeutik Grundzüge

70 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´

71 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 Wollen wir das wirklich?

72 Grundproblem: 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))}

73 Der Wiener Kreis WissenschaftstheorieBioethik ErkenntnistheorieEthikMäeutik Grundzüge

74 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´)); Grundzüge Ethik Erkenntnistheorie Wissenschaftstheorie

75 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´) )

76 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

77 Datenbanken, SS 12 Kapitel 2: SQL Anfragen77 Fazit Rekursion/transitive Hülle In SQL nur mühsam lösbar Vorhandene Lösungen sind technologieabhängig Die praktisch beste Lösung ist fast immer das Ändern der Datenstruktur oder das Anlegen von Hilfstabellen voraussetzen_rec VorgängerNachfolger Achtung! Solche Datenstrukturen sind oft schwer aktuell zu halten -> Datenintegrität

78 Datenbanken, SS 12 Kapitel 2: SQL Anfragen78 Syntaktische Beschreibung einer Select Anweisung "Grobsyntax": select_block { { UNION | INTERSECT | EXCEPT } [ALL] select_block...} [ORDER BY result_column [ASC | DESC] {, result_column [ASC | DESC] …} mit select_block ::= SELECT [ALL | DISTINCT] {column | {expression [AS result_column]}} {, {column | {expression [AS result_column]}} …} FROM table [correlation_var] {, table [correlation_var] …} [WHERE search_condition] [GROUP BY column {, column …} [HAVING search_condition] ]

79 Datenbanken, SS 12 Kapitel 2: SQL Anfragen79 Oracle: Syntaxdiagramme

80 Fazit Sie können nun SQL-Anfragen Datenbanken, SS 12 Kapitel 2: SQL Anfragen80


Herunterladen ppt "Dr. Brigitte Mathiak Kapitel 2 SQL Anfragen. Datenbanken, SS 12 Kapitel 2: SQL Anfragen2 Lernziele Syntax von SQL Anfragen Präzise Semantik von SQL Anfragen:"

Ähnliche Präsentationen


Google-Anzeigen