Sortierung von Abfrageergebnissen

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

ORDERBYa_exprASCDESCNULLSFIRSTLASTPRIMARYKEYtable_nameINDEXtable_name@index_nameASCDESC,

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:
    1. Der Name einer Spaltenbezeichnung, die zuvor in der SELECT -Klausel mit AS konfiguriert wurde. Dabei wird der von der SELECT -Klausel berechnete Wert als Sortierschlüssel verwendet.
    2. Eine positive Ganzzahl, die eine der Spalten in der Datenquelle angibt, entweder die FROM -Klausel der SELECT -Klausel, in der sie auftritt, oder die Tabelle, in die DELETE oder UPDATE geschrieben wird. Dabei wird der entsprechende Eingabewert aus der Datenquelle als Sortierschlüssel verwendet.
    3. Ein beliebiger skalarer Ausdruck. Dies verwendet das Ergebnis der Auswertung dieses Ausdrucks als Sortierschlüssel.
  • 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.

Hinweis:

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:

Symbol/ Schaltflächen/kopieren
> 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:

  1. Die Reihenfolge des Operanden einer WITH ORDINALITY -Klausel (innerhalb des FROM -Operanden einer SELECT -Klausel) wird beibehalten, um die Nummerierung der Zeilen zu steuern.
  2. Die Reihenfolge des Operanden einer eigenständigen LIMIT – oder OFFSET -Klausel (mit dem FROM -Operanden einer SELECT -Klausel) wird beibehalten, um zu bestimmenwelche Zeilen im Ergebnis beibehalten werden.
  3. Die Reihenfolge der Datenquelle für eine INSERT-Anweisung oder eine UPSERT -Anweisung, die auchLIMIT verwendet, wird beibehalten, um zu bestimmen, welche Zeilen verarbeitet werden, nicht jedoch deren Reihenfolge.
  4. Die Reihenfolge, die für eine Anweisung UPDATE oder DELETEangegeben ist, die auch LIMIT verwendet, wird verwendet, um zu bestimmen, welche Zeilen verarbeitet werden, nicht jedoch deren Reihenfolge.(Dies ist eine CockroachDB-Erweiterung.)
  5. Die Reihenfolge einer in einem skalaren Ausdruck verwendeten Unterabfrage bleibt erhalten.

Verwenden Sie beispielsweise WITH ORDINALITY:

Symbol/ Schaltflächen/kopieren
> 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:

icon/buttons/copy

Wenn Sie beispielsweise eine Unterabfrage im skalaren Kontext verwenden:

icon/buttons/copy

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:

Symbol / Schaltflächen /Kopieren
> CREATE TABLE a(a INT);> INSERT INTO a VALUES (1), (3), (2);

Die folgenden Anweisungen sind äquivalent:

icon/buttons/copy
+---------+| 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:

icon / buttons /copy

Es ist auch möglich, mit einem beliebigen skalaren Ausdruck zu sortieren, der für jede Zeile berechnet wird, zum Beispiel:

Symbol/ Schaltflächen/kopieren
> 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.:

Symbol / Schaltflächen/kopieren
> 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:

icon/buttons/copy
> 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:

icon/buttons/copy
> 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.:

icon / buttons/copy

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:

icon/buttons/copy
> 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.:

icon/buttons/copy

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:

Symbol/ Schaltflächen/kopieren
> 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:

icon/buttons/copy
> 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

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.