Rückblick § SQL bietet viele Möglichkeiten zur Anfrageformulierung § mathematische Funktionen (z.B. ABS(A) und SIGN(A)) § Aggregatfunktionen (z.B. MIN(A) und SUM(A)) § Boole‘sche Operatoren (AND, OR, EXCEPT) § Verknüpfungen von mehreren Tabellen (JOINs) § Data Manipulation Language (DML) zum Einfügen, Ändern und Löschen von Tupeln in Tabellen § SQLite als RDBMS zum Üben zu Hause Datenbanken / Kapitel 4: Structured Query Language (SQL) 66 Unteranfragen § SQL unterstützt Unteranfragen, d.h. ein SELECT Kommando kann häufig anstelle einer Tabelle oder einer Wertemenge verwendet werden § Beispiel: Studenten mit einem Vornamen, den es auch unter den Professoren gibt 1 2 3 SELECT * FROM Studenten WHERE Vorname IN ( SELECT Vorname FROM Professoren ) Datenbanken / Kapitel 4: Structured Query Language (SQL) 67 Umbenennung § SQL erlaubt die Umbenennung von Tabellen und Attributen; dies ist insbesondere dann nützlich, wenn die gleiche Tabelle mehrfach verwendet werden soll § Beispiel: Studenten, die eine gemeinsame Vorlesung hören 1 2 3 4 5 SELECT FROM WHERE AND AND DISTINCT s1 . Name AS StudentEins , s2 . Name AS StudentZwei Studenten s1 , h ö ren h1 , h ö ren h2 , Studenten s2 s1 . MatrNr = h1 . MatrNr h1 . VorlNr = h2 . VorlNr h2 . MatrNr = s2 . MatrNr Datenbanken / Kapitel 4: Structured Query Language (SQL) 68 Korrelierte Unteranfragen § Unteranfragen heißen korreliert, wenn sie Bezug auf die übergeordnete Anfrage nehmen, ansonsten unkorreliert § Beispiel: Unkorrelierte Unteranfrage 1 2 3 SELECT * FROM Studenten WHERE Vorname IN ( SELECT Vorname FROM Professoren ) § Beispiel: Korrelierte Unteranfrage 1 2 3 4 5 SELECT * FROM Studenten s WHERE Vorname IN ( SELECT Vorname FROM Professoren p WHERE p . Name = s . Name ) Datenbanken / Kapitel 4: Structured Query Language (SQL) 69 4.4 Äußere Joins § SQL unterstützt äußere Joins mittels der (LEFT|FULL|RIGHT) OUTER JOIN Kommandos § Beispiel: Professoren und Studenten mit gleichem Namen (bei Erhaltung aller Professoren) 1 2 3 SELECT * FROM Professoren LEFT OUTER JOIN Studenten ON Professoren . Name = Studenten . Name P.PersNr P.Vorname P.Name P.Fach S.MatrNr S.Vorname S.Name S.Semester 101101 231011 300128 478122 600321 Donald Albert Alfred Donald Carl Knuth Einstein Nobel Kossmann Gauss Informatik Informatik Chemie Informatik Mathematik 19882 Nora Nobel 3 18979 Gundula Gauss 1 Datenbanken / Kapitel 4: Structured Query Language (SQL) 70 Äußere Joins § Beispiel: Professoren und Studenten mit gleichem Namen (bei Erhaltung aller Studenten) 1 2 3 SELECT * FROM Professoren RIGHT OUTER JOIN Studenten ON Professoren . Name = Studenten . Name P.PersNr P.Vorname P.Name P.Fach S.MatrNr S.Vorname S.Name S.Semester 600321 Carl Gauss Mathematik 300128 Alfred Nobel Chemie 18979 19880 19882 20020 Gundula Petra Nora Emma Gauss Parker Nobel Ernst 1 1 3 3 Datenbanken / Kapitel 4: Structured Query Language (SQL) 71 Äußere Joins § Beispiel: Professoren und Studenten mit gleichem Namen (bei Erhaltung aller Professoren und Studenten) 1 2 3 SELECT * FROM Professoren FULL OUTER JOIN Studenten ON Professoren . Name = Studenten . Name P.PersNr 101101 231011 300128 478122 600321 P.Vorname Donald Albert Alfred Donald Carl P.Name Knuth Einstein Nobel Kossmann Gauss P.Fach Informatik Informatik Chemie Informatik Mathematik Datenbanken / Kapitel 4: Structured Query Language (SQL) S.MatrNr S.Vorname S.Name S.Semester 19880 Petra Parker 1 19882 Nora Nobel 3 18979 20020 Gundula Emma Gauss Ernst 1 3 72 Äußere Joins § SQLite unterstützt (leider) nur LEFT OUTER JOIN § Oracle kennt (aus historischen Gründen) zusätzlich eine alternative Syntax, um äußere Joins zu formulieren 1 2 3 SELECT * FROM Professoren , Studenten WHERE Professoren . Name = Studenten . Name (+) Hier markiert (+) optionale Tabellen, d.h. obige Anfrage drückt einen linken äußeren Join aus Datenbanken / Kapitel 4: Structured Query Language (SQL) 73 4.5 Gruppierung & Aggregation § Aggregatfunktionen wurde bisher nur auf gesamte Tabellen angewendet; oft möchte man diese jedoch auf Gruppen von Tupeln anwenden § Beispiele: § Durchschnittliche Note je Vorlesung § Semesterwochenstunden je Professor § Anzahl der Studenten pro Fach Datenbanken / Kapitel 4: Structured Query Language (SQL) 74 Gruppierung § Aggregatfunktionen lassen sich mittels des GROUP BY Kommandos auf Gruppen von Tupeln anwenden; dieses hat folgende allgemeine Form 1 2 3 4 5 6 SELECT FROM WHERE GROUP BY HAVING ORDER BY < Projektionsattribute > , < Aggregate > < Tabellen > < Bedingungen auf Attributen > < Gruppierattribute > < Bedingungen auf Aggregaten > < Sortierattribute > , < Aggregate > Datenbanken / Kapitel 4: Structured Query Language (SQL) 75 Gruppierung § Tupel mit den gleichen Werten für die angegebenen Gruppierattribute bilden eine Gruppe, für die ein Wert der Aggregate berechnet wird § Beispiel: Fächer absteigend sortiert nach Anzahl Studenten 1 2 3 4 SELECT FROM GROUP BY ORDER BY Fach , Count (*) AS Anzahl Studenten Fach Anzahl DESC Datenbanken / Kapitel 4: Structured Query Language (SQL) 76 Gruppierung § Beispiel: Anzahl Professoren eines Namens je Fach 1 2 3 SELECT Fach , Name , Count (*) FROM Professoren GROUP BY Fach , Name § Projektionsattribute sind in der Regel identisch mit den Gruppierattributen; sie müssen eine Teilmenge sein § Sortierattribute müssen eine Teilmenge der Gruppierattribute sein Datenbanken / Kapitel 4: Structured Query Language (SQL) 77 Gruppierung mit Selektion auf Attributen § Soll die Gruppierung nur solche Tupel berücksichtigen, deren Attribute eine bestimmte Bedingung erfüllen, so kann dies mittels einer WHERE-Klausel erreicht werden § Beispiel: Anzahl Professoren namens Meier je Fach 1 2 3 4 SELECT FROM WHERE GROUP BY Fach , Count (*) AS Anzahl Professoren Name = ’ Meier ’ Fach Datenbanken / Kapitel 4: Structured Query Language (SQL) 78 Gruppierung mit Selektion auf Aggregaten § Soll die Gruppierung nur solche Tupel zurückliefern, deren Aggregate eine bestimmte Bedingung erfüllen, so kann dies mittels einer HAVING-Klausel erreicht werden § Beispiel: Fächer mit mehr als 10 Professoren 1 2 3 4 SELECT FROM GROUP BY HAVING Fach , Count (*) AS Anzahl Professoren Fach Anzahl > 10 Datenbanken / Kapitel 4: Structured Query Language (SQL) 79 Gruppierung mit Selektion § SQL-Anfrage kann sowohl eine WHERE-Klausel als auch eine HAVING-Klausel besitzen und es kann mehrere Aggregate geben § Beispiel: Anzahl Professoren in Fächern, die auf „ik“ enden und mehr als 5 Professoren haben, alphabetisch sortiert 1 2 3 4 5 6 SELECT FROM WHERE GROUP BY HAVING ORDER BY Datenbanken / Kapitel 4: Structured Query Language (SQL) Fach , COUNT (*) Professoren Fach LIKE ’% ik ’ Fach COUNT (*) > 5 Fach 80 Verarbeitung der Gruppierung § WHERE (d.h. betrachte nur Professoren, deren Fach auf „ik“ endet) § GROUP BY (d.h. gruppiere verbleibende Professoren nach Fach) § HAVING (d.h. eliminiere Fächer mit weniger als 5 Professoren) 1 § ORDER BY (d.h. sortiere verbleibende Fächer) 2 3 4 5 6 Datenbanken / Kapitel 4: Structured Query Language (SQL) SELECT FROM WHERE GROUP BY HAVING ORDER BY Fach , COUNT (*) Professoren Fach LIKE ’% ik ’ Fach COUNT (*) > 5 Fach 81 Top-k Anfragen § Bei Bildung von Aggregaten sind wir häufig nur an einer bestimmten Anzahl von Tupeln mit höchstem oder niedrigstem Aggregatwert interessiert; dies lässt sich durch Verwendung des TOP (MS SQL Server) oder LIMIT Kommandos (SQLite) erzielen § Beispiel: 5 Fächer mit den meisten Professoren MS SQL Server: 1 2 3 4 SELECT FROM GROUP BY ORDER BY TOP 5 Fach , COUNT (*) AS Anzahl Professoren Fach Anzahl DESC Datenbanken / Kapitel 4: Structured Query Language (SQL) 82 Top-k Anfragen § Beispiel: 5 Fächer mit den meisten Professoren SQLite: 1 2 3 4 5 SELECT FROM GROUP BY ORDER BY LIMIT Fach , COUNT (*) AS Anzahl Professoren Fach Anzahl DESC 5 Datenbanken / Kapitel 4: Structured Query Language (SQL) 83 4.6 Quantifizierung § SQL unterstützt mittels der Kommandos EXISTS und NOT EXISTS den Existenzquantor und den Nichtexistenzquantor § Beispiel: Professoren zu denen es Studenten mit gleichem Vornamen gibt 1 2 3 4 SELECT * FROM Professoren p WHERE EXISTS ( SELECT * FROM Studenten s WHERE p . Vorname = s . Vorname ) Datenbanken / Kapitel 4: Structured Query Language (SQL) 84 Quantifizierung § Allquantor wird nicht explizit unterstützt; kann aber mittels des Nichtexistenzquantors ausgedrückt werden § Beispiel: Studenten, die alle Vorlesungen hören (d.h. es gibt kein Vorlesung, die der Student nicht hört) 1 2 3 4 5 6 7 8 9 10 SELECT * FROM Studenten s WHERE NOT EXISTS ( SELECT * FROM Vorlesungen v WHERE NOT EXISTS ( SELECT * FROM h ö ren h WHERE s . MatrNr = h . MatrNr AND h . VorlNr = v . VorlNr )) Datenbanken / Kapitel 4: Structured Query Language (SQL) 85 Anfrageübung Versandhandel § Anzahl der Kunden pro Wohnort § Minimaler und maximaler Preis je Artikelkategorie § Top-3 Kunden aus PLZ-Gebiet 661XX nach Umsatz § Bausätze mit mehr als 100€ Umsatz § Artikel, die noch nie bestellt wurden Datenbanken / Kapitel 4: Structured Query Language (SQL) 86 Anfrageübung Versandhandel § Anzahl der Kunden pro Wohnort 1 2 3 SELECT Wohnort , COUNT (*) AS Anzahl FROM Kunden GROUP BY Wohnort § Minimaler und maximaler Preis je Artikelkategorie 1 2 3 SELECT Kategorie , MIN ( Preis ) , MAX ( Preis ) FROM Artikel GROUP BY Kategorie Datenbanken / Kapitel 4: Structured Query Language (SQL) 87 Anfrageübung Versandhandel § Top-3 Kunden aus PLZ-Gebiet 661XX nach Umsatz 1 2 3 4 5 6 SELECT FROM WHERE AND GROUP BY ORDER BY Kunden . Kunden_Nr , SUM ( Bestellungen . Betrag ) AS Umsatz Kunden , Bestellungen Kunden . Kunden_Nr = Bestellungen . Kunden_Nr Kunden . PLZ > 66099 AND Kunden . PLZ < 66200 Kunden . Kunden_Nr Umsatz DESC LIMIT 3 § Bausätze mit mehr als 100€ Umsatz 1 2 3 4 5 6 SELECT FROM WHERE AND GROUP BY HAVING a . Artikel_Nr , SUM ( b . Anzahl * a . Preis ) AS Umsatz Artikel a , B estell posit ionen b a . Artikel_Nr = b . Artikel_Nr a . Kategorie = ’B ’ a . Artikel_Nr Umsatz > 100 Datenbanken / Kapitel 4: Structured Query Language (SQL) 88 Anfrageübung Versandhandel § Artikel, die noch nie bestellt wurden 1 2 3 4 5 6 SELECT * FROM Artikel a WHERE NOT EXISTS ( SELECT * FROM Best ellpo sition en b WHERE a . Artikel_Nr = b . Artikel_Nr ) oder mit Wertemengen (IN) 1 2 3 4 5 SELECT * FROM Artikel WHERE Artikel_Nr NOT IN ( SELECT Artikel_Nr FROM Bestellpo sition en ) Datenbanken / Kapitel 4: Structured Query Language (SQL) 89 Zusammenfassung § Äußere Joins § (LEFT|FULL|RIGHT) OUTER JOIN § Gruppierung und Aggregation § Aggregatfunktionen (SUM, COUNT, MAX, MIN, etc.) § WHERE zur Selektion auf Attributen § GROUP BY zur Angabe der Gruppierattribute § HAVING zur Selektion auf Aggregaten § Quantifizierung § EXISTS und NOT EXISTS Datenbanken / Kapitel 4: Structured Query Language (SQL) 90 Literatur [1] A. Kemper und A. Eickler: Datenbanksysteme – Eine Einführung, De Gruyter Oldenbourg, 2015 (Kapitel 4) [2] G. Saake, K.-U. Sattler und A. Heuer: Datenbanken - Konzepte und Sprachen, mitp Professional, 2013 (Kapitel 7 & 10) Datenbanken / Kapitel 4: Structured Query Language (SQL) 91