In Modul 04 haben wir die Schulbibliothek normalisiert. Dabei entstand eine neue Tabelle: Ausleihposition. Ein Schüler kann jetzt mehrere Bücher auf einmal ausleihen — jedes Buch bekommt eine eigene Zeile in Ausleihposition.
Dieses Modul arbeitet mit diesem vollständigen Schema:
| SchuelerID | INTEGER · PK |
| Name | TEXT |
| Klasse | TEXT |
| Geburtsdatum | DATE |
| BuchID | INTEGER · PK |
| Titel | TEXT |
| Autor | TEXT |
| Genre | TEXT |
| Erscheinungsjahr | INTEGER |
| Preis | REAL · NULL möglich |
| AusleiheID | INTEGER · PK |
| SchuelerID | INTEGER · FK |
| DatumAusleihe | DATE |
| DatumRueckgabe | DATE · NULL möglich |
| PositionID | INTEGER · PK |
| AusleiheID | INTEGER · FK |
| BuchID | INTEGER · FK |
Führe die Abfragen aus, um die Daten kennenzulernen:
INNER JOIN zeigt nur Zeilen, bei denen auf beiden Seiten ein Treffer existiert. LEFT JOIN zeigt alle Zeilen der linken Tabelle — auch wenn es rechts keinen Treffer gibt. Fehlende Werte erscheinen als NULL.
Typischer Einsatz: „Zeige alle X — auch die ohne Y."
Führe beide Abfragen aus und vergleiche die Anzahl der Ergebniszeilen:
Nach einem LEFT JOIN kann man mit WHERE … IS NULL gezielt die Zeilen herausfiltern, für die es keinen Treffer rechts gab:
Welche Bücher wurden noch nie ausgeliehen?
Welche Schüler haben noch nie etwas ausgeliehen? Zeige Name und Klasse.
Zeige alle Bücher mit ihrer AusleiheID — auch Bücher die nie ausgeliehen wurden. Sortiere so dass die nie ausgeliehenen zuerst erscheinen.
Wer hat welches Buch ausgeliehen — alle vier Tabellen mit Aliasen:
Zeige alle Schüler mit Name, Klasse und Buchtitel — auch Schüler die nichts ausgeliehen haben sollen erscheinen (dann steht NULL beim Titel).
In Modul 02 haben wir Aggregatfunktionen ohne GROUP BY genutzt — das Ergebnis war immer eine Zahl für die ganze Tabelle. Mit GROUP BY berechnet man die Aggregatfunktion pro Gruppe.
Wichtig: Im SELECT dürfen nur Spalten stehen die in GROUP BY genannt sind — oder Aggregatfunktionen.
Wie viele Bücher gibt es pro Genre?
Welcher Durchschnittspreis gilt pro Genre? Runde nicht — zeige den rohen AVG-Wert.
Wie oft wurde jedes Buch ausgeliehen? Zeige Titel und Anzahl — häufigstes zuerst.
Wie viele Bücher hat jeder Schüler insgesamt ausgeliehen?
Wie viele Ausleihen hat jede Klasse insgesamt?
Wie viele Bücher hat jeder Schüler insgesamt ausgeliehen — auch Schüler mit 0 Ausleihen sollen erscheinen. Meiste zuerst.
WHERE filtert Zeilen — bevor gruppiert wird.
HAVING filtert Gruppen — nachdem gruppiert wurde.
Faustregel: Wenn die Bedingung eine Aggregatfunktion enthält (COUNT, AVG, …) → HAVING. Sonst → WHERE.
Welche Genres haben mehr als 3 Bücher?
Welche Genres haben einen Durchschnittspreis über 12€? Zeige Genre und Durchschnitt.
Welche Autoren haben mehr als ein Buch in der Bibliothek?
Welche Bücher wurden mehr als 2 Mal ausgeliehen?
Welche Klassen haben mehr als 5 Ausleihen insgesamt?
Welche Schüler haben mehr als 3 Bücher insgesamt ausgeliehen? Zeige Name und Anzahl, meiste zuerst.
Du hast die Blöcke O (LEFT JOIN), P (GROUP BY) und Q (HAVING) bearbeitet:
O · LEFT JOIN
P · GROUP BY
Q · HAVING
Weiter in Modul 06: Subqueries