Wie viele Karten hat jeder Film verkauft?
Die Kinochefin will am Montag wissen, welcher Film am meisten eingebracht hat. Sie braucht keine 2.000 einzelnen Karten, sondern eine kurze Liste.
Eine Datenbank zählt und addiert für dich. Mit GROUP BY macht sie das für jeden Film einzeln.
Am Ende dieser Lektion
Notiz
Ich kann Daten mit COUNT, SUM und GROUP BY zusammenfassen.
Schlüsselwörter
| Begriff | Was er bedeutet | Beispiel |
|---|---|---|
| Aggregatfunktion | rechnet aus vielen Zeilen einen einzigen Wert | SUM |
| COUNT | zählt Zeilen | |
| Gruppe | alle Zeilen mit demselben Wert in einer Spalte | |
| GROUP BY | teilt die Zeilen in Gruppen und fasst jede zusammen | |
| HAVING | behält nur Gruppen, die eine Bedingung bestehen |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Eine Aggregatfunktion macht aus vielen Zeilen einen Wert
Fünf Funktionen brauchst du ständig. COUNT(*) zählt Zeilen. SUM(spalte) addiert, AVG(spalte) bildet den Durchschnitt. MIN und MAX finden den kleinsten und den größten Wert.
Eine solche Aggregatfunktion liefert eine einzige Zeile, auch wenn die Tabelle tausend hat.
Beispiel: vier Funktionen auf neun Karten
| Abfrage | Ergebnis |
|---|---|
| COUNT(*) | 9 |
| SUM(preis_euro) | 66 |
| MIN(preis_euro) | 6 |
| MAX(preis_euro) | 8 |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Probier es: alle Karten zusammenfassen
-- Wie viele Karten wurden verkauft, und was brachten sie ein?
SELECT COUNT(*) AS karten, SUM(preis_euro) AS summe, AVG(preis_euro) AS schnitt
FROM tickets;
-- Ergänze WHERE film_id = 1 und starte noch einmal.
Bevor du anfängst
Notiz
Drück oben in der Leiste auf Lab starten, warte auf beide Dienste und öffne das Terminal. Die zwei ersten Runs richten die Anmeldung ein. Alle Abfragen dieser Lektion lesen nur.
Das Zertifikat des Servers annehmen
printf '[client]\nssl-verify-server-cert=0\n' > ~/.my.cnfHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Eine Abkürzung für die Datenbank shop
alias sql='mariadb -h db -u student -pstudent shop -t -e'Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Artikel zählen und den Durchschnittspreis bilden
sql "SELECT COUNT(*) AS artikel, ROUND(AVG(price), 2) AS durchschnitt FROM products"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
GROUP BY macht aus jeder Gruppe eine Zeile
Oft willst du nicht einen Wert für alles, sondern einen je Film. GROUP BY film_id bildet eine Gruppe je Wert in dieser Spalte.
Jede Aggregatfunktion rechnet dann nur innerhalb ihrer Gruppe. Du bekommst eine Ergebniszeile je Gruppe. Die Spalte, nach der du gruppierst, schreibst du auch hinter SELECT.
Beispiel: dieselben Karten, nach Film gruppiert
| film_id | COUNT(*) | SUM(preis_euro) |
|---|---|---|
| 1 | 4 | 30 |
| 2 | 3 | 20 |
| 3 | 2 | 16 |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Artikel je Kategorie zählen
sql "SELECT category_id, COUNT(*) AS anzahl FROM products WHERE category_id IS NOT NULL GROUP BY category_id ORDER BY category_id"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Bestellungen je Status zählen
sql "SELECT status, COUNT(*) AS anzahl FROM orders GROUP BY status ORDER BY status"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Probier es: Einnahmen je Film
-- Karten und Einnahmen je Film.
SELECT film_id, COUNT(*) AS karten, SUM(preis_euro) AS summe
FROM tickets
GROUP BY film_id
ORDER BY film_id;
-- Ergänze HAVING COUNT(*) >= 3 hinter GROUP BY.
HAVING filtert Gruppen, WHERE filtert Zeilen
WHERE prüft jede Zeile, bevor gruppiert wird. HAVING prüft jede Gruppe, nachdem sie gerechnet ist.
Willst du nur Filme mit mindestens drei Karten, schreibst du HAVING COUNT(*) >= 3. Die Zahl der Karten gibt es vor dem Gruppieren noch nicht, also kann WHERE sie nicht prüfen.
Ein häufiger Fehler
Warnung
Viele schreiben WHERE COUNT(*) > 5 und bekommen einen Fehler. WHERE läuft vor dem Zählen. Schreib die Bedingung an einer Gruppe in HAVING, und die Bedingung an einer einzelnen Zeile in WHERE.
Lieferanten mit mindestens sechs Artikeln
sql "SELECT supplier_id, COUNT(*) AS artikel FROM products GROUP BY supplier_id HAVING COUNT(*) >= 6 ORDER BY supplier_id"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Der Fehler, echt gestartet
sql "SELECT supplier_id, COUNT(*) AS artikel FROM products WHERE COUNT(*) >= 6 GROUP BY supplier_id"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.