Rückblick
Dieses Kapitel hat die Blickrichtung geändert: Bisher ging es um einzelne Zeilen, jetzt um Gruppen von Zeilen. Damit lassen sich Fragen beantworten, die vorher unerreichbar waren – und es entstehen Fehler, die vorher unmöglich waren.
Das kann ich jetzt
- Ich kann
COUNT,SUM,AVG,MINundMAXeinsetzen und den Unterschied zwischenCOUNT(*)undCOUNT(spalte)erklären. (4.1) - Ich kann mit
GROUP BYgruppieren und halte dabei die goldene Regel ein. (4.2) - Ich kann
WHEREundHAVINGauseinanderhalten und begründen, warum es beides gibt. (4.3) - Ich kann Unterabfragen an den Stellen
WHERE,SELECTundFROMeinsetzen. (4.4) - Ich kann die Auswertungsreihenfolge einer Abfrage aufsagen und damit erklären, warum bestimmte Formulierungen scheitern. (4.5)
Gemischte Aufgaben
Aufgabe 1: Vier Auswertungen
a) Wie viele Auftritte fanden auf jeder Bühne statt, und wie viele Zuschauer kamen dort im Durchschnitt? Ausgabe: Bühnenname, Anzahl, gerundeter Durchschnitt – die Bühne mit den meisten Auftritten zuerst.
b) Welche Bands sind mehr als zweimal aufgetreten? Ausgabe: Bandname und Anzahl.
c) Wie viele Bands hat jedes Genre? Ausgabe: Genrename und Anzahl, absteigend.
d) Welche Auftritte haben mehr Zuschauer als der Durchschnitt aller Auftritte? Gib nur die Anzahl solcher Auftritte aus.
Tipp 1: Woran erkenne ich, dass ich gruppieren muss?
An Formulierungen wie „je", „pro", „für jede". Steht in der Frage „auf jeder Bühne", dann ist buehne das Gruppierungsmerkmal.
Die Frage „Wie viele Auftritte gab es insgesamt?" braucht dagegen kein GROUP BY – dort ist die ganze Tabelle eine einzige Gruppe.
Tipp 2: zu b)
Die Bedingung „mehr als zweimal" betrifft nicht einzelne Zeilen, sondern Gruppen. Sie gehört deshalb nicht ins WHERE, sondern ins HAVING – und zwar nach dem GROUP BY.
Tipp 3: zu d)
Du brauchst zwei Werte: die Zuschauerzahl jedes Auftritts und den Durchschnitt über alle. Der Durchschnitt ist eine einzige Zahl – die berechnet eine Unterabfrage im WHERE:
WHERE zuschauer > (SELECT AVG(zuschauer) FROM auftritt)
Aufgabe 2: Vier Abfragen, die nicht tun, was sie sollen
-- a) Gesucht: Bands mit mehr als zwei Auftritten
SELECT b.name FROM band b JOIN auftritt a ON a.band_id = b.band_id
WHERE COUNT(*) > 2 GROUP BY b.band_id;
-- b) Gesucht: je Bühne die Zahl der Auftritte
SELECT bu.name, a.datum, COUNT(*) FROM buehne bu
JOIN auftritt a ON a.buehne_id = bu.buehne_id GROUP BY bu.buehne_id;
-- c) Gesucht: die Zahl der Bewertungen je Auftritt am 18. Juli
SELECT auftritt_id, COUNT(*) FROM bewertung GROUP BY auftritt_id
HAVING auftritt_id IN (SELECT auftritt_id FROM auftritt WHERE datum = '2026-07-18');
-- d) Gesucht: der Auftritt mit den meisten Zuschauern
SELECT MAX(zuschauer), datum, beginn FROM auftritt;
Sag für jede: Bricht sie ab oder läuft sie durch? Was ist der Fehler, und wie lautet die richtige Fassung?
Tipp
Denk an die Auswertungsreihenfolge: FROM, WHERE, GROUP BY, HAVING, SELECT, ORDER BY. Alles, was zum Zeitpunkt einer Klausel noch nicht existiert, kann dort auch nicht benutzt werden.
Aufgabe 3: Eine Abfrage vorlesen
SELECT b.name, COUNT(*) AS auftritte, ROUND(AVG(a.zuschauer), 0) AS schnitt
FROM band b
JOIN auftritt a ON a.band_id = b.band_id
WHERE a.dauer_min >= 60
GROUP BY b.band_id, b.name
HAVING COUNT(*) >= 2
ORDER BY schnitt DESC
LIMIT 3;
a) Beschreibe in einem deutschen Satz, was diese Abfrage liefert.
b) Nenne die Auswertungsschritte in der Reihenfolge, in der das Datenbanksystem sie abarbeitet, und sag jeweils, was danach vorliegt.
c) An welcher Stelle wirkt dauer_min >= 60, an welcher COUNT(*) >= 2? Warum lassen sich die beiden Bedingungen nicht tauschen?
d) Warum darf im ORDER BY der Name schnitt stehen, obwohl es diese Spalte in der Tabelle nicht gibt?