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 addressesORDER BY city;Wählt die Adressen, sortiert nach Stadtname absteigend mit Nulls am Ende:
SELECT *FROM addressesORDER BY city DESC NULLS LAST;Sortiert nach Stadt und anschließend nach Postleitzahl, beide mit der Standardsortierung:
SELECT *FROM addressesORDER BY city, zip;Sortiert nach Stadt mit deutschen Kollationsregeln:
SELECT *FROM addressesORDER BY city COLLATE DE;Beispiele zu ORDER BY ALL
Sortiert von links nach rechts (nach address, dann city, dann zip) aufsteigend:
SELECT *FROM addressesORDER 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 addressesORDER 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 |