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.
| Funktion | Bedeutung | Beispiel |
|---|---|---|
COUNT(*) | Anzahl Zeilen zählen | SELECT COUNT(*) FROM kunden |
SUM(spalte) | Summe berechnen | SELECT SUM(preis) FROM bestellungen |
AVG(spalte) | Durchschnitt berechnen | SELECT AVG(alter) FROM kunden |
MIN(spalte) | Kleinster Wert | SELECT MIN(preis) FROM produkte |
MAX(spalte) | Grösster Wert | SELECT 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;
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
| Schritt | Was passiert |
|---|---|
FROM | Tabelle(n) laden (inkl. JOINs) |
WHERE | Einzelne Zeilen filtern |
GROUP BY | Zeilen in Gruppen zusammenfassen |
HAVING | Gruppen filtern |
SELECT | Spalten auswählen & Aliase vergeben |
ORDER BY | Ergebnis sortieren |
Das erklärt, warum ein in SELECT definierter Alias in WHERE nicht verwendet werden kann — WHERE wird vor SELECT ausgeführt.