Sortieren & Aggregieren
M164 Block 2 von 5 — ORDER BY, Aggregatfunktionen, GROUP BY
Aufbauend auf Block 1. Hier lernst du, Ergebnisse zu sortieren, Duplikate zu entfernen und Berechnungen über mehrere Zeilen durchzuführen.

ORDER BY & DISTINCT

ORDER BY sortiert das Ergebnis. Standard ist aufsteigend (ASC), mit DESC sortiert man absteigend. Mehrere Spalten sind möglich.

-- Aufsteigend (Standard)
SELECT * FROM produkte ORDER BY preis ASC;

-- Absteigend
SELECT * FROM produkte ORDER BY preis DESC;

-- Erst nach Nachname, dann Vorname
SELECT * FROM kunden ORDER BY nachname ASC, vorname ASC;

DISTINCT entfernt doppelte Zeilen aus dem Ergebnis. Nützlich um alle verschiedenen Werte einer Spalte zu sehen:

-- Alle einzigartigen Länder in der Kundentabelle
SELECT DISTINCT land FROM kunden;

Aggregatfunktionen

Aggregatfunktionen fassen mehrere Zeilen zu einem einzigen Ergebniswert zusammen. Sie werden immer im SELECT-Teil angegeben.

FunktionBedeutungBeispiel
COUNT(*)Anzahl Zeilen zählenSELECT COUNT(*) FROM kunden
SUM(spalte)Summe berechnenSELECT SUM(preis) FROM bestellungen
AVG(spalte)Durchschnitt berechnenSELECT AVG(alter) FROM kunden
MIN(spalte)Kleinster WertSELECT MIN(preis) FROM produkte
MAX(spalte)Grösster WertSELECT MAX(preis) FROM produkte
-- Wie viele Kunden gibt es insgesamt?
SELECT COUNT(*) AS anzahl_kunden FROM kunden;

-- Durchschnittspreis aller Produkte
SELECT AVG(preis) AS durchschnittspreis FROM produkte;

-- Teuerste und günstigste Bestellung
SELECT MAX(preis) AS max, MIN(preis) AS min FROM bestellungen;

GROUP BY & HAVING

GROUP BY fasst Zeilen mit gleichem Wert zusammen. Aggregatfunktionen wirken dann auf jede Gruppe separat.

HAVING filtert die fertigen Gruppen — analog zu WHERE, aber nach der Gruppierung.

-- Anzahl Bestellungen pro Kunde
SELECT kunden_id, COUNT(*) AS anzahl
FROM bestellungen
GROUP BY kunden_id;

-- Nur Kunden mit mehr als 5 Bestellungen
SELECT kunden_id, COUNT(*) AS anzahl
FROM bestellungen
GROUP BY kunden_id
HAVING COUNT(*) > 5;

-- Umsatz pro Land, nur Länder über 10 000 CHF
SELECT land, SUM(preis) AS umsatz
FROM bestellungen
JOIN kunden ON bestellungen.kunden_id = kunden.id
GROUP BY land
HAVING SUM(preis) > 10000;
Merkhilfe: WHERE filtert vor dem Gruppieren (einzelne Zeilen). HAVING filtert nach dem Gruppieren (ganze Gruppen).

Vollständige Ausführungsreihenfolge

SQL verarbeitet alle Klauseln intern in dieser festen Reihenfolge — unabhängig davon, wie sie geschrieben stehen:

FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY
SchrittWas passiert
FROMTabelle(n) laden (inkl. JOINs)
WHEREEinzelne Zeilen filtern
GROUP BYZeilen in Gruppen zusammenfassen
HAVINGGruppen filtern
SELECTSpalten auswählen & Aliase vergeben
ORDER BYErgebnis sortieren

Das erklärt, warum ein in SELECT definierter Alias in WHERE nicht verwendet werden kann — WHERE wird vor SELECT ausgeführt.