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?

  1. ASELECT Abteilung, AVG(Gehalt) FROM Mitarbeiter GROUP BY Abteilung HAVING AVG(Gehalt) >= 300
  2. BSELECT Abteilung, AVG(Gehalt) FROM Mitarbeiter WHERE AVG(Gehalt) >= 300 GROUP BY Abteilung
  3. 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.

Dieses Thema üben Zur Themenseite

Weitere Fragen zu Grundlagen der Datenbanken

  1. Eine Umsatztabelle (Filiale, Betrag) enthält sieben Zeilen: (A, 500), (A, 700), (B, 300), (B, 400), (C, 1200), (D, 200), (D, 900). Wie viele Zeilen liefert SELECT Filiale, SUM(Betrag) FROM Umsatz GROUP BY Filiale HAVING SUM(Betrag) >= 1000?
  2. Eine Mitarbeitertabelle (Name, Abteilung, Gehalt) hat 8 Zeilen mit folgenden Gehältern je Abteilung: Vertrieb 320, 280, 350; Entwicklung 400, 310; Verwaltung 260, 300; Planung 330. Wie viele Zeilen liefert SELECT Abteilung, COUNT(*) FROM Mitarbeiter WHERE Gehalt >= 300 GROUP BY Abteilung HAVING COUNT(*) >= 2?
  3. Eine Mitarbeitertabelle (MitarbeiterNr, Name, AbteilungsID) hat 4 Zeilen mit den AbteilungsID-Werten 10, 20, 10 und NULL in dieser Reihenfolge. Eine Abteilungstabelle (AbteilungsID, Abteilungsname) hat 3 Zeilen mit AbteilungsID 10, 20 und 30. Wie viele Zeilen liefert SELECT Mitarbeiter.Name, Abteilung.Abteilungsname FROM Mitarbeiter INNER JOIN Abteilung ON Mitarbeiter.AbteilungsID = Abteilung.AbteilungsID?
  4. Eine Mitarbeitertabelle (MitarbeiterNr, Name, AbteilungsID) hat 5 Zeilen mit den AbteilungsID-Werten 10, 20, 10, NULL und NULL in dieser Reihenfolge. Eine Abteilungstabelle (AbteilungsID, Abteilungsname) hat 3 Zeilen mit AbteilungsID 10, 20 und 30. Wie viele Zeilen liefert SELECT Abteilung.Abteilungsname, Mitarbeiter.Name FROM Abteilung LEFT OUTER JOIN Mitarbeiter ON Abteilung.AbteilungsID = Mitarbeiter.AbteilungsID?
  5. Spalte x der Tabelle R hat 4 Zeilen mit den Werten 1, 1, 2, 3, und Spalte x der Tabelle S hat 4 Zeilen mit den Werten 1, 1, 2, 4. Wie viele Zeilen liefert SELECT * FROM R INNER JOIN S ON R.x = S.x?