LIMIT & DISTINCT
Lerne, wie du mit LIMIT die Anzahl der Ergebnisse begrenzt und mit DISTINCT Duplikate entfernst.
Manchmal willst du nicht alle Ergebnisse sehen, sondern nur die ersten 10 oder nur eindeutige Werte. Dafuer gibt es LIMIT und DISTINCT - zwei kleine, aber maechtige Werkzeuge.
LIMIT - Ergebnisse begrenzen
LIMIT begrenzt die Anzahl der zurueckgegebenen Zeilen:
-- Nur die ersten 3 Produkte
SELECT name, preis
FROM produkte
LIMIT 3;
Ergebnis:
name | preis
--------------+------
T-Shirt Basic | 19.99
Jeans Classic | 49.99
Sneaker Sport | 79.99
Top-N Abfragen
LIMIT ist besonders nuetzlich in Kombination mit ORDER BY:
-- Die 3 teuersten Produkte
SELECT name, preis
FROM produkte
ORDER BY preis DESC
LIMIT 3;
Ergebnis:
name | preis
---------------+-------
Jacke Outdoor | 129.99
Sneaker Sport | 79.99
Jeans Classic | 49.99
-- Die 2 guenstigsten Produkte
SELECT name, preis
FROM produkte
ORDER BY preis ASC
LIMIT 2;
-- Die 3 neuesten Bestellungen
SELECT id, bestelldatum, betrag
FROM bestellungen
ORDER BY bestelldatum DESC
LIMIT 3;
OFFSET - Ergebnisse ueberspringen
OFFSET ueberspringt eine bestimmte Anzahl von Zeilen. Das ist nuetzlich fuer Paginierung (Seitenumbruch):
-- Seite 1: Ergebnisse 1-3
SELECT name, preis
FROM produkte
ORDER BY name
LIMIT 3 OFFSET 0;
-- Seite 2: Ergebnisse 4-6
SELECT name, preis
FROM produkte
ORDER BY name
LIMIT 3 OFFSET 3;
Seite 1:
name | preis
---------------+-------
Jacke Outdoor | 129.99
Jeans Classic | 49.99
Muetze Winter | 14.99
Seite 2:
name | preis
---------------+------
Rucksack Urban | 39.99
Sneaker Sport | 79.99
T-Shirt Basic | 19.99
Paginierung berechnen
Die Formel fuer OFFSET bei Paginierung:
-- Seite X mit Y Eintraegen pro Seite:
-- OFFSET = (Seitennummer - 1) * Eintraege_pro_Seite
-- Seite 1, 10 pro Seite: LIMIT 10 OFFSET 0
-- Seite 2, 10 pro Seite: LIMIT 10 OFFSET 10
-- Seite 3, 10 pro Seite: LIMIT 10 OFFSET 20
PostgreSQL: FETCH FIRST
PostgreSQL unterstuetzt auch die SQL-Standard-Syntax:
-- PostgreSQL Standard-Syntax
SELECT name, preis
FROM produkte
ORDER BY preis DESC
FETCH FIRST 3 ROWS ONLY;
-- Mit OFFSET
SELECT name, preis
FROM produkte
ORDER BY preis DESC
OFFSET 2 ROWS
FETCH FIRST 3 ROWS ONLY;
DISTINCT - Eindeutige Werte
DISTINCT entfernt Duplikate aus den Ergebnissen:
-- Alle Staedte (ohne Duplikate)
SELECT DISTINCT stadt
FROM kunden;
Ergebnis:
stadt
--------
Berlin
Hamburg
Koeln
Muenchen
Ohne DISTINCT wuerde Berlin zweimal erscheinen:
-- Ohne DISTINCT
SELECT stadt FROM kunden;
stadt
--------
Berlin
Hamburg
Muenchen
Berlin -- Duplikat!
Koeln
DISTINCT mit mehreren Spalten
Bei mehreren Spalten wird die Kombination der Spalten auf Eindeutigkeit geprueft:
-- Eindeutige Kombinationen von Stadt und Status
SELECT DISTINCT k.stadt, b.status
FROM kunden k
JOIN bestellungen b ON k.id = b.kunden_id;
Alle Kategorien anzeigen
-- Welche Produktkategorien gibt es?
SELECT DISTINCT kategorie
FROM produkte
ORDER BY kategorie;
Ergebnis:
kategorie
-----------
Accessoires
Kleidung
Schuhe
Alle Bestellstatus anzeigen
-- Welche Status-Werte gibt es?
SELECT DISTINCT status
FROM bestellungen
ORDER BY status;
Ergebnis:
status
--------------
abgeschlossen
offen
versendet
DISTINCT mit COUNT kombinieren
Eine haeufige Kombination: Zaehle die eindeutigen Werte:
-- Wie viele verschiedene Staedte haben unsere Kunden?
SELECT COUNT(DISTINCT stadt) AS anzahl_staedte
FROM kunden;
Ergebnis:
anzahl_staedte
--------------
4
-- Wie viele verschiedene Kategorien gibt es?
SELECT COUNT(DISTINCT kategorie) AS anzahl_kategorien
FROM produkte;
Praxisbeispiele
Top-Kunden nach Bestellwert
SELECT
k.name,
SUM(b.betrag) AS gesamtbetrag
FROM kunden k
JOIN bestellungen b ON k.id = b.kunden_id
GROUP BY k.name
ORDER BY gesamtbetrag DESC
LIMIT 3;
Eindeutige Kunden mit Bestellungen
-- Wie viele verschiedene Kunden haben bestellt?
SELECT COUNT(DISTINCT kunden_id) AS aktive_kunden
FROM bestellungen;
Letzte Bestellung pro Kunde (vereinfacht)
-- Die neueste Bestellung
SELECT *
FROM bestellungen
ORDER BY bestelldatum DESC
LIMIT 1;
LIMIT und DISTINCT zusammen
Du kannst beide Klauseln in einer Abfrage verwenden:
-- Die 3 haeufigsten Kategorien (hier: die ersten 3 eindeutigen)
SELECT DISTINCT kategorie
FROM produkte
ORDER BY kategorie
LIMIT 3;
Reihenfolge der SQL-Klauseln (aktualisiert)
SELECT [DISTINCT] spalten
FROM tabelle
WHERE bedingung
ORDER BY spalte [ASC|DESC]
LIMIT anzahl [OFFSET start];
Was kommt als Naechstes?
Im naechsten Tutorial steigen wir in eines der wichtigsten SQL-Themen ein: JOINs. Damit kannst du Daten aus mehreren Tabellen in einer einzigen Abfrage kombinieren.
Zusammenfassung
- LIMIT begrenzt die Anzahl der zurueckgegebenen Zeilen
- LIMIT + ORDER BY ermoeglicht Top-N Abfragen (z.B. “Top 5 Produkte”)
- OFFSET ueberspringt Zeilen und ist ideal fuer Paginierung
- DISTINCT entfernt Duplikate aus den Ergebnissen
- COUNT(DISTINCT spalte) zaehlt eindeutige Werte
- LIMIT steht immer am Ende der Abfrage
Uebungen
- Top 3: Zeige die 3 Produkte mit dem hoechsten Lagerbestand.
- Paginierung: Zeige die Produkte 3 und 4 (sortiert nach Name), also Seite 2 mit 2 Eintraegen pro Seite.
- DISTINCT: Zeige alle eindeutigen Staedte, aus denen Bestellungen kommen (nutze einen JOIN).
- COUNT DISTINCT: Wie viele verschiedene Produkte wurden insgesamt bestellt? (Nutze die Tabelle bestellpositionen)
- Kombination: Zeige die 2 guenstigsten Produkte jeder Kategorie (Tipp: Das geht mit mehreren Abfragen - eine pro Kategorie).
-- Loesung zu Uebung 1:
SELECT name, lagerbestand
FROM produkte
ORDER BY lagerbestand DESC
LIMIT 3;
-- Loesung zu Uebung 4:
SELECT COUNT(DISTINCT produkt_id) AS verschiedene_produkte
FROM bestellpositionen;
Pro-Tipp: Nutze LIMIT waehrend der Entwicklung, um grosse Tabellen schnell zu erkunden, ohne auf Millionen von Ergebnissen warten zu muessen. Ein SELECT * FROM grosse_tabelle LIMIT 10 zeigt dir schnell die Struktur und ein paar Beispieldaten. In der Produktion solltest du aber immer genau wissen, wie viele Daten du abfragst.