SQL MIN & MAX

6 Kernkonzepte
Die wichtigsten Konzepte für MIN und MAX in SQL: MIN · MAX · GROUP BY · HAVING · Subqueries · Window Functions Mit MIN und MAX ermitteln Sie den kleinsten und größten Wert in einer Spalte. Diese Aggregatfunktionen sind essenziell für Auswertungen, Berichte und die Datenanalyse.

MIN / MAX – Kleinste und größte Werte

MIN(spalte) · MAX(spalte)
SELECT MIN(preis) AS "min_preis", MAX(preis) AS "max_preis" FROM produkte;

MIN und MAX sind Aggregatfunktionen, die den kleinsten bzw. größten Wert in einer Spalte zurückgeben. Sie können auf numerische, textuelle und Datums-Spalten angewendet werden.

Übersicht der Anwendungen

Datentyp MIN MAX
Numerisch Kleinste Zahl Größte Zahl
Text (String) Erster Wert (alphabetisch) Letzter Wert (alphabetisch)
Datum/Zeit Ältestes Datum Neuestes Datum
Beispiele
-- Minimaler und maximaler Preis
SELECT
MIN(preis) AS "billigster",
MAX(preis) AS "teuerster"
FROM produkte;
-- Älteste und neueste Bestellung
SELECT
MIN(datum) AS "erste_bestellung",
MAX(datum) AS "letzte_bestellung"
FROM bestellungen;
-- Erste und letzte Kunden (alphabetisch)
SELECT
MIN(name) AS "erster",
MAX(name) AS "letzter"
FROM kunden;
Typische Ausgabe:
billigster | teuerster
9.99 | 1299.99
Tipp: MIN und MAX ignorieren NULL-Werte. Wenn alle Werte NULL sind, ist das Ergebnis NULL. Für Textspalten wird die alphabetische Sortierung verwendet (abhängig vom Datenbank-Collation).

MIN / MAX mit GROUP BY – Pro Gruppe

GROUP BY spalte · MIN() · MAX()
SELECT kategorie, MIN(preis) AS "min_preis", MAX(preis) AS "max_preis" FROM produkte GROUP BY kategorie;

GROUP BY in Kombination mit MIN und MAX ermöglicht die Berechnung von Minimal- und Maximalwerten für jede Gruppe – z.B. den billigsten und teuersten Artikel pro Kategorie.

Beispiele
-- Min/Max Preis pro Kategorie
SELECT
kategorie,
MIN(preis) AS "min_preis",
MAX(preis) AS "max_preis"
FROM produkte
GROUP BY kategorie;
-- Erste und letzte Bestellung pro Kunde
SELECT
kunde_id,
MIN(datum) AS "erste_bestellung",
MAX(datum) AS "letzte_bestellung"
FROM bestellungen
GROUP BY kunde_id;
-- Mit mehreren Gruppierungsspalten
SELECT
kategorie,
hersteller,
MIN(preis) AS "min_preis",
MAX(preis) AS "max_preis"
FROM produkte
GROUP BY kategorie, hersteller;
Typische Ausgabe (Kategorie):
kategorie | min_preis | max_preis
Elektronik | 29.99 | 1299.99
Bücher | 9.99 | 49.99
Kleidung | 19.99 | 89.99
Tipp: Alle Spalten im SELECT, die nicht aggregiert werden, müssen in der GROUP BY-Klausel aufgeführt werden. Sonst erhalten Sie einen Fehler (oder undefinierte Ergebnisse).

MIN / MAX mit HAVING – Gruppen filtern

HAVING MIN() > x · HAVING MAX() < y
SELECT kategorie, MIN(preis) AS "min_preis", MAX(preis) AS "max_preis" FROM produkte GROUP BY kategorie HAVING MIN(preis) > 10;

HAVING filtert Gruppen nach Aggregatwerten – ähnlich wie WHERE, aber nach der Gruppierung. Damit können Sie nur Gruppen anzeigen, deren MIN oder MAX eine bestimmte Bedingung erfüllt.

Beispiele
-- Kategorien mit günstigstem Artikel > 50 €
SELECT
kategorie,
MIN(preis) AS "min_preis",
MAX(preis) AS "max_preis"
FROM produkte
GROUP BY kategorie
HAVING MIN(preis) > 50;
-- Kategorien mit teuerstem Artikel < 100 €
SELECT
kategorie,
MIN(preis) AS "min_preis",
MAX(preis) AS "max_preis"
FROM produkte
GROUP BY kategorie
HAVING MAX(preis) < 100;
-- Kategorien mit Preisspanne > 200 €
SELECT
kategorie,
MIN(preis) AS "min_preis",
MAX(preis) AS "max_preis"
FROM produkte
GROUP BY kategorie
HAVING MAX(preis) - MIN(preis) > 200;
Tipp: WHERE filtert Zeilen vor der Gruppierung, HAVING filtert Gruppen nach der Aggregation. Für Bedingungen auf Aggregatfunktionen (wie MIN, MAX) muss HAVING verwendet werden.

MIN / MAX mit Subqueries – Verschachtelte Abfragen

WHERE preis = (SELECT MAX(...))
SELECT * FROM produkte WHERE preis = (SELECT MAX(preis) FROM produkte);

Subqueries mit MIN/MAX ermöglichen es, den Datensatz mit dem kleinsten oder größten Wert zu finden – z.B. das teuerste oder billigste Produkt.

Beispiele
-- Teuerstes Produkt
SELECT * FROM produkte
WHERE preis = (SELECT MAX(preis) FROM produkte);
-- Billigstes Produkt pro Kategorie
SELECT * FROM produkte p
WHERE preis = (
SELECT MIN(preis) FROM produkte p2
WHERE p2.kategorie = p.kategorie
);
-- Kunden mit der ersten Bestellung
SELECT * FROM bestellungen
WHERE datum = (
SELECT MIN(datum) FROM bestellungen
);
-- Teuerstes Produkt pro Kategorie mit ALL
SELECT * FROM produkte p
WHERE preis >= ALL (
SELECT preis FROM produkte p2
WHERE p2.kategorie = p.kategorie
);
Tipp: Bei Subqueries mit MIN/MAX sollten Sie darauf achten, dass die Subquery nur einen Wert zurückgibt. Für korrelierte Subqueries (mit Bezug zur äußeren Abfrage) kann die Performance bei großen Tabellen beeinträchtigt werden.

Window Functions – Erweiterte Analyse

MIN() OVER · MAX() OVER · RANK()
SELECT name, preis, kategorie, MIN(preis) OVER (PARTITION BY kategorie) AS "min_in_kategorie", MAX(preis) OVER (PARTITION BY kategorie) AS "max_in_kategorie" FROM produkte;

Window Functions mit MIN und MAX ermöglichen die Berechnung von Minimal- und Maximalwerten innerhalb eines Fensters (z.B. pro Kategorie), ohne die Zeilen zu gruppieren.

Beispiele
-- Min/Max Preis pro Kategorie (ohne Gruppierung)
SELECT
name, preis, kategorie,
MIN(preis) OVER (PARTITION BY kategorie) AS "min_preis_kategorie",
MAX(preis) OVER (PARTITION BY kategorie) AS "max_preis_kategorie"
FROM produkte;
-- Rangliste mit RANK()
SELECT
name, preis,
RANK() OVER (ORDER BY preis DESC) AS "rang"
FROM produkte;
-- Min/Max über gesamte Tabelle
SELECT
name, preis,
MIN(preis) OVER () AS "global_min",
MAX(preis) OVER () AS "global_max"
FROM produkte;
Typische Ausgabe (Window Function):
name | preis | kategorie | min_preis_kategorie | max_preis_kategorie
Laptop | 999.99| Elektronik | 29.99 | 1299.99
Maus | 29.99 | Elektronik | 29.99 | 1299.99
Buch | 19.99 | Bücher | 9.99 | 49.99
Tipp: Window Functions sind in PostgreSQL, SQL Server, Oracle und MySQL (ab Version 8.0) verfügbar. Sie sind besonders nützlich für Ranglisten, laufende Summen und Vergleiche innerhalb von Gruppen.

Praxis-Beispiele – MIN & MAX in Aktion

Auswertungen · Berichte · Analysen
SELECT kategorie, COUNT(*) AS "anzahl", MIN(preis) AS "min_preis", MAX(preis) AS "max_preis", AVG(preis) AS "avg_preis" FROM produkte GROUP BY kategorie;

Praxis-Beispiele zeigen die Kombination von MIN und MAX mit anderen Aggregatfunktionen für aussagekräftige Auswertungen und Berichte.

Beispiele
-- Zusammenfassung pro Kategorie
SELECT
kategorie,
COUNT(*) AS "anzahl",
MIN(preis) AS "min",
MAX(preis) AS "max",
AVG(preis) AS "avg"
FROM produkte
GROUP BY kategorie;
-- Produkte mit Preis über dem Kategorie-Durchschnitt
SELECT p.*
FROM produkte p
JOIN (
SELECT kategorie, AVG(preis) AS "avg_preis"
FROM produkte
GROUP BY kategorie
) sub ON p.kategorie = sub.kategorie
WHERE p.preis > sub.avg_preis;
-- Min/Max Bestelldatum pro Kunde mit Umsatz
SELECT
kunde_id,
MIN(datum) AS "erste",
MAX(datum) AS "letzte",
SUM(betrag) AS "umsatz"
FROM bestellungen
GROUP BY kunde_id;
Typische Ausgabe (Kategorie-Zusammenfassung):
kategorie | anzahl | min | max | avg
Elektronik | 15 | 29.99 | 1299.99| 345.50
Bücher | 8 | 9.99 | 49.99 | 29.99
Tipp: Kombinieren Sie MIN und MAX mit COUNT, SUM und AVG für aussagekräftige Statistiken. Bei großen Tabellen sollten Sie Indizes auf die gruppierten Spalten anlegen.

MIN & MAX im Überblick

MIN Kleinster Wert
Zahlen, Text, Datum
MAX Größter Wert
Zahlen, Text, Datum
GROUP BY Pro Gruppe
Kategorien, etc.
HAVING Gruppen filtern
Nach Aggregat
OVER Window Functions
Zeilenweise Analyse
Subquery Verschachtelt
Extremwert finden

Quick Summary

MIN/MAX
Extremwerte
GROUP BY
Pro Gruppe
HAVING
Gruppen filtern
Subquery
Extremwert finden
OVER
Window Functions
Analysen
Berichte
SELECT MAX(preis) FROM produkte; · SELECT kategorie, MIN(preis), MAX(preis) FROM produkte GROUP BY kategorie;