LXLogicExcel
🔥
0
0

SQL ORDER BY: Syntax, Beispiele und Performance-Tipps

By the LogicExcel Editorial TeamUpdated June 202613 min read2,563 words

SQL ORDER BY: Syntax, Beispiele und Performance-Tipps

Jemand tippt SQL-Befehle am Computer ein. ORDER BY sortiert das Ergebnis einer SQL-Abfrage nach einer oder mehreren Spalten. Ohne diese Klausel gibt die Datenbank Zeilen in einer nicht definierten Reihenfolge zurück, wie PostgreSQL in seiner Dokumentation ausdrücklich festhält. Der Standard ist aufsteigend (ASC), also von klein nach groß. Wer absteigend sortieren will, schreibt DESC. Mehrere Spalten lassen sich mit Komma trennen, wobei die erste Spalte die Hauptsortierung vorgibt und jede weitere nur bei Gleichstand greift. NULL-Werte verhalten sich je nach Datenbanksystem unterschiedlich, was beim Wechsel zwischen PostgreSQL, MySQL und SQL Server schnell zu Überraschungen führt.

Wichtige Erkenntnisse

ORDER BY ist die einzige Garantie für eine definierte Ergebnisreihenfolge in SQL, und jede Paginierung ohne sie ist instabil.
ThemaDetails
StandardverhaltenORDER BY sortiert aufsteigend (ASC); ohne die Klausel ist keine Reihenfolge garantiert.
NULL-SortierungVerhält sich je nach System unterschiedlich; für portable Abfragen immer NULLS FIRST oder NULLS LAST explizit angeben.
Paginierung absichernPrimärschlüssel als letzte Sortierspalte ergänzen, damit die Reihenfolge auch bei Gleichständen deterministisch bleibt.
PerformanceZuerst filtern (WHERE), dann sortieren; Index auf Sortierspalten prüfen, Funktionen in ORDER BY vermeiden.
LogicexcelKostenlose, interaktive SQL-Sortierübungen direkt im Browser unter logicexcel.com/sql, ohne Anmeldung.

Inhaltsverzeichnis

Wie sieht die Kernsyntax von SQL ORDER BY aus?

Die Grundstruktur ist denkbar kurz:

SELECT spalte1, spalte2
FROM tabelle
WHERE bedingung
ORDER BY sort_ausdruck [ASC | DESC] [, sort_ausdruck [ASC | DESC] ...];

Kopierbare Bausteine auf einen Blick:

  • sort_ausdruck: Spaltenname, Alias, Ausdruck (preis * menge) oder Spaltenposition (1, 2)
  • ASC: aufsteigend, Standard wenn weggelassen
  • DESC: absteigend
  • Mehrere Ausdrücke: durch Komma getrennt, Hierarchie von links nach rechts
  • Alias: ein im SELECT vergebener Name kann in ORDER BY verwendet werden
  • Spaltennummer: ORDER BY 2 sortiert nach der zweiten Ausgabespalte
Wichtig für das Verständnis: ORDER BY wird logisch als letzter Schritt verarbeitet, nach SELECT, FROM, WHERE und GROUP BY. Das Transact-SQL-Handbuch von Microsoft beschreibt diese logische Reihenfolge explizit. Wer das verinnerlicht hat, macht deutlich weniger Fehler bei Kombinationen mit GROUP BY.

Wie verhalten sich ASC, DESC und NULL-Werte?

ASC ist der Standard und muss nicht explizit geschrieben werden. DESC kehrt die Reihenfolge um: Zahlen von groß nach klein, Texte von Z nach A, Datumsangaben vom neuesten zum ältesten.
-- Aufsteigend (Standard)
SELECT name, gehalt FROM mitarbeiter ORDER BY gehalt;

-- Absteigend
SELECT name, gehalt FROM mitarbeiter ORDER BY gehalt DESC;

Bei NULL-Werten weichen die Systeme voneinander ab. SQL Server behandelt NULL als niedrigsten Wert, PostgreSQL erlaubt mit NULLS FIRST und NULLS LAST eine explizite Steuerung. Für portable Anwendungen empfiehlt Modern SQL deshalb, die NULL-Position immer explizit anzugeben:

-- PostgreSQL: NULLs ans Ende
SELECT name, bonus FROM mitarbeiter ORDER BY bonus DESC NULLS LAST;

-- PostgreSQL: NULLs an den Anfang
SELECT name, bonus FROM mitarbeiter ORDER BY bonus ASC NULLS FIRST;

MySQL und MariaDB kennen NULLS FIRST/NULLS LAST nicht nativ. Dort hilft ein Workaround: ORDER BY (bonus IS NULL) ASC, bonus ASC schiebt NULLs ans Ende.

Profi-Tipp: Schreib NULLS LAST immer explizit, wenn du mit PostgreSQL arbeitest und die Abfrage später auf SQL Server portiert werden könnte. Das spart eine halbe Stunde Debugging.

Wie sortiert man nach mehreren Spalten und Ausdrücken?

Die Hierarchie ist einfach: Die erste Spalte entscheidet, die zweite greift nur bei Gleichstand, die dritte nur wenn auch die zweite gleich ist. PostgreSQL beschreibt dieses Verhalten als Standardverhalten für alle Mehrspaltensortierungen.

SELECT abteilung, name, gehalt
FROM mitarbeiter
ORDER BY abteilung ASC, gehalt DESC;

Ergebnis: Innerhalb jeder Abteilung stehen die Bestverdiener oben.

Weitere Möglichkeiten im Überblick:

  • Ausdruck sortieren: ORDER BY preis * menge DESC sortiert nach dem berechneten Umsatz
  • Alias verwenden: SELECT vorname || ' ' || nachname AS vollname ... ORDER BY vollname
  • Gemischte Richtungen: Jede Spalte kann ihre eigene Richtung haben, ORDER BY land ASC, umsatz DESC ist völlig gültig
  • Funktionen: ORDER BY UPPER(name) sortiert ohne Rücksicht auf Groß-/Kleinschreibung
Einen Alias aus dem SELECT in ORDER BY zu verwenden ist praktisch, aber nicht in allen Kontexten erlaubt. In WHERE oder HAVING funktioniert das nicht, weil diese Klauseln logisch vor SELECT ausgewertet werden.

Wann sollte man ORDER BY mit Spaltennummern verwenden?

ORDER BY 1, 2 sortiert nach der ersten und zweiten Ausgabespalte des SELECT. MariaDB dokumentiert diese Syntax als gültig, warnt aber indirekt durch die Beschreibung der Lesbarkeitsrisiken.
SELECT name, gehalt, abteilung
FROM mitarbeiter
ORDER BY 2 DESC, 3 ASC;
-- Entspricht: ORDER BY gehalt DESC, abteilung ASC

Der Vorteil: kurz und schnell getippt. Der Nachteil zeigt sich sobald jemand die SELECT-Liste ändert. Wer eine Spalte vorne einfügt, verschiebt alle Nummern, ohne dass ein Fehler geworfen wird. Die Abfrage läuft weiter, sortiert aber nach der falschen Spalte.

Profi-Tipp: Spaltennummern sind in Ordnung für schnelle Ad-hoc-Abfragen in der Konsole. In produktivem Code, Views oder gespeicherten Prozeduren immer Spaltennamen verwenden.

Wie kombiniert man ORDER BY mit GROUP BY und Aggregaten?

ORDER BY wird nach GROUP BY und der Aggregation angewendet. Das bedeutet: Man kann nach dem Ergebnis einer Aggregatfunktion sortieren, entweder über den Alias oder direkt über die Funktion.
SELECT abteilung, AVG(gehalt) AS durchschnittsgehalt
FROM mitarbeiter
GROUP BY abteilung
ORDER BY durchschnittsgehalt DESC;

Wichtige Regeln für diese Kombination:

  • Nach GROUP BY darf ORDER BY nur Spalten aus der GROUP BY-Liste oder Aggregatfunktionen referenzieren, keine anderen Spalten der Basistabelle
  • Bei UNION, INTERSECT oder EXCEPT gilt: ORDER BY steht am Ende der gesamten Abfrage und darf nur nach Ausgabespalten oder Positionen sortieren
  • Alias-Sortierung nach Aggregat (ORDER BY durchschnittsgehalt) ist in den meisten Systemen erlaubt, in manchen Kontexten aber nicht
Mehr zur Logik hinter GROUP BY erklärt die Logicexcel-Anleitung zu Gruppierungen und Aggregatfunktionen.
-- UNION mit ORDER BY am Ende
SELECT name, 'Aktiv' AS status FROM mitarbeiter WHERE aktiv = 1
UNION
SELECT name, 'Inaktiv' AS status FROM mitarbeiter WHERE aktiv = 0
ORDER BY name ASC;

Warum braucht stabile Paginierung immer ein ORDER BY?

Paginierung ohne ORDER BY ist ein häufiger Bug. Die Datenbank gibt Seite 2 nicht garantiert mit anderen Zeilen zurück als Seite 1, weil die interne Reihenfolge nach Optimierungen wechseln kann.

-- MySQL / MariaDB
SELECT id, name FROM produkte
ORDER BY name ASC
LIMIT 10 OFFSET 20;

-- SQL Server / PostgreSQL (SQL-Standard)
SELECT id, name FROM produkte
ORDER BY name ASC
OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;

Beide Varianten liefern Zeilen 21 bis 30, aber nur wenn ORDER BY eine stabile Reihenfolge garantiert. Wenn zwei Produkte denselben Namen haben, kann die Reihenfolge zwischen Seiten trotzdem kippen.

Profi-Tipp: Füge den Primärschlüssel als letzte Sortierspalte hinzu: ORDER BY name ASC, id ASC. Das macht die Reihenfolge deterministisch, auch bei Gleichständen.

Welche Performance-Tipps gelten für ORDER BY?

Sortieren kostet Speicher und CPU. Ein sogenannter Filesort, also eine Sortierung ohne Indexnutzung, kann bei großen Tabellen spürbar langsam werden. PostgreSQL empfiehlt, Abfragepläne zu prüfen, um zu sehen, ob ein Index die Sortierung übernimmt.

Praktische Checkliste:

  • Zuerst filtern: WHERE vor ORDER BY reduziert die zu sortierende Datenmenge
  • Index auf Sortierspalten: Ein Index auf (abteilung, gehalt) kann eine Sortierung nach diesen Spalten ohne Filesort bedienen
  • LIMIT früh einsetzen: ORDER BY name LIMIT 10 muss nicht die gesamte Tabelle sortieren, wenn der Planer das erkennt
  • Funktionen in ORDER BY vermeiden: ORDER BY YEAR(erstellt_am) verhindert Indexnutzung; besser eine berechnete Spalte anlegen
  • Nur benötigte Spalten selektieren: Weniger Daten bedeuten weniger Sortieraufwand
Profi-Tipp: EXPLAIN (PostgreSQL/MySQL) oder SET STATISTICS IO ON (SQL Server) zeigen, ob ein Filesort stattfindet. Ein Sort-Knoten im Ausführungsplan ohne vorherigen Index-Scan ist das Warnsignal.

Für Abfragen in OLTP-Systemen gilt: Große Sortieroperationen ohne LIMIT gehören eher ins Reporting als in transaktionale Abfragen. Wer Workflows effizient gestalten will, denkt Datenbankabfragen und Prozessdesign zusammen.

Wie unterscheiden sich PostgreSQL, MySQL, SQL Server und SQLite?

Die Kernfunktion ist überall gleich, aber die Details weichen ab:

MerkmalPostgreSQLMySQL / MariaDBSQL ServerSQLite
NULLS FIRST / LASTJa, nativNein (Workaround nötig)Nein (Workaround nötig)Ab Version —
ORDER BY in SubqueryNur mit LIMIT sinnvollNur mit LIMIT sinnvollNur mit TOP / OFFSETTechnisch erlaubt, aber ignoriert
ORDER BY in UPDATE / DELETENeinJa, mit LIMITNeinNein
Standardverhalten NULLNULLs zuletzt bei ASCNULLs zuerst bei ASCNULLs zuerst bei ASCNULLs zuerst bei ASC
Kollation in ORDER BYORDER BY col COLLATE "de-DE-x-icu"ORDER BY col COLLATE utf8mb4_unicode_ciORDER BY col COLLATE Latin1_General_CI_ASORDER BY col COLLATE NOCASE
Wie unterscheiden sich PostgreSQL, MySQL, SQL Server und SQLite? — overview diagram

PostgreSQL behandelt NULLs bei aufsteigender Sortierung standardmäßig als größten Wert (also zuletzt), SQL Server und MySQL als kleinsten (also zuerst). Wer zwischen Systemen wechselt, muss das explizit testen.

Welche Fehler passieren bei ORDER BY am häufigsten?

  • Implizite Reihenfolge annehmen: Ohne ORDER BY ist die Rückgabereihenfolge nicht garantiert, auch wenn sie in Tests immer gleich aussieht. Produktionscode darf sich nie darauf verlassen.
  • ASC/DESC nur auf die letzte Spalte beziehen: ORDER BY land, umsatz DESC sortiert land aufsteigend und umsatz absteigend. Wer beide absteigend will, muss schreiben: ORDER BY land DESC, umsatz DESC.
  • ORDER BY in Subqueries: Eine Sortierung innerhalb einer Subquery oder View hat in SQL Server ohne TOP oder OFFSET/FETCH keine Wirkung nach außen. Der äußere SELECT ignoriert sie.
  • Spaltennummern nach SELECT-Änderung: ORDER BY 3 zeigt nach dem Einfügen einer neuen Spalte plötzlich auf die falsche Spalte.
  • NULL-Annahmen beim Portieren: Was auf PostgreSQL NULLS LAST liefert, kann auf MySQL ganz oben stehen.
Das Transact-SQL-Handbuch beschreibt den Subquery-Fall explizit: ORDER BY in einer Unterabfrage ohne TOP/OFFSET ist in SQL Server schlicht wirkungslos.

Praxisbeispiele mit kopierbaren Abfragen

Kleine Demo-Tabelle für alle Beispiele:

CREATE TABLE produkte (
  id INT PRIMARY KEY,
  name VARCHAR(50),
  kategorie VARCHAR(30),
  preis DECIMAL(8,2),
  lager INT
);

INSERT INTO produkte VALUES
(1, 'Tastatur', 'Hardware', 49.99, 120),
(2, 'Monitor', 'Hardware', 299.00, 45),
(3, 'Maus', 'Hardware', 29.99, 200),
(4, 'Excel-Kurs', 'Software', 0.00, NULL),
(5, 'SQL-Buch', 'Bücher', 39.90, 80);

Einzelne Spalte, absteigend:
SELECT name, preis FROM produkte ORDER BY preis DESC;
-- Monitor (299.00), Tastatur (49.99), SQL-Buch (39.90), Maus (29.99), Excel-Kurs (0.00)
Mehrere Spalten:
SELECT kategorie, name, preis FROM produkte
ORDER BY kategorie ASC, preis DESC;
-- Innerhalb jeder Kategorie: teuerste zuerst
Ausdruck und Paginierung:
SELECT name, preis * lager AS lagerwert FROM produkte
WHERE lager IS NOT NULL
ORDER BY lagerwert DESC
LIMIT 3 OFFSET 0;
-- Seite 1: die drei Produkte mit dem höchsten Lagerwert
GROUP BY mit Aggregat:
SELECT kategorie, COUNT(*) AS anzahl, AVG(preis) AS schnittpreis
FROM produkte
GROUP BY kategorie
ORDER BY schnittpreis DESC;

> Kernregel: Jede Abfrage, die eine bestimmte Reihenfolge voraussetzt, braucht ein explizites ORDER BY. Alles andere ist Zufall, auch wenn er sich über Wochen wiederholt.

So üben Sie ORDER BY auf Logicexcel

Theorie liest sich schnell, aber Sortierlogik sitzt erst nach ein paar echten Abfragen. Auf der kostenlosen SQL-Übungsseite von Logicexcel gibt es interaktive Aufgaben direkt im Browser, ohne Anmeldung und ohne Installation.

Empfohlene Reihenfolge für das Üben:

  • Einstieg: Einfache Einzelspalten-Sortierung mit ASC und DESC, Ergebnisse direkt vergleichen
  • Aufbau: Mehrspaltensortierung mit gemischten Richtungen, Hierarchie der Sortierung nachvollziehen
  • Vertiefung: GROUP BY kombiniert mit ORDER BY auf Aggregatwerte
  • Paginierung: LIMIT/OFFSET-Aufgaben, deterministischen Primärschlüssel als letzte Sortierspalte ergänzen
  • NULL-Handling: Abfragen mit NULL-Werten, Verhalten beobachten und mit NULLS FIRST/NULLS LAST steuern
Jede Übung gibt sofortiges Feedback zur eingegebenen Abfrage. Wer gleichzeitig Excel-Kenntnisse aufbauen will, findet auf Logicexcel über 77 weitere Lektionen zu Formeln, Pivot-Tabellen und Funktionen.

Wann einfache ORDER BY-Regeln besser sind als komplexe Sortierungen

Komplexe Sortierausdrücke wirken manchmal clever. ORDER BY CASE WHEN status = 'aktiv' THEN 0 ELSE 1 END, name ASC ist technisch korrekt und manchmal genau das Richtige. Aber in produktivem Code, den andere warten müssen, ist Lesbarkeit kein Nice-to-have.

Die Praxis zeigt: Abfragen mit mehr als zwei Sortierausdrücken werden selten richtig gelesen. Wer ORDER BY land ASC, region ASC, stadt ASC, name ASC schreibt, meint es gut, aber beim nächsten Bugfix liest jemand die Reihenfolge falsch und ändert die dritte Spalte, ohne die vierte zu bedenken. Eine klare, deterministische Liste mit dem Primärschlüssel am Ende kostet nichts und verhindert genau diese Fehler.

Ausdruckssortierungen wie ORDER BY preis * rabatt sind sinnvoll, wenn der berechnete Wert keine eigene Spalte hat. Sobald die Berechnung aber öfter gebraucht wird, gehört sie als berechnete Spalte oder View in die Datenbankstruktur, nicht in jede einzelne Abfrage.

Das Prinzip gilt auch für Spaltennummern: In einer Ad-hoc-Analyse ist ORDER BY 2 DESC schnell getippt. In einer gespeicherten Prozedur ist es eine Wartungsfalle.

Wann einfache ORDER BY-Regeln besser sind als komplexe Sortierungen — overview diagram

Logicexcel: SQL-Sortierung direkt im Browser üben

Wer ORDER BY wirklich beherrschen will, braucht keine Datenbankinstallation und kein kostenpflichtiges Kurs-Abo. Logicexcel bietet kostenlose, interaktive SQL-Übungen direkt im Browser, ohne Anmeldung.

Logicexcel

Der Unterschied zu passiven Tutorials: Du tippst die Abfrage selbst, siehst das Ergebnis sofort und bekommst Feedback zur Lösung. Sortieraufgaben, Paginierungsbeispiele und NULL-Handling sind alle abgedeckt. Wer strukturiert lernen will, findet auf Logicexcel auch Lernleitfäden für Excel und Datenanalyse als nächsten Schritt. Starte jetzt mit der ersten Sortieraufgabe auf Logicexcel.

Quellen

FAQ

Was macht ORDER BY in SQL?

ORDER BY sortiert das Ergebnis einer Abfrage nach einer oder mehreren Spalten. Ohne diese Klausel ist die Rückgabereihenfolge nicht garantiert.

Wie sortiert man absteigend mit ORDER BY?

Das Schlüsselwort DESC nach dem Spaltennamen kehrt die Reihenfolge um: ORDER BY preis DESC liefert den höchsten Preis zuerst. Standard ohne Angabe ist ASC (aufsteigend).

Was bedeutet ORDER BY 1, 2, 3 in SQL?

Die Zahlen beziehen sich auf die Position der Spalten in der SELECT-Liste. ORDER BY 1, 2 sortiert zuerst nach der ersten, dann nach der zweiten Ausgabespalte. In produktivem Code sind Spaltennamen lesbarer und weniger fehleranfällig.

Kann man in einer Abfrage zwei ORDER BY-Bedingungen kombinieren?

Ja, durch Komma getrennt: ORDER BY abteilung ASC, gehalt DESC sortiert zuerst nach Abteilung aufsteigend, bei Gleichstand dann nach Gehalt absteigend. Es gibt nur eine ORDER BY-Klausel pro Abfrage, aber beliebig viele Sortierausdrücke darin.

Wo kann man SQL ORDER BY interaktiv üben?

Logicexcel bietet kostenlose SQL-Übungen direkt im Browser unter Logicexcel, ohne Anmeldung. Sortieraufgaben, Paginierung und NULL-Handling sind alle enthalten.

Empfehlung