SQL ORDER BY & LIMIT

6 Kernkonzepte
Die wichtigsten Konzepte zum Sortieren und Begrenzen von SQL-Ergebnissen: ORDER BY · ASC / DESC · Mehrfachsortierung · NULLS FIRST / LAST · LIMIT · OFFSET Mit ORDER BY sortieren Sie Ergebnisse, mit LIMIT begrenzen Sie die Anzahl. Diese beiden Klauseln sind essenziell für aussagekräftige Abfragen und performante Paginierung.

ORDER BY – Ergebnisse sortieren

ORDER BY spalte [ASC|DESC]
SELECT name, preis FROM produkte ORDER BY preis DESC;

ORDER BY sortiert die Ergebnismenge nach einer oder mehreren Spalten. Standardmäßig wird aufsteigend (ASC) sortiert, absteigend mit DESC.

Sortierrichtungen

Option Bedeutung Beispiel
ASC Aufsteigend (Standard, A→Z, 1→10) ORDER BY name ASC
DESC Absteigend (Z→A, 10→1) ORDER BY preis DESC
Spalten-Alias Sortierung nach Alias möglich ORDER BY "Gesamtpreis" DESC
Spalten-Index Sortierung nach Position (1-basiert) ORDER BY 2 DESC
Beispiele
-- Aufsteigend (billigste zuerst)
SELECT name, preis FROM produkte
ORDER BY preis;
-- Absteigend (teuerste zuerst)
SELECT name, preis FROM produkte
ORDER BY preis DESC;
-- Nach Alias sortieren
SELECT name, preis * 1.19 AS "brutto"
FROM produkte
ORDER BY "brutto" DESC;
-- Nach Spalten-Index (2. Spalte = preis)
SELECT name, preis FROM produkte
ORDER BY 2 DESC;
Typische Ausgabe (ORDER BY preis DESC):
Laptop | 999.99
Smartphone | 599.99
Kopfhörer | 89.99
Maus | 29.99
Tipp: Die Sortierung mit ORDER BY kann teuer sein, wenn keine Indizes auf die sortierten Spalten existieren. Bei großen Tabellen sollten Sie Indizes für häufig sortierte Spalten anlegen.

Mehrfachsortierung – Nach mehreren Spalten

ORDER BY spalte1, spalte2 DESC, ...
SELECT name, kategorie, preis FROM produkte ORDER BY kategorie ASC, preis DESC;

Mehrfachsortierung ermöglicht die Sortierung nach mehreren Spalten. Zuerst wird nach der ersten Spalte sortiert, dann innerhalb gleicher Werte nach der zweiten, usw.

Beispiele
-- Nach Kategorie (aufsteigend), dann Preis (absteigend)
SELECT name, kategorie, preis FROM produkte
ORDER BY kategorie, preis DESC;
-- Nach Name, dann Kategorie, dann Preis
SELECT * FROM produkte
ORDER BY name, kategorie DESC, preis;
-- Gemischte Sortierrichtungen
SELECT * FROM bestellungen
ORDER BY kunde_id ASC, datum DESC, betrag DESC;
-- CASE für benutzerdefinierte Sortierung
SELECT name, status FROM bestellungen
ORDER BY CASE status
WHEN 'offen' THEN 1
WHEN 'in_bearbeitung' THEN 2
WHEN 'abgeschlossen' THEN 3
ELSE 4
END;
Typische Ausgabe (ORDER BY kategorie, preis DESC):
Bücher | Buch | 19.99
Bücher | E-Book | 9.99
Elektronik | Laptop | 999.99
Elektronik | Smartphone| 599.99
Tipp: Die Reihenfolge der Spalten in ORDER BY ist entscheidend. Die erste Spalte hat die höchste Priorität. Bei gleichen Werten wird die zweite Spalte verwendet, usw.

NULL-Werte – NULLS FIRST / NULLS LAST

NULLS FIRST · NULLS LAST
SELECT name, rabatt FROM produkte ORDER BY rabatt DESC NULLS LAST;

NULLS FIRST / NULLS LAST steuern, ob NULL-Werte am Anfang oder am Ende der Sortierung erscheinen. Dies ist datenbankspezifisch und nicht überall standardmäßig verfügbar.

Verhalten der Datenbanken

Datenbank ASC (NULL) DESC (NULL) NULLS FIRST/LAST
PostgreSQL NULLS LAST (Standard) NULLS FIRST (Standard) ✅ Unterstützt
MySQL NULLS FIRST NULLS LAST ❌ Nicht unterstützt (festes Verhalten)
SQL Server NULLS FIRST NULLS LAST ❌ Nicht unterstützt (festes Verhalten)
Oracle NULLS LAST (Standard) NULLS FIRST (Standard) ✅ Unterstützt
SQLite NULLS FIRST NULLS LAST ✅ Unterstützt (ab Version 3.30)
Beispiele
-- PostgreSQL/ Oracle: NULL zuletzt
SELECT name, rabatt FROM produkte
ORDER BY rabatt NULLS LAST;
-- PostgreSQL/ Oracle: NULL zuerst
SELECT name, rabatt FROM produkte
ORDER BY rabatt DESC NULLS FIRST;
-- MySQL: Workaround mit IS NULL
SELECT name, rabatt FROM produkte
ORDER BY rabatt IS NULL, rabatt;
-- SQLite: NULLS FIRST/LAST
SELECT name, rabatt FROM produkte
ORDER BY rabatt NULLS FIRST;
Tipp: Wenn Ihre Datenbank NULLS FIRST/LAST nicht unterstützt (MySQL, SQL Server), können Sie mit ORDER BY spalte IS NULL, spalte NULL-Werte ans Ende sortieren.

LIMIT – Ergebnisse begrenzen

LIMIT [offset,] anzahl
SELECT name, preis FROM produkte ORDER BY preis DESC LIMIT 5;

LIMIT begrenzt die Anzahl der zurückgegebenen Zeilen. Mit OFFSET kann ein Startpunkt für die Paginierung festgelegt werden.

LIMIT-Syntax je Datenbank

Datenbank Syntax Beispiel
MySQL, SQLite LIMIT [offset,] count LIMIT 5, 10
PostgreSQL LIMIT count OFFSET offset LIMIT 10 OFFSET 5
SQL Server OFFSET offset ROWS FETCH NEXT count ROWS ONLY OFFSET 5 ROWS FETCH NEXT 10 ROWS ONLY
Oracle FETCH FIRST count ROWS ONLY (12c+) FETCH FIRST 10 ROWS ONLY
Beispiele
-- Die ersten 5 Produkte
SELECT name FROM produkte
LIMIT 5;
-- Die 5 teuersten Produkte
SELECT name, preis FROM produkte
ORDER BY preis DESC
LIMIT 5;
-- PostgreSQL mit OFFSET
SELECT * FROM produkte
ORDER BY name
LIMIT 10 OFFSET 20;
-- MySQL mit Offset (überspringt 5, zeigt 10)
SELECT * FROM produkte
LIMIT 5, 10;
Tipp: Verwenden Sie LIMIT immer in Kombination mit ORDER BY, wenn Sie eine konsistente Reihenfolge benötigen. Ohne ORDER BY ist die Reihenfolge nicht garantiert.

Paginierung – Seitenweise Ergebnisse

LIMIT & OFFSET · FETCH
-- Seite 1 (10 Einträge) SELECT * FROM produkte ORDER BY id LIMIT 10; -- Seite 2 (Einträge 11-20) SELECT * FROM produkte ORDER BY id LIMIT 10 OFFSET 10;

Paginierung teilt große Ergebnismengen in Seiten auf. Mit LIMIT und OFFSET können Sie gezielt Seiten abrufen. Die Formel: OFFSET = (seite - 1) * pro_seite.

Beispiele
-- Pro Seite: 10 Einträge, Seite 1
SELECT * FROM produkte
ORDER BY id
LIMIT 10;
-- Pro Seite: 10 Einträge, Seite 2 (Einträge 11-20)
SELECT * FROM produkte
ORDER BY id
LIMIT 10 OFFSET 10;
-- Pro Seite: 25 Einträge, Seite 3 (Einträge 51-75)
SELECT * FROM produkte
ORDER BY id
LIMIT 25 OFFSET 50;
-- SQL Server: OFFSET-FETCH
SELECT * FROM produkte
ORDER BY id
OFFSET 10 ROWS
FETCH NEXT 10 ROWS ONLY;
-- Oracle: FETCH FIRST
SELECT * FROM produkte
ORDER BY id
OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY;
-- Keyset-Pagination (für große Datenmengen empfohlen)
SELECT * FROM produkte
WHERE id > 10
ORDER BY id
LIMIT 10;
Tipp: Bei sehr großen Tabellen ist OFFSET-Paginierung ineffizient, da alle vorherigen Zeilen durchlaufen werden müssen. Verwenden Sie Keyset-Pagination (WHERE id > last_id) für bessere Performance.

Praxis-Beispiele – ORDER BY & LIMIT in Aktion

Top-N · Ranglisten · Paginierung
SELECT name, preis FROM produkte ORDER BY preis DESC LIMIT 3;

Praxis-Beispiele zeigen die Kombination von ORDER BY und LIMIT für häufige Anwendungsfälle wie Top-N-Listen, Ranglisten und Paginierung.

Beispiele
-- Top 3 teuerste Produkte
SELECT name, preis FROM produkte
ORDER BY preis DESC
LIMIT 3;
-- 5 günstigste Produkte
SELECT name, preis FROM produkte
ORDER BY preis
LIMIT 5;
-- Neueste 10 Bestellungen
SELECT * FROM bestellungen
ORDER BY datum DESC
LIMIT 10;
-- Rangliste: Produkte mit den meisten Verkäufen
SELECT p.name, COUNT(b.id) AS "anzahl"
FROM produkte p
JOIN bestellungen b ON p.id = b.produkt_id
GROUP BY p.id, p.name
ORDER BY "anzahl" DESC
LIMIT 10;
-- Paginierung mit Gesamtanzahl (für UI)
-- Gesamtanzahl ermitteln
SELECT COUNT(*) AS "total" FROM produkte;
-- Seite 1 (10 Einträge)
SELECT * FROM produkte
ORDER BY id
LIMIT 10;
Typische Ausgabe (Top 3 teuerste):
Laptop | 999.99
Smartphone | 599.99
Kopfhörer | 89.99
Tipp: Für Ranglisten mit Rängen verwenden Sie ROW_NUMBER() oder RANK() (Window Functions). Diese sind standardmäßig in PostgreSQL, SQL Server und Oracle verfügbar, in MySQL seit Version 8.0.

ORDER BY & LIMIT im Überblick

ASC Aufsteigend
A→Z, 1→10
DESC Absteigend
Z→A, 10→1
LIMIT Anzahl begrenzen
Top-N, Paginierung
OFFSET Startposition
Paginierung
NULLS NULL-Behandlung
FIRST/LAST
FETCH SQL:2008-Standard
OFFSET FETCH

Quick Summary

ASC/DESC
Sortierrichtung
ORDER BY
Mehrfachsortierung
NULLS
NULL behandeln
LIMIT
Anzahl begrenzen
Top-N
Ranglisten
SELECT name, preis FROM produkte ORDER BY preis DESC LIMIT 10; · ORDER BY kategorie, preis DESC NULLS LAST