Skip to content

Kapitel 8: Aggregatfunktionen und Gruppenabfragen

8.1 Häufig verwendete Aggregatfunktionen ⭐

Aggregatfunktionen berechnen Werte aus mehreren Zeilen und geben ein einziges Ergebnis zurück.

FunktionBedeutungBeispiel
COUNT()Anzahl der Zeilen zählenSELECT COUNT(*) FROM users;
SUM()Summe berechnenSELECT SUM(preis) FROM products;
AVG()Durchschnitt berechnenSELECT AVG(alter) FROM users;
MAX()Maximalwert findenSELECT MAX(preis) FROM products;
MIN()Minimalwert findenSELECT 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.

WHEREHAVING
Wann anwendenVor GruppierungNach Gruppierung
Kann Aggregatfunktionen verwendenNeinJa
SyntaxWHERE bedingungHAVING 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 BY gruppiert
  • ✅ Den Unterschied zwischen WHERE und HAVING
  • ✅ Wie man Gruppen mit HAVING filtert
  • ✅ Praxisbeispiele für Statistiken und Berichte

Übungen

  1. Praxis: Erstelle eine Tabelle scores mit Feldern student_id, fach, punkte
  2. COUNT: Zähle die Anzahl der Schüler pro Fach
  3. AVG: Berechne den Durchschnitt pro Fach
  4. GROUP BY: Finde die Fächer mit Durchschnitt über 75 Punkten
  5. 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!

Frei für alle Anfänger