Level 5: Eine Tabelle zusammenfassen: Aggregate
Aktualisiert am
Anfänger · Level 5 von 20. Ziel: Eine Summe, einen Durchschnitt, ein Minimum oder eine Zeilenzahl über eine ganze Tabelle berechnen.
Themen: COUNT(*) COUNT(spalte) SUM AVG MIN MAX ROUND
Lektion
Bisher ergab jede Zeile der Tabelle eine Ergebniszeile. Eine Aggregatfunktion macht das Gegenteil: Sie fasst mehrere Zeilen zu einem einzigen Wert zusammen. COUNT zählt, SUM addiert, AVG berechnet den Durchschnitt, MIN und MAX liefern den kleinsten und den größten Wert.
Ohne weitere Angabe gilt das Aggregat für die ganze Tabelle, und das Ergebnis passt in eine einzige Zeile. SELECT COUNT(*), AVG(rating) FROM movies beantwortet zwei Fragen auf einmal: wie viele Filme und welche Durchschnittsbewertung.
COUNT hat zwei Formen. COUNT(*) zählt alle Zeilen. COUNT(column) zählt nur die Zeilen, in denen die Spalte gefüllt ist: Bei den Filmen ergibt COUNT(*) 10, aber COUNT(director_id) 9, weil Deep Current keinen Regisseur hat. Die anderen Aggregate ignorieren NULL ebenfalls: AVG bildet den Durchschnitt nur der bekannten Werte.
MIN und MAX funktionieren auch mit Texten (alphabetische Reihenfolge) und mit Datumsangaben (das älteste, das neueste).
Das WHERE wirkt vor dem Aggregat: Man wählt zuerst die Zeilen aus und fasst sie dann zusammen. SELECT AVG(grade) FROM grades WHERE subject = 'math' liefert den Durchschnitt nur der Mathenoten. Wenn keine Zeile den Filter passiert, liefert COUNT 0, aber SUM, AVG, MIN und MAX liefern NULL.
ROUND(value, n) rundet auf n Nachkommastellen: ROUND(AVG(grade), 1). Ein Durchschnitt hat oft viele Nachkommastellen: Runde ihn für die Anzeige.
Eine wichtige Grenze: Ohne Gruppierung kann man keine gewöhnliche Spalte neben einem Aggregat anzeigen. SELECT title, MAX(rating) ergibt im Standard-SQL keinen Sinn: MAX liefert einen einzigen Wert, aber welcher Titel soll daneben stehen? Level 14 zeigt die richtige Methode.
Syntax
SELECT COUNT(*) AS anzahl, AVG(spalte) AS mittel, MAX(spalte) AS maximum
FROM meine_tabelle
WHERE …;Kommentiertes Beispiel
SELECT COUNT(*) AS nb_movies,
AVG(rating) AS avg_rating,
MAX(duration) AS longest
FROM movies;Die ganze Tabelle wird in einer einzigen Zeile zusammengefasst: 10 Filme, ihre Durchschnittsbewertung und die Dauer des längsten.
| id | title | genre | year | duration | rating | director_id |
|---|---|---|---|---|---|---|
| 1 | Night Train | Thriller | 2015 | 118 | 7.8 | 1 |
| 2 | Blue Harbor | Drama | 2018 | 102 | 7.1 | 2 |
| 3 | Paper Moon City | Comedy | 2012 | 95 | 6.4 | 5 |
| 4 | Silent Peak | Drama | 2020 | 131 | 8.2 | 3 |
| 5 | Last Signal | Sci-Fi | 2019 | 142 | 7.5 | 1 |
| 6 | Summer Keys | Comedy | 2016 | 88 | 5.9 | 4 |
| 7 | Iron Garden | Sci-Fi | 2021 | 125 | 8 | 3 |
| 8 | Dust and Gold | Western | 2014 | 110 | 6.8 | 2 |
| 9 | The Quiet Hour | Drama | 2022 | 97 | 7.4 | 5 |
| 10 | Deep Current | Thriller | 2017 | 105 | 6.9 | NULL |
Ergebnis des Beispiels
| nb_movies | avg_rating | longest |
|---|---|---|
| 10 | 7.2 | 142 |
Das Wichtigste
- Ein Aggregat ohne GROUP BY liefert eine einzige Zeile.
- COUNT(*) zählt Zeilen, COUNT(spalte) nicht leere Werte.
- WHERE filtert vor der Berechnung.
Häufige Fallen
- Eine einfache Spalte und ein Aggregat ohne Gruppierung mischen (SELECT title, MAX(rating)) ist im Standard-SQL ein Fehler, auch wenn SQLite es akzeptiert.
- AVG über eine Spalte mit NULL-Werten mittelt nur die bekannten Werte.
SQLite-Besonderheit
SQLite akzeptiert SELECT title, MAX(rating) FROM movies und liefert den Titel des bestbewerteten Films: eine „nackte Spalte“, eine Besonderheit von SQLite. PostgreSQL, SQL Server und Oracle lehnen diese Abfrage ab. Die portable Methode (eine Unterabfrage) kommt in Level 14.
Die 5 Übungen des Levels
- Wie viele Bücher enthält die Tabelle books?
- Wie viele Plätze wurden insgesamt verkauft, über alle Flüge?
- Zeige das Datum der ersten Ausleihe (first_loan) und das der letzten Ausleihe (last_loan).
- Wie viele Kontakte haben eine E-Mail-Adresse?
- Zeige für die Mathenoten in einer einzigen Zeile: die Anzahl der Noten (nb_grades), ihren auf eine Nachkommastelle gerundeten Durchschnitt (avg_math) und den Abstand zwischen der besten und der schlechtesten Note (spread).
In SpeedQL wird jede Abfrage sofort geprüft: Ihr Ergebnis wird mit dem erwarteten verglichen, dann läuft die Abfrage noch einmal auf einer versteckten Kontrolldatenbank. Zu jeder Übung gibt es schriftliche Hinweise, die du nur bei Bedarf aufrufst.
Die Übungen von Level 5 machen
Kostenlos und ohne Anmeldung: Die Lektion und die 5 Übungen öffnen sich direkt in deinem Browser.
← Vorheriges Level: Sortieren, begrenzen, Duplikate entfernen · Nächstes Level: Mit Text und Datum arbeiten →