Lösung Übung C: Durchschnitt der Mathenoten (HAVING)
Lösung Übung C: Durchschnitt der Mathenoten (HAVING)
E)
Zeige den Durchschnitt der Mathenoten aller Schüler an, deren Name mit einem B beginnt.
Berücksichtigte dabei nur die Schüler, die eine Note besser als 3 haben.
SELECT AVG(noteMathe) AS "Durchschnitt Mathe" FROM schueler WHERE name LIKE 'B%' AND noteMathe < 3
Vielleicht hast Du folgende Lösung überlegt:
SELECT AVG(noteMathe) AS "Durchschnitt Mathe"
FROM schueler
WHERE name LIKE 'B%'
HAVING noteMathe < 3;
Die Anweisung ist formal falsch bzw. logisch inkorrekt, weil HAVING hier falsch verwendet wird:
Problem: HAVING wird ohne passende Aggregation / Gruppierung verwedet.
HAVING wird verwendet, um Gruppen nach einer Aggregation zu filtern (also nach GROUP BY). In dieser Abfrage gibt es keine GROUP BY-Klausel. Außerdem bezieht sich HAVING hier auf noteMathe, also eine nicht aggregierte Spalte.
Das ist in den meisten SQL-Dialekten nicht erlaubt oder zumindest logisch falsch.
Wann wäre HAVING richtig?
Wenn du z. B. nach dem Durchschnitt filtern willst:
SELECT AVG(noteMathe) AS "Durchschnitt Mathe"
FROM schueler
WHERE name LIKE 'B%'
HAVING AVG(noteMathe) < 3;
Hier ist HAVING korrekt, weil es sich auf das Aggregationsergebnis bezieht.