Kategorien:

Abfragesyntax

ORDER BY

Gibt eine Reihenfolge der Zeilen in der Ergebnistabelle aus einer SELECT-Liste an.

Syntax

Sorting by specific columns

SELECT ...
  FROM ...
  ORDER BY orderItem [ , orderItem , ... ]
  [ ... ]
Copy

Wobei:

orderItem ::= { <column_alias> | <position> | <expr> } [ { ASC | DESC } ] [ NULLS { FIRST | LAST } ]
Copy

Sorting by all columns

SELECT ...
  FROM ...
  ORDER BY ALL [ { ASC | DESC } ] [ NULLS { FIRST | LAST } ]
  [ ... ]
Copy

Parameter

column_alias

Spaltenalias, der in der Liste SELECT des Abfrageblocks angezeigt wird.

position

Position eines Ausdrucks in der Liste SELECT.

expr

Jeder Ausdruck in Tabellen im aktuellen Bereich.

{ ASC | DESC }

Gibt optional die Werte des Sortierschlüssels in aufsteigender Reihenfolge (niedrigster bis höchster Wert) oder absteigender Reihenfolge (höchster bis niedrigster Wert) zurück.

Standard: ASC

NULLS { FIRST | LAST }

Gibt optional an, ob anhand der Sortierreihenfolge (ASC oder DESC) NULL-Werte vor bzw. nach Nicht-NULL-Werten zurückgegeben werden.

Standard: Hängt von der Sortierreihenfolge (ASC oder DESC) ab. Weitere Informationen dazu finden Sie in den Nutzungshinweisen unten.

ALL

Sortiert die Ergebnisse nach allen in der SELECT-Liste angegebenen Spalten. Die Ergebnisse werden nach den Spalten in der Reihenfolge sortiert, in der sie erscheinen.

Nehmen wir beispielsweise an, die SELECT-Liste enthält:

SELECT col_1, col_2, col_3
  FROM my_table
  ORDER BY ALL;
Copy

Die Ergebnisse werden zuerst nach col_1, dann nach col_2 und dann nach col_3 sortiert.

Bemerkung

Sie können ORDER BY ALL nicht angeben, wenn eine Spalte in der SELECT-Liste eine Aggregatfunktion verwendet.

Nutzungshinweise

  • Alle Daten werden anhand des numerischen Bytewerts einzelner Zeichen in der ASCII-Tabelle sortiert. UTF-8-Codierung wird unterstützt.

  • Bei numerischen Werten haben führende Nullen vor dem Dezimalzeichen und nachstehende Nullen (0) nach dem Dezimalzeichen keine Auswirkung auf die Sortierreihenfolge.

  • Wenn NULLS FIRST oder NULLS LAST nicht angegeben ist, hängt die Reihenfolge der NULL-Werte von der Einstellung des Parameters DEFAULT_NULL_ORDERING und der Sortierreihenfolge ab:

    • Wenn die Sortierreihenfolge ASC ist (Standardeinstellung) und der Parameter DEFAULT_NULL_ORDERING auf LAST gesetzt ist (Standardeinstellung), werden NULL-Werte zuletzt zurückgegeben. Sofern nicht anders angegeben, gelten daher die NULL-Werte als höher als alle Nicht-NULL-Werte.

    • Wenn die Sortierreihenfolge ASC ist und der DEFAULT_NULL_ORDERING-Parameter auf FIRST gesetzt ist, werden NULL-Werte zuerst zurückgegeben.

    • Wenn die Sortierreihenfolge DESC ist und der DEFAULT_NULL_ORDERING-Parameter auf FIRST gesetzt ist, werden NULL-Werte zuletzt zurückgegeben.

    • Wenn die Sortierreihenfolge DESC ist und der DEFAULT_NULL_ORDERING-Parameter auf LAST gesetzt ist, werden NULL-Werte zuerst zurückgegeben.

  • Es ist nicht garantiert, dass die Sortierreihenfolge für Werte unterschiedlicher Datentypen in semistrukturierten Daten konsistent ist, z. B. in einem Array, das Elemente unterschiedlicher Datentypen enthält.

  • Top-K Pruning kann die Leistung von Abfragen verbessern, die sowohl LIMIT- als auch ORDER BY-Klauseln enthalten. Weitere Informationen dazu finden Sie unter Top-K Pruning für verbesserte Abfrageleistung.

  • Ein ORDER BY kann auf verschiedenen Ebenen einer Abfrage verwendet werden, z. B. in einer Unterabfrage oder in einer OVER()-Unterklausel. Ein ORDER BY innerhalb einer Unterabfrage oder Unterklausel gilt nur innerhalb dieser Unterabfrage oder Unterklausel. Beispielsweise sortiert das ORDER BY in der folgenden Abfrage die Ergebnisse nur innerhalb der Unterabfrage, aber nicht auf der äußersten Ebene der Abfrage:

    SELECT * 
      FROM (
        SELECT branch_name
          FROM branch_offices
          ORDER BY monthly_sales DESC
          LIMIT 3
      );
    
    Copy

    In diesem Beispiel wird ORDER BY in der Unterabfrage angegeben, sodass die Unterabfrage die Namen in der Reihenfolge der monatlichen Verkäufe zurückgibt. Das ORDER BY in der Unterabfrage gilt nicht für die äußere Abfrage. Diese Abfrage gibt die Namen der drei Filialen zurück, die den höchsten monatlichen Umsatz erzielt haben, jedoch nicht unbedingt nach monatlichen Umsätzen sortiert.

    Das Sortieren kann teuer sein. Wenn die Ergebnisse der äußeren Abfrage sortiert werden sollen, verwenden Sie eine ORDER BY-Klausel nur auf der obersten Abfrageebene und verwenden ORDER BY-Klauseln in Unterabfragen nur, wenn dies unbedingt erforderlich ist.

Beispiele

Die folgenden Beispiele zeigen, wie ORDER BY zum Sortieren der Ergebnisse verwendet wird:

Sortieren nach Zeichenfolgenwerten

Im folgenden Beispiel werden die Ergebnisse nach Zeichenfolgenwerten sortiert:

SELECT column1
  FROM VALUES
    ('a'), ('1'), ('B'), (null), ('2'), ('01'), ('05'),
    (' this'), ('this'), ('this and that'), ('&'), ('%')
  ORDER BY column1;
Copy
+---------------+
| COLUMN1       |
|---------------|
|  this         |
| %             |
| &             |
| 01            |
| 05            |
| 1             |
| 2             |
| B             |
| a             |
| this          |
| this and that |
| NULL          |
+---------------+

Sortieren nach numerischen Werten

Im folgenden Beispiel werden die Ergebnisse nach numerischen Werten sortiert:

SELECT column1
  FROM VALUES
    (3), (4), (null), (1), (2), (6),
    (5), (0005), (.05), (.5), (.5000)
  ORDER BY column1;
Copy
+---------+
| COLUMN1 |
|---------|
|    0.05 |
|    0.50 |
|    0.50 |
|    1.00 |
|    2.00 |
|    3.00 |
|    4.00 |
|    5.00 |
|    5.00 |
|    6.00 |
|    NULL |
+---------+

NULLS zuerst oder zuletzt sortieren

Im folgenden Beispiel werden alle Abfragen in der Sitzung so konfiguriert, dass NULLS zuletzt sortiert werden, indem der DEFAULT_NULL_ORDERING-Parameter auf LAST gesetzt wird.

ALTER SESSION SET DEFAULT_NULL_ORDERING = 'LAST';
Copy
SELECT column1
  FROM VALUES (1), (null), (2), (null), (3)
  ORDER BY column1;
Copy
+---------+
| COLUMN1 |
|---------|
|       1 |
|       2 |
|       3 |
|    NULL |
|    NULL |
+---------+
SELECT column1
  FROM VALUES (1), (null), (2), (null), (3)
  ORDER BY column1 DESC;
Copy
+---------+
| COLUMN1 |
|---------|
|    NULL |
|    NULL |
|       3 |
|       2 |
|       1 |
+---------+

Im folgenden Beispiel wird der DEFAULT_NULL_ORDERING-Parameter durch Angabe von NULLS FIRST in einer Abfrage überschrieben:

SELECT column1
  FROM VALUES (1), (null), (2), (null), (3)
  ORDER BY column1 NULLS FIRST;
Copy
+---------+
| COLUMN1 |
|---------|
|    NULL |
|    NULL |
|       1 |
|       2 |
|       3 |
+---------+

Im folgenden Beispiel wird der DEFAULT_NULL_ORDERING-Parameter auf FIRST gesetzt, damit NULLS zuerst sortiert werden:

ALTER SESSION SET DEFAULT_NULL_ORDERING = 'FIRST';
Copy
SELECT column1
  FROM VALUES (1), (null), (2), (null), (3)
  ORDER BY column1;
Copy
+---------+
| COLUMN1 |
|---------|
|    NULL |
|    NULL |
|       1 |
|       2 |
|       3 |
+---------+
SELECT column1
  FROM VALUES (1), (null), (2), (null), (3)
  ORDER BY column1 DESC;
Copy
+---------+
| COLUMN1 |
|---------|
|       3 |
|       2 |
|       1 |
|    NULL |
|    NULL |
+---------+

Im folgenden Beispiel wird der DEFAULT_NULL_ORDERING-Parameter durch Angabe von NULLS LAST in einer Abfrage überschrieben:

SELECT column1
  FROM VALUES (1), (null), (2), (null), (3)
  ORDER BY column1 NULLS LAST;
Copy
+---------+
| COLUMN1 |
|---------|
|       1 |
|       2 |
|       3 |
|    NULL |
|    NULL |
+---------+

Sortieren nach allen Spalten in der SELECT-Liste

Erstellen Sie die folgende Tabelle, um die Beispiele in diesem Abschnitt auszuführen:

CREATE OR REPLACE TABLE my_sort_example(a NUMBER, s VARCHAR, b BOOLEAN);

INSERT INTO my_sort_example VALUES
  (0, 'abc', TRUE),
  (0, 'abc', FALSE),
  (0, 'abc', NULL),
  (0, 'xyz', FALSE),
  (0, NULL, FALSE),
  (1, 'xyz', TRUE),
  (NULL, 'xyz', FALSE);
Copy

Im folgenden Beispiel werden die Ergebnisse nach allen Spalten der Tabelle sortiert:

SELECT * FROM my_sort_example
  ORDER BY ALL;
Copy

Wie unten gezeigt, werden die Ergebnisse zuerst nach der Spalte a, dann nach Spalte s und dann nach Spalte b sortiert (die Reihenfolge, in der die Spalten in der Tabelle definiert wurden).

+------+------+-------+
| A    | S    | B     |
|------+------+-------|
| 0    | abc  | False |
| 0    | abc  | True  |
| 0    | abc  | NULL  |
| 0    | xyz  | False |
| 0    | NULL | False |
| 1    | xyz  | True  |
| NULL | xyz  | False |
+------+------+-------+

Im folgenden Beispiel werden die Ergebnisse in aufsteigender Reihenfolge sortiert.

SELECT * FROM my_sort_example
  ORDER BY ALL ASC;
Copy
+------+------+-------+
| A    | S    | B     |
|------+------+-------|
| 0    | abc  | False |
| 0    | abc  | True  |
| 0    | abc  | NULL  |
| 0    | xyz  | False |
| 0    | NULL | False |
| 1    | xyz  | True  |
| NULL | xyz  | False |
+------+------+-------+

Im folgenden Beispiel wird der DEFAULT_NULL_ORDERING-Parameter so festgelegt, dass NULL-Werte für alle während der Sitzung ausgeführten Abfragen zuletzt sortiert werden:

ALTER SESSION SET DEFAULT_NULL_ORDERING = 'LAST';
Copy
SELECT * FROM my_sort_example
  ORDER BY ALL;
Copy
+------+------+-------+
| A    | S    | B     |
|------+------+-------|
| NULL | xyz  | False |
| 0    | NULL | False |
| 0    | abc  | NULL  |
| 0    | abc  | False |
| 0    | abc  | True  |
| 0    | xyz  | False |
| 1    | xyz  | True  |
+------+------+-------+

Im folgenden Beispiel wird NULLS FIRST in einer Abfrage angegeben, um diese Einstellung zu überschreiben:

SELECT * FROM my_sort_example
  ORDER BY ALL NULLS FIRST;
Copy
+------+------+-------+
| A    | S    | B     |
|------+------+-------|
| NULL | xyz  | False |
| 0    | NULL | False |
| 0    | abc  | NULL  |
| 0    | abc  | False |
| 0    | abc  | True  |
| 0    | xyz  | False |
| 1    | xyz  | True  |
+------+------+-------+

Im folgenden Beispiel werden die Spalten in der Reihenfolge b, s und a zurückgegeben. Die Ergebnisse werden zuerst nach b, dann nach s``und dann nach ``a sortiert:

SELECT b, s, a FROM my_sort_example
  ORDER BY ALL NULLS LAST;
Copy
+-------+------+------+
| B     | S    | A    |
|-------+------+------|
| False | abc  | 0    |
| False | xyz  | 0    |
| False | xyz  | NULL |
| False | NULL | 0    |
| True  | abc  | 0    |
| True  | xyz  | 1    |
| NULL  | abc  | 0    |
+-------+------+------+