Zum Inhalt springen

ORDER BY-Klausel

ORDER BY ist ein Ausgabemodifikator. Logisch wird er gegen Ende der Abfrage angewendet (knapp vor LIMIT oder OFFSET, falls vorhanden). Die ORDER BY-Klausel sortiert die Zeilen nach den Sortierkriterien aufsteigend oder absteigend. Zusätzlich kann jede Sortierklausel festlegen, ob NULL-Werte an den Anfang oder ans Ende verschoben werden.

Die ORDER BY-Klausel kann einen oder mehrere durch Kommas getrennte Ausdrücke enthalten. Ohne Ausdrücke wird ein Fehler ausgelöst, weil die ORDER BY-Klausel in dem Fall entfernt werden sollte. Die Ausdrücke können mit einem beliebigen skalaren Ausdruck beginnen (z. B. einem Spaltennamen), einer Spaltenpositionsnummer (Indexierung ab 1) oder dem Schlüsselwort ALL. Auf jeden Ausdruck kann optional ein Sortiermodifikator folgen (ASC oder DESC, Standard ist ASC) und/oder ein NULL-Reihenfolgemodifikator (NULLS FIRST oder NULLS LAST, Standard ist NULLS LAST).

ORDER BY ALL

Das Schlüsselwort ALL bedeutet, dass die Ausgabe nach jeder Spalte von links nach rechts sortiert wird. Die Richtung dieser Sortierung kann mit ORDER BY ALL ASC oder ORDER BY ALL DESC und/oder NULLS FIRST bzw. NULLS LAST geändert werden. ALL darf nicht mit anderen Ausdrücken in der ORDER BY-Klausel kombiniert werden – es muss allein stehen. Siehe die Beispiele unten.

NULL-Reihenfolgemodifikator

Standardmäßig sortiert DuckDB ASC und NULLS LAST, d. h. die Werte werden aufsteigend sortiert und NULL-Werte stehen am Ende. Für die Standardrichtung ASC entspricht das PostgreSQL. DuckDB behält NULLS LAST jedoch auch bei DESC bei, während PostgreSQL bei DESC die NULLs zuerst setzt (es behandelt NULL als den größten Wert). Um PostgreSQL in beiden Richtungen nachzubilden, setzen Sie default_null_order = 'NULLS_LAST_ON_ASC_FIRST_ON_DESC'. Die Standardsortierreihenfolge kann mit den folgenden Konfigurationsoptionen geändert werden.

Mit der Option default_null_order ändern Sie die Standard-NULL-Sortierreihenfolge auf NULLS_FIRST, NULLS_LAST, NULLS_FIRST_ON_ASC_LAST_ON_DESC oder NULLS_LAST_ON_ASC_FIRST_ON_DESC:

SET default_null_order = 'NULLS_FIRST';

Mit der Option default_order ändern Sie die Richtung der Standardsortierung auf DESC oder ASC:

SET default_order = 'DESC';

Kollationen

Text wird standardmäßig mit der binären Vergleichskollation sortiert, d. h. die Werte werden nach ihren binären UTF-8-Werten sortiert. Das funktioniert gut für ASCII-Text (z. B. für englische Daten), die Sortierreihenfolge kann für andere Sprachen jedoch falsch sein. Dafür stellt DuckDB Kollationen bereit. Weitere Informationen zu Kollationen finden Sie auf der Kollationsseite.

Beispiele

Alle Beispiele verwenden diese Beispieltabelle:

CREATE OR REPLACE TABLE addresses AS
SELECT '123 Quack Blvd' AS address, 'DuckTown' AS city, '11111' AS zip
UNION ALL
SELECT '111 Duck Duck Goose Ln', 'DuckTown', '11111'
UNION ALL
SELECT '111 Duck Duck Goose Ln', 'Duck Town', '11111'
UNION ALL
SELECT '111 Duck Duck Goose Ln', 'Duck Town', '11111-0001';

Wählt die Adressen, sortiert nach Stadtname mit der Standard-NULL-Reihenfolge und der Standardsortierung:

SELECT *
FROM addresses
ORDER BY city;

Wählt die Adressen, sortiert nach Stadtname absteigend mit Nulls am Ende:

SELECT *
FROM addresses
ORDER BY city DESC NULLS LAST;

Sortiert nach Stadt und anschließend nach Postleitzahl, beide mit der Standardsortierung:

SELECT *
FROM addresses
ORDER BY city, zip;

Sortiert nach Stadt mit deutschen Kollationsregeln:

SELECT *
FROM addresses
ORDER BY city COLLATE DE;

Beispiele zu ORDER BY ALL

Sortiert von links nach rechts (nach address, dann city, dann zip) aufsteigend:

SELECT *
FROM addresses
ORDER BY ALL;
address city zip
111 Duck Duck Goose Ln Duck Town 11111
111 Duck Duck Goose Ln Duck Town 11111-0001
111 Duck Duck Goose Ln DuckTown 11111
123 Quack Blvd DuckTown 11111

Sortiert von links nach rechts (nach address, dann city, dann zip) absteigend:

SELECT *
FROM addresses
ORDER BY ALL DESC;
address city zip
123 Quack Blvd DuckTown 11111
111 Duck Duck Goose Ln DuckTown 11111
111 Duck Duck Goose Ln Duck Town 11111-0001
111 Duck Duck Goose Ln Duck Town 11111

Syntax