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.