Viele Zeilen, ein Wert
- Aggregatfunktion:fasst die Werte einer Spalte zu einem Wert zusammen.
- COUNT:
COUNT(*)zählt Zeilen;COUNT(Attribut)zählt nur Zeilen, in denen das Attribut nichtNULList. - SUM, AVG:Summe und Mittelwert einer Zahlenspalte.
- MIN, MAX:kleinster und größter Wert — auch bei Texten (alphabetisch) und Datumswerten.
- Mit WHERE:erst filtert
WHEREdie Zeilen, dann wird über den Rest gerechnet.
SELECT COUNT(*) AS Anzahl, AVG(Runden) AS Schnitt
FROM Lauf
WHERE Klasse = '10a';
Aggregatfunktion: Sie fasst die Werte einer Spalte zu einem Wert zusammen: COUNT, SUM, AVG, MIN, MAX.
COUNT: COUNT(*) zählt Zeilen, COUNT(Attribut) nur Zeilen, in denen das Attribut nicht NULL ist.
Mit WHERE: Erst filtert WHERE die Zeilen, dann wird über den Rest gerechnet. MIN und MAX gehen auch bei Text und Datum.
Gruppen bilden
- GROUP BY:bildet für jeden Wert des Gruppierungsattributs eine Gruppe — jede Gruppe wird zu einer Ergebniszeile.
- SELECT-Regel:im
SELECTstehen nur Gruppierungsattribute und Aggregatfunktionen. - HAVING:filtert ganze Gruppen nach einem Aggregatwert, z. B.
HAVING COUNT(*) > 3. - WHERE oder HAVING:
WHEREwirkt auf Zeilen vor dem Gruppieren,HAVINGauf Gruppen danach.
Wähle eine Funktion und schalte GROUP BY ein. „Überlagern“ legt die Zeilen jeder Gruppe übereinander und rechnet sie zu einer Ergebniszeile zusammen — vergleiche links die Tabelle mit rechts dem Ergebnis.
Halte fest: Ohne GROUP BY wird die ganze Tabelle zu einer Zeile. Mit GROUP BY Klasse entsteht eine Zeile pro Klasse; HAVING streicht danach ganze Gruppen.
Herleitung:
SELECT *
FROM Ausleihe;SELECT Genre, COUNT(*), AVG(Tage)
FROM Ausleihe
GROUP BY Genre;SELECT Genre, COUNT(*) AS Anzahl, AVG(Tage) AS Schnitt
FROM Ausleihe
GROUP BY Genre
HAVING COUNT(*) > 2
ORDER BY Anzahl DESC;Gruppierte Abfrage: SELECT Gruppenattribut, AGG(Attribut) FROM Tabelle WHERE Zeilenbedingung GROUP BY Gruppenattribut HAVING Gruppenbedingung;
GROUP BY: Jeder Wert des Gruppierungsattributs bildet eine Gruppe, jede Gruppe wird eine Ergebniszeile. Im SELECT stehen nur Gruppierungsattribute und Aggregatfunktionen.
WHERE oder HAVING: WHERE wirkt auf Zeilen vor dem Gruppieren, HAVING auf Gruppen danach.
Allgemeine Hinweise
WHERE kennt keine Summen
WHERE COUNT(*) > 2 ist ein Fehler: Beim Filtern der Zeilen gibt es noch keine Gruppen. Bedingungen an Aggregate gehören in HAVING.
Fremde Spalten im SELECT
SELECT Name, AVG(Runden) … GROUP BY Klasse ist unzulässig: Welcher Name soll für die ganze Klasse stehen?
COUNT(*) oder COUNT(Spalte)?
Sobald NULL-Werte möglich sind, liefern beide verschiedene Zahlen. Lies genau, ob Zeilen oder vorhandene Werte gezählt werden sollen.
