Die ORDER BY
-Klausel steuert die Reihenfolge, in der Zeilen zurückgegeben oder verarbeitet werden. Es kann in jeder selectionquery verwendet werden, einschließlichals Operand von INSERT
oder UPSERT
, sowie mit DELETE
und UPDATE
Anweisungen.
- Zusammenfassung
- Parameter
- Order preservation
- Reihenfolge der Zeilen ohne ORDER BY
- Sortieren mit einfacher Spaltenauswahl
- Sortieren mit mehreren Spalten
- Umkehren der Sortierreihenfolge
- Sortierung in Primärschlüsselreihenfolge
- Sortierung in Indexreihenfolge
- Zeilen in DML-Anweisungen ordnen
- Sortieren der Ausgabe von deletes
- Siehe auch
Zusammenfassung
Parameter
Die Klausel ORDER BY
verwendet eine kommagetrennte Liste von Bestellspezifikationen.Jede Bestellspezifikation besteht aus einer Spaltenauswahl, der optional das Schlüsselwort ASC
oder DESC
folgt.
Jede Spaltenauswahl kann eine der folgenden Formen annehmen:
- Eine einfache Spaltenauswahl, die wie folgt bestimmt wird:
- Der Name einer Spaltenbezeichnung, die zuvor in der
SELECT
-Klausel mitAS
konfiguriert wurde. Dabei wird der von derSELECT
-Klausel berechnete Wert als Sortierschlüssel verwendet. - Eine positive Ganzzahl, die eine der Spalten in der Datenquelle angibt, entweder die
FROM
-Klausel derSELECT
-Klausel, in der sie auftritt, oder die Tabelle, in dieDELETE
oderUPDATE
geschrieben wird. Dabei wird der entsprechende Eingabewert aus der Datenquelle als Sortierschlüssel verwendet. - Ein beliebiger skalarer Ausdruck. Dies verwendet das Ergebnis der Auswertung dieses Ausdrucks als Sortierschlüssel.
- Der Name einer Spaltenbezeichnung, die zuvor in der
- Die Notation
PRIMARY KEY <table_name>
. Dies verwendet die Primärschlüsselspalte (n) der angegebenen Tabelle als Sortierschlüssel. Diese Tabelle muss Teil der Datenquelle sein. - Die Notation
INDEX <table_name>@<index_name>
. Dabei werden die durch den angegebenen Index indizierten Spalten als Sortierschlüssel verwendet. Diese Tabelle muss Teil der Datenquelle sein.
Das optionale Schlüsselwort ASC
nach einer Spaltenauswahl zeigt usethe Sortierschlüssel an, wie er ist, und ist daher bedeutungslos.
Das optionale Schlüsselwort DESC
invertiert die Richtung der Spalte(n), die durch die unmittelbar vorangestellte Auswahl ausgewählt wurden.
CockroachDB unterstützt NULLS FIRST
/NULLS LAST
in ORDER BY
Klauseln zur Kompatibilität mit der PostgreSQL-Zeilensortiersyntax.
Die Unterstützung für NULLS LAST
ist derzeit nur syntaxbezogen. Wenn Sie NULLS LAST
in einer ORDER BY
-Klausel angeben, verwendet CockroachDB NULLS FIRST
und gibt keinen Fehler zurück.
Order preservation
Im Allgemeinen ist die Reihenfolge der Zwischenergebnisse einer Abfrage nicht garantiert, auch wenn ORDER BY
angegeben ist. Mit anderen Worten, die ORDER BY
Klausel ist nurwirksam bei der Anweisung der obersten Ebene. Beispielsweise wird es vom queryplanner ignoriert, wenn es in einer Unterabfrage in einer FROM
-Klausel wie folgt vorhanden ist:
> SELECT * FROM a, b ORDER BY a.x; -- valid, effective> SELECT * FROM (SELECT * FROM a ORDER BY a.x), b; -- ignored, ineffective
Wenn Sie jedoch Abfragen zusammen mit Unterabfragen kombinieren, wird bei einigen Kombinationen die Klausel ORDER BY
in einer Unterabfrage bedeutsam:
- Die Reihenfolge des Operanden einer
WITH ORDINALITY
-Klausel (innerhalb desFROM
-Operanden einerSELECT
-Klausel) wird beibehalten, um die Nummerierung der Zeilen zu steuern. - Die Reihenfolge des Operanden einer eigenständigen
LIMIT
– oderOFFSET
-Klausel (mit demFROM
-Operanden einerSELECT
-Klausel) wird beibehalten, um zu bestimmenwelche Zeilen im Ergebnis beibehalten werden. - Die Reihenfolge der Datenquelle für eine
INSERT
-Anweisung oder eineUPSERT
-Anweisung, die auchLIMIT
verwendet, wird beibehalten, um zu bestimmen, welche Zeilen verarbeitet werden, nicht jedoch deren Reihenfolge. - Die Reihenfolge, die für eine Anweisung
UPDATE
oderDELETE
angegeben ist, die auchLIMIT
verwendet, wird verwendet, um zu bestimmen, welche Zeilen verarbeitet werden, nicht jedoch deren Reihenfolge.(Dies ist eine CockroachDB-Erweiterung.) - Die Reihenfolge einer in einem skalaren Ausdruck verwendeten Unterabfrage bleibt erhalten.
Verwenden Sie beispielsweise WITH ORDINALITY
:
> SELECT * FROM (SELECT * FROM a ORDER BY a.x) WITH ORDINALITY; -- ensures that the rows are numbered in the order of column a.x.
Verwenden Sie beispielsweise eine eigenständige LIMIT
-Klausel in FROM
:
Wenn Sie beispielsweise eine Unterabfrage im skalaren Kontext verwenden:
Reihenfolge der Zeilen ohne ORDER BY
Ohne ORDER BY
, werden Zeilen in anon-deterministischer Reihenfolge verarbeitet oder zurückgegeben. „Nicht deterministisch“ bedeutet, dass die tatsächliche Reihenfolge vom logischen Plan, der Reihenfolge der Daten auf der Festplatte und der Topologie des CockroachDB-Clusters abhängen kann und im Allgemeinen im Laufe der Zeit variabel ist.
Sortieren mit einfacher Spaltenauswahl
Unter Berücksichtigung der folgenden Tabelle:
> CREATE TABLE a(a INT);> INSERT INTO a VALUES (1), (3), (2);
Die folgenden Anweisungen sind äquivalent:
+---------+| a |+---------+| 1 || 2 || 3 |+---------+(3 rows)
Beachten Sie, dass die Reihenfolge der Regeln wichtig ist. Wenn es Mehrdeutigkeiten gibt, haben die AS
Aliasesvorrang vor den Datenquellenspalten, zum Beispiel:
Es ist auch möglich, mit einem beliebigen skalaren Ausdruck zu sortieren, der für jede Zeile berechnet wird, zum Beispiel:
> SELECT a, b FROM ab ORDER BY a + b; -- orders by the result of computing a+b.
Sortieren mit mehreren Spalten
Wenn mehr als eine Bestellspezifikation angegeben ist, werden die späteren Spezifikationen verwendet, um Zeilen zu ordnen, die den früheren Spezifikationen entsprechen, z. B.:
> CREATE TABLE ab(a INT, b INT);> SELECT a, b FROM ab ORDER BY b, a;
Dies sortiert die Ergebnisse nach Spalte b
, und wenn es dann mehrere Zeilen gibt, die den gleichen Wert in Spalte b
haben, werden diese Zeilen nach Spalte a
sortiert.
Umkehren der Sortierreihenfolge
Das Schlüsselwort DESC
(„absteigend“) kann nach einer Sortierspezifikation hinzugefügt werden, um seine Reihenfolge umzukehren. Dies kann für jede Spezifikation separat angegeben werden, zum Beispiel:
> CREATE TABLE ab(a INT, b INT);> SELECT a, b FROM ab ORDER BY b DESC, a; -- sorts on b descending, then a ascending.
Sortierung in Primärschlüsselreihenfolge
Die Notation ORDER BY PRIMARY KEY
garantiert, dass die Ergebnisse in Primärschlüsselreihenfolge dargestellt werden.
Der besondere Vorteil besteht darin, dass bei Abfragen, die den Primärindex verwenden, die Reihenfolge garantiert und gleichzeitig garantiert wird, dass es keine zusätzliche Sortierberechnung gibt, um dies zu erreichen, zum Beispiel:
> CREATE TABLE kv(k INT PRIMARY KEY, v INT);> SELECT k, v FROM kv ORDER BY PRIMARY KEY kv; -- guarantees ordering by column k.
Wenn ein Primärschlüssel bereits das Schlüsselwort DESC
verwendet, wird seine Bedeutung umgedreht (abgebrochen), wenn die Klausel ORDER BY
auchDESC
verwendet, z. B.:
Sortierung in Indexreihenfolge
Die Notation ORDER BY INDEX
garantiert, dass die Ergebnisse in der Reihenfolge eines bestimmten Index angezeigt werden.
Der besondere Vorteil besteht darin, dass dies bei Abfragen, die diesen Index verwenden, die Reihenfolge garantiert und gleichzeitig garantiert, dass es keine zusätzliche Sortierberechnung gibt, um dies zu erreichen, zum Beispiel:
> CREATE TABLE kv(k INT PRIMARY KEY, v INT, INDEX v_idx(v));> SELECT k, v FROM kv ORDER BY INDEX kv@v_idx; -- guarantees ordering by column v.
Wenn ein Index das Schlüsselwort DESC
bereits verwendet, wird seine Bedeutung umgedreht (abgebrochen), wenn die Klausel ORDER BY
auchDESC
verwendet, z. B.:
Zeilen in DML-Anweisungen ordnen
Bei Verwendung von ORDER BY
mit INSERT
,UPSERT
, UPDATE
oderDELETE
(d.h., eine DML-Anweisung), wird die ORDER BY
-Klausel ignoriert, wenn sie nicht in Kombination mit LIMIT
und/oderOFFSET
verwendet wird.
Die Kombination von ORDER BY
und LIMIT
/OFFSET
bestimmt, welche Zeilen der Eingabe zum Einfügen, Aktualisieren oder Löschen der Tabellendaten verwendet werden, bestimmt jedoch nicht, in welcher Reihenfolge die Mutation stattfindet.
Verwenden Sie beispielsweise LIMIT
in INSERT
:
> INSERT INTO a SELECT * FROM b ORDER BY b.x LIMIT 1; -- ensures that only the first row of b in the order of column b.x -- is inserted into a.
Der Grund, warum ORDER BY
die endgültige Reihenfolge der Zeilen in der Tabelle nicht steuert, besteht darin, dass die Reihenfolge der Zeilen in der Zieltabelle durch ihre Primär- und Sekundärindizes bestimmt wird.
Um das Ergebnis der RETURNING
-Klausel zu sortieren, lesen Sie Sortieren der Ausgabe von Löschvorgängen.
Sortieren der Ausgabe von deletes
Um die Ausgabe einer DELETE
Anweisung zu sortieren, verwenden Sie:
> WITH a AS (DELETE ... RETURNING ...) SELECT ... FROM a ORDER BY ...
Ein Beispiel finden Sie unter Sortieren und Zurückgeben gelöschter Zeilen.
Siehe auch
- Selektionsabfragen
- Skalare Ausdrücke
INSERT
UPSERT
DELETE
UPDATE
War diese Seite hilfreich?
Ja Nein