Gruppen filtern mit HAVING
Welche Genres haben mindestens 3 Spiele? WHERE filtert Zeilen, also könntest du Folgendes versuchen:
SELECT genre, COUNT(*) AS anzahl_spiele
FROM spiele
WHERE COUNT(*) >= 3
GROUP BY genre;Error on line 1: misuse of aggregate: COUNT()Die Datenbank beschwert sich, dass COUNT an einer Stelle steht, wo es nicht hingehört. WHERE prüft die Zeilen einzeln, bevor sie gruppiert werden, und zu diesem Zeitpunkt gibt es noch nichts zu zählen. Um Gruppen zu filtern, hat SQL HAVING. Es steht direkt nach GROUP BY, und seine Bedingung wird für jede Gruppe geprüft, sobald die Aggregatfunktionen berechnet sind:
SELECT genre, COUNT(*) AS anzahl_spiele
FROM spiele
GROUP BY genre
HAVING COUNT(*) >= 3
ORDER BY genre;| genre | anzahl_spiele |
|---|---|
| Action | 4 |
| Adventure | 3 |
| Strategie | 3 |
Die Gruppen, die die Bedingung nicht erfüllen, fehlen im Ergebnis. In HAVING kannst du alles benutzen, was du aus WHERE kennst: Vergleiche, AND, OR, NOT, BETWEEN … und Aggregatfunktionen, sogar solche, die nicht in SELECT stehen. Das sind die Genres, deren Spiele im Durchschnitt höchstens 25 € kosten:
SELECT genre
FROM spiele
GROUP BY genre
HAVING AVG(preis) <= 25
ORDER BY genre;| genre |
|---|
| Adventure |
| Puzzle |
| Rennspiel |
| Simulation |
Die Teile einer Abfrage werden in dieser Reihenfolge geschrieben: SELECT, FROM, WHERE, GROUP BY, HAVING, ORDER BY, LIMIT.
Typischer Fehler: WHERE statt HAVING, wie in der ersten Abfrage. Wann immer eine Bedingung eine Aggregatfunktion enthält, gehört sie in HAVING.
So schreibst du es:
Anweisungen
- 1
Zeige die Kunden, die mindestens 3 Bestellungen aufgegeben haben:
kunde_idund die Anzahl ihrer Bestellungen in einer Spalteanzahl_bestellungen, sortiert nachkunde_id:kunde_id anzahl_bestellungen 1 4 2 3 3 4 4 3 6 3 - 2
Zeige darunter die Bestellungen, die mehr als 60 € wert sind:
bestellung_idund die Summe vonmenge * preisin einer Spaltebestellsumme, die teuerste zuerst, und Bestellungen mit derselben Summe nachbestellung_id:bestellung_id bestellsumme 11 85 14 75 5 65 10 65 25 65 - 3
Und die Spiele, die mindestens 2 Bewertungen und durchschnittlich mindestens 4 Sterne haben:
spiel_id, die Anzahl der Bewertungen in einer Spalteanzahl_bewertungenund die durchschnittlichen Sterne, auf 2 Nachkommastellen gerundet, in einer Spaltedurchschnitt_sterne, sortiert nachspiel_id:spiel_id anzahl_bewertungen durchschnitt_sterne 1 4 4.25 3 2 4.5 6 2 4.0 7 2 4.5 10 2 4.5 15 2 4.5