Appearance
Kapitel 8: Aggregatfunktionen und Gruppenabfragen
8.1 Häufig verwendete Aggregatfunktionen ⭐
Aggregatfunktionen berechnen Werte aus mehreren Zeilen und geben ein einziges Ergebnis zurück.
| Funktion | Bedeutung | Beispiel |
|---|---|---|
COUNT() | Anzahl der Zeilen zählen | SELECT COUNT(*) FROM users; |
SUM() | Summe berechnen | SELECT SUM(preis) FROM products; |
AVG() | Durchschnitt berechnen | SELECT AVG(alter) FROM users; |
MAX() | Maximalwert finden | SELECT MAX(preis) FROM products; |
MIN() | Minimalwert finden | SELECT MIN(alter) FROM users; |
1. COUNT() - Anzahl zählen
sql
-- Anzahl aller Benutzer zählen
SELECT COUNT(*) AS anzahl_benutzer FROM users;
-- Anzahl der Benutzer mit E-Mail-Adresse (NULL wird ignoriert)
SELECT COUNT(email) AS anzahl_mit_email FROM users;
-- Anzahl der eindeutigen Städte zählen
SELECT COUNT(DISTINCT stadt) AS anzahl_staedte FROM users;Ausgabe:
+-------------------+
| anzahl_benutzer |
+-------------------+
| 4 |
+-------------------+2. SUM() - Summe berechnen
sql
-- Gesamtwert des Lagerbestands berechnen
SELECT SUM(bestand) AS gesamt_bestand FROM products;
-- Gesamtwert des Lagers berechnen (Preis × Bestand)
SELECT SUM(preis * bestand) AS lager_wert FROM products;3. AVG() - Durchschnitt berechnen
sql
-- Durchschnittsalter der Benutzer berechnen
SELECT AVG(alter) AS durchschnittsalter FROM users;
-- Durchschnittspreis der Produkte berechnen
SELECT AVG(preis) AS durchschnittspreis FROM products;4. MAX() / MIN() - Maximal-/Minimalwert
sql
-- Teuerstes Produkt finden
SELECT MAX(preis) AS hoechster_preis FROM products;
-- Günstigstes Produkt finden
SELECT MIN(preis) AS guenstigster_preis FROM products;
-- Ältester und jüngster Benutzer
SELECT MAX(alter) AS aeltester, MIN(alter) AS juengster FROM users;8.2 Gruppenabfrage (GROUP BY) ⭐⭐
GROUP BY gruppiert Zeilen mit gleichen Werten in Zusammenfassungszeilen.
1. Basis-Syntax
sql
SELECT feld, aggregatfunktion()
FROM tabellen_name
GROUP BY feld;2. Beispiele
Beispiel 1: Anzahl der Benutzer pro Stadt
sql
SELECT
stadt,
COUNT(*) AS anzahl
FROM users
GROUP BY stadt;Ausgabe:
+----------+---------+
| stadt | anzahl |
+----------+---------+
| Berlin | 2 |
| Hamburg | 1 |
| München | 1 |
+----------+---------+Beispiel 2: Durchschnittspreis pro Kategorie
sql
SELECT
kategorie,
AVG(preis) AS durchschnittspreis,
COUNT(*) AS anzahl_produkte
FROM products
GROUP BY kategorie;Ausgabe:
+------------+---------------------+------------------+
| kategorie | durchschnittspreis | anzahl_produkte |
+------------+---------------------+------------------+
| Kleidung | 29.99 | 3 |
| Schuhe | 89.99 | 1 |
| Accessoires| 27.49 | 2 |
+------------+---------------------+------------------+8.3 Gruppenfilter (HAVING)
HAVING filtert Datensätze nach der Gruppierung. WHERE filtert vor der Gruppierung.
| WHERE | HAVING | |
|---|---|---|
| Wann anwenden | Vor Gruppierung | Nach Gruppierung |
| Kann Aggregatfunktionen verwenden | Nein | Ja |
| Syntax | WHERE bedingung | HAVING bedingung |
Beispiel
sql
-- Nur Städte mit mehr als 1 Benutzer anzeigen
SELECT
stadt,
COUNT(*) AS anzahl
FROM users
GROUP BY stadt
HAVING anzahl > 1;Ausgabe:
+--------+---------+
| stadt | anzahl |
+--------+---------+
| Berlin | 2 |
+--------+---------+Wichtiger Vergleich: WHERE vs HAVING
sql
-- ❌ Falsch: Aggregatfunktion in WHERE verwenden
SELECT stadt, COUNT(*) AS anzahl
FROM users
WHERE COUNT(*) > 1 -- FEHLER!
GROUP BY stadt;
-- ✅ Richtig: Aggregatfunktion in HAVING verwenden
SELECT stadt, COUNT(*) AS anzahl
FROM users
GROUP BY stadt
HAVING anzahl > 1; -- RICHTIG!8.4 Praxisbeispiel: Statistiken und Berichte
Szenario: Eine Online-Shop-Datenbank analysieren.
Schritt 1: Testdaten vorbereiten
sql
USE shop_db;
-- Tabelle "orders" erstellen
CREATE TABLE orders (
bestell_id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT,
produkt_name VARCHAR(200),
menge INT,
preis DECIMAL(10,2),
bestell_datum DATETIME DEFAULT CURRENT_TIMESTAMP
);
-- Testdaten einfügen
INSERT INTO orders (user_id, produkt_name, menge, preis)
VALUES
(1, 'T-Shirt Basic', 2, 19.99),
(1, 'Jeans', 1, 59.99),
(2, 'Sneaker', 1, 89.99),
(2, 'Kappe', 3, 14.99),
(3, 'Rucksack', 1, 39.99);Schritt 2: Verschiedene Statistiken erstellen
1. Gesamtumsatz des Shops berechnen:
sql
SELECT SUM(menge * preis) AS gesamt_umsatz
FROM orders;2. Umsatz pro Benutzer berechnen:
sql
SELECT
user_id,
SUM(menge * preis) AS umsatz_pro_benutzer
FROM orders
GROUP BY user_id;3. Benutzer mit Umsatz über 100 Euro anzeigen:
sql
SELECT
user_id,
SUM(menge * preis) AS umsatz
FROM orders
GROUP BY user_id
HAVING umsatz > 100;4. Anzahl der Bestellungen pro Produkt:
sql
SELECT
produkt_name,
SUM(menge) AS gesamt_menge
FROM orders
GROUP BY produkt_name
ORDER BY gesamt_menge DESC;Häufige Fehler für Einsteiger
Fehler 1: Aggregatfunktionen mit normalen Feldern mischen
sql
-- ❌ Falsch: Feld ohne GROUP BY in SELECT mit Aggregatfunktion
SELECT user_id, SUM(preis) FROM orders; -- FEHLER!
-- ✅ Richtig: Entweder GROUP BY verwenden oder nur Aggregatfunktionen
SELECT user_id, SUM(preis) FROM orders GROUP BY user_id;
-- oder
SELECT SUM(preis) FROM orders;Fehler 2: WHERE und HAVING verwechseln
sql
-- ❌ Falsch: HAVING vor GROUP BY verwenden
SELECT stadt, COUNT(*) FROM users HAVING anzahl > 1 GROUP BY stadt;
-- ✅ Richtig: WHERE → GROUP BY → HAVING
SELECT stadt, COUNT(*) AS anzahl
FROM users
GROUP BY stadt
HAVING anzahl > 1;Fehler 3: GROUP BY Reihenfolge falsch
sql
-- ❌ Falsch: SELECT-Feld ist nicht in GROUP BY
SELECT stadt, email, COUNT(*) FROM users GROUP BY stadt; -- FEHLER!
-- ✅ Richtig: Alle nicht-aggregierten Felder müssen in GROUP BY sein
SELECT stadt, email, COUNT(*) FROM users GROUP BY stadt, email;Zusammenfassung
In diesem Kapitel hast du gelernt:
- ✅ Die 5 wichtigsten Aggregatfunktionen (
COUNT,SUM,AVG,MAX,MIN) - ✅ Wie man Daten mit
GROUP BYgruppiert - ✅ Den Unterschied zwischen
WHEREundHAVING - ✅ Wie man Gruppen mit
HAVINGfiltert - ✅ Praxisbeispiele für Statistiken und Berichte
Übungen
- Praxis: Erstelle eine Tabelle
scoresmit Feldernstudent_id,fach,punkte - COUNT: Zähle die Anzahl der Schüler pro Fach
- AVG: Berechne den Durchschnitt pro Fach
- GROUP BY: Finde die Fächer mit Durchschnitt über 75 Punkten
- SUM: Berechne die Gesamtpunktzahl pro Schüler
Nächstes Kapitel
Im nächsten Kapitel lernen wir Tabellenverbindungen (JOINs) - wie man Daten aus mehreren Tabellen gleichzeitig abfragt!
