Grundlagen der Datenbanken
Aus einer Mitarbeitertabelle (MitarbeiterNr, Abteilung, Gehalt) sollen die Abteilungen mit einem Durchschnittsgehalt von 300 oder mehr samt diesem Durchschnitt ermittelt werden. Welche SQL-Anweisung ist richtig?
- ASELECT Abteilung, AVG(Gehalt) FROM Mitarbeiter GROUP BY Abteilung HAVING AVG(Gehalt) >= 300
- BSELECT Abteilung, AVG(Gehalt) FROM Mitarbeiter WHERE AVG(Gehalt) >= 300 GROUP BY Abteilung
- CSELECT Abteilung, AVG(Gehalt) FROM Mitarbeiter WHERE Gehalt >= 300 GROUP BY Abteilung
Antwort und Erläuterung anzeigen
Antwort: A. SELECT Abteilung, AVG(Gehalt) FROM Mitarbeiter GROUP BY Abteilung HAVING AVG(Gehalt) >= 300
Die Verarbeitung in SQL denkt man sich in dieser Reihenfolge: WHERE wählt Zeilen aus der Tabelle in FROM aus, GROUP BY fasst sie zu Gruppen zusammen, und HAVING wählt Gruppen aus. WHERE ist eine Bedingung für einzelne Zeilen und wird vor der Gruppierung ausgewertet, daher können darin keine Aggregatfunktionen wie AVG stehen. Eine Bedingung für das Aggregat jeder Gruppe gehört in HAVING; HAVING AVG(Gehalt) >= 300 ist also die richtige Form. Mit WHERE Gehalt >= 300 werden vor der Mittelwertbildung nur Mitarbeiter mit 300 oder mehr ausgewählt, was etwas anderes bedeutet, nämlich den Durchschnitt nur über diese Mitarbeiter; eine Abteilung, deren Gesamtdurchschnitt unter 300 liegt, erscheint dann trotzdem im Ergebnis, sofern mindestens ein Mitarbeiter 300 oder mehr verdient.