Zum Inhalt springen
SQL Anfänger 15 min

LIMIT & DISTINCT

Lerne, wie du mit LIMIT die Anzahl der Ergebnisse begrenzt und mit DISTINCT Duplikate entfernst.

Aktualisiert:

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

  1. Top 3: Zeige die 3 Produkte mit dem hoechsten Lagerbestand.
  2. Paginierung: Zeige die Produkte 3 und 4 (sortiert nach Name), also Seite 2 mit 2 Eintraegen pro Seite.
  3. DISTINCT: Zeige alle eindeutigen Staedte, aus denen Bestellungen kommen (nutze einen JOIN).
  4. COUNT DISTINCT: Wie viele verschiedene Produkte wurden insgesamt bestellt? (Nutze die Tabelle bestellpositionen)
  5. 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.

Zurück zum SQL Kurs