ORDER BY - Sortieren
Lerne, wie du Abfrageergebnisse mit ORDER BY sortierst - aufsteigend, absteigend und nach mehreren Spalten.
Datenbanken speichern Daten ohne feste Reihenfolge. Wenn du Ergebnisse in einer bestimmten Reihenfolge sehen moechtest - zum Beispiel nach Preis sortiert oder alphabetisch nach Name - brauchst du ORDER BY.
Grundlagen von ORDER BY
ORDER BY steht immer am Ende der Abfrage (vor LIMIT, falls vorhanden):
SELECT spalten
FROM tabelle
WHERE bedingung
ORDER BY spalte;
Aufsteigend sortieren (ASC)
Standardmaessig sortiert ORDER BY aufsteigend (ASC = ascending):
-- Produkte nach Preis sortieren (guenstigste zuerst)
SELECT name, preis
FROM produkte
ORDER BY preis;
Ergebnis:
name | preis
---------------+-------
Muetze Winter | 14.99
T-Shirt Basic | 19.99
Rucksack Urban | 39.99
Jeans Classic | 49.99
Sneaker Sport | 79.99
Jacke Outdoor | 129.99
Du kannst ASC auch explizit schreiben:
SELECT name, preis
FROM produkte
ORDER BY preis ASC; -- gleich wie ORDER BY preis
Absteigend sortieren (DESC)
Fuer absteigende Sortierung nutze DESC (descending):
-- Produkte nach Preis sortieren (teuerste zuerst)
SELECT name, preis
FROM produkte
ORDER BY preis DESC;
Ergebnis:
name | preis
---------------+-------
Jacke Outdoor | 129.99
Sneaker Sport | 79.99
Jeans Classic | 49.99
Rucksack Urban | 39.99
T-Shirt Basic | 19.99
Muetze Winter | 14.99
Alphabetisch sortieren
-- Kunden alphabetisch nach Name
SELECT name, stadt
FROM kunden
ORDER BY name;
Ergebnis:
name | stadt
--------------+---------
Anna Schmidt | Berlin
Lisa Weber | Muenchen
Max Mueller | Hamburg
Sarah Klein | Koeln
Tom Becker | Berlin
Nach mehreren Spalten sortieren
Du kannst nach mehreren Spalten sortieren. Die zweite Spalte wird innerhalb gleicher Werte der ersten Spalte sortiert:
-- Erst nach Kategorie, dann nach Preis
SELECT name, kategorie, preis
FROM produkte
ORDER BY kategorie, preis;
Ergebnis:
name | kategorie | preis
---------------+-------------+-------
Muetze Winter | Accessoires | 14.99
Rucksack Urban | Accessoires | 39.99
T-Shirt Basic | Kleidung | 19.99
Jeans Classic | Kleidung | 49.99
Jacke Outdoor | Kleidung | 129.99
Sneaker Sport | Schuhe | 79.99
Verschiedene Richtungen pro Spalte
Jede Spalte kann ihre eigene Sortierrichtung haben:
-- Nach Kategorie aufsteigend, innerhalb der Kategorie nach Preis absteigend
SELECT name, kategorie, preis
FROM produkte
ORDER BY kategorie ASC, preis DESC;
Ergebnis:
name | kategorie | preis
---------------+-------------+-------
Rucksack Urban | Accessoires | 39.99
Muetze Winter | Accessoires | 14.99
Jacke Outdoor | Kleidung | 129.99
Jeans Classic | Kleidung | 49.99
T-Shirt Basic | Kleidung | 19.99
Sneaker Sport | Schuhe | 79.99
Nach berechneten Werten sortieren
Du kannst auch nach Ausdruecken sortieren, die nicht direkt Spalten sind:
-- Nach Lagerwert sortieren (Preis * Lagerbestand)
SELECT
name,
preis,
lagerbestand,
preis * lagerbestand AS lagerwert
FROM produkte
ORDER BY preis * lagerbestand DESC;
Ergebnis:
name | preis | lagerbestand | lagerwert
---------------+--------+--------------+----------
Jacke Outdoor | 129.99 | 20 | 2599.80
Jeans Classic | 49.99 | 50 | 2499.50
Sneaker Sport | 79.99 | 30 | 2399.70
T-Shirt Basic | 19.99 | 100 | 1999.00
Muetze Winter | 14.99 | 75 | 1124.25
Rucksack Urban | 39.99 | 25 | 999.75
Nach Alias sortieren
In vielen Datenbanken kannst du auch nach dem Alias sortieren:
SELECT
name,
preis * lagerbestand AS lagerwert
FROM produkte
ORDER BY lagerwert DESC;
Nach Spaltennummer sortieren
Du kannst auch die Positionsnummer der Spalte angeben (nicht empfohlen, aber moeglich):
-- Sortiere nach der 2. Spalte (preis)
SELECT name, preis
FROM produkte
ORDER BY 2 DESC;
Warum nicht empfohlen? Wenn du spaeter die Spaltenreihenfolge aenderst, sortiert die Abfrage nach der falschen Spalte. Besser ist es, den Spaltennamen zu verwenden.
ORDER BY mit WHERE kombinieren
WHERE filtert zuerst, dann sortiert ORDER BY das Ergebnis:
-- Alle Kleidungsstuecke, sortiert nach Preis (teuerste zuerst)
SELECT name, preis
FROM produkte
WHERE kategorie = 'Kleidung'
ORDER BY preis DESC;
Ergebnis:
name | preis
--------------+-------
Jacke Outdoor | 129.99
Jeans Classic | 49.99
T-Shirt Basic | 19.99
Komplexeres Beispiel
-- Offene und versendete Bestellungen, sortiert nach Datum (neueste zuerst)
SELECT
id,
kunden_id,
bestelldatum,
betrag,
status
FROM bestellungen
WHERE status IN ('offen', 'versendet')
ORDER BY bestelldatum DESC;
NULL-Werte bei der Sortierung
NULL-Werte werden je nach Datenbank unterschiedlich behandelt:
- PostgreSQL: NULL-Werte stehen bei ASC am Ende, bei DESC am Anfang
- SQLite: NULL-Werte stehen bei ASC am Anfang, bei DESC am Ende
Du kannst das Verhalten in PostgreSQL explizit steuern:
-- PostgreSQL: NULL-Werte ans Ende
SELECT name, email
FROM kunden
ORDER BY email ASC NULLS LAST;
-- PostgreSQL: NULL-Werte an den Anfang
SELECT name, email
FROM kunden
ORDER BY email DESC NULLS FIRST;
CASE in ORDER BY
Du kannst CASE WHEN nutzen, um eine benutzerdefinierte Sortierreihenfolge zu erstellen:
-- Bestellungen nach Status sortieren: offen zuerst, dann versendet, dann abgeschlossen
SELECT id, status, betrag
FROM bestellungen
ORDER BY
CASE status
WHEN 'offen' THEN 1
WHEN 'versendet' THEN 2
WHEN 'abgeschlossen' THEN 3
ELSE 4
END;
Ergebnis:
id | status | betrag
---+----------------+-------
4 | offen | 19.99
3 | versendet | 94.98
5 | versendet | 184.97
1 | abgeschlossen | 69.98
2 | abgeschlossen | 129.99
Reihenfolge der SQL-Klauseln
Die Reihenfolge der Klauseln in einer SQL-Abfrage ist fest:
SELECT spalten -- 1. Was anzeigen?
FROM tabelle -- 2. Woher?
WHERE bedingung -- 3. Welche filtern?
ORDER BY spalte -- 4. Wie sortieren?
Diese Reihenfolge darfst du nicht aendern.
Was kommt als Naechstes?
Im naechsten Tutorial lernst du LIMIT und DISTINCT kennen, um die Anzahl der Ergebnisse zu begrenzen und Duplikate zu entfernen.
Zusammenfassung
- ORDER BY sortiert die Ergebnisse einer Abfrage
- ASC (Standard) sortiert aufsteigend, DESC sortiert absteigend
- Du kannst nach mehreren Spalten sortieren
- Jede Spalte kann eine eigene Sortierrichtung haben
- Sortierung nach berechneten Werten und Aliasen ist moeglich
- CASE WHEN in ORDER BY ermoeglicht benutzerdefinierte Sortierung
- Die Klausel-Reihenfolge ist fest: SELECT, FROM, WHERE, ORDER BY
Uebungen
- Einfach: Sortiere alle Kunden alphabetisch nach Stadt.
- Absteigend: Zeige alle Produkte sortiert nach Lagerbestand (hoechster zuerst).
- Mehrere Spalten: Sortiere alle Bestellungen erst nach Status (alphabetisch), dann nach Betrag (hoechster zuerst).
- Mit WHERE: Zeige alle Produkte unter 80 Euro, sortiert nach Kategorie und dann nach Preis aufsteigend.
- CASE: Sortiere die Produkte nach einer eigenen Reihenfolge der Kategorien: Schuhe zuerst, dann Kleidung, dann Accessoires.
-- Loesung zu Uebung 4:
SELECT name, preis, kategorie
FROM produkte
WHERE preis < 80
ORDER BY kategorie, preis ASC;
Pro-Tipp: Denke daran, dass eine Datenbank OHNE ORDER BY keine garantierte Reihenfolge liefert. Selbst wenn die Ergebnisse heute in einer bestimmten Reihenfolge erscheinen, kann sich das morgen aendern. Wenn die Reihenfolge wichtig ist, nutze IMMER ORDER BY.