Database
 sql >> Datenbank >  >> RDS >> Database

SQL ORDER BY-Klausel für Anfänger

Der ORDER BY -Klausel wird häufig in SQL verwendet, um die Ergebnisse einer Abfrage zu sortieren.

Damit können Sie die Reihenfolge angeben, in der die Ergebnisse zurückgegeben werden.

Sie können festlegen, ob die Ergebnisse in aufsteigender oder absteigender Reihenfolge sortiert werden. Sie können auch mehrere Spalten zum Sortieren angeben.

Beispiel

Hier ist ein Beispiel, um den ORDER BY zu demonstrieren Klausel.

SELECT 
    VendorId,
    ProductName,
    ProductPrice
FROM Products
ORDER BY VendorId ASC;

Ergebnis:

+------------+---------------------------------+----------------+
| VendorId   | ProductName                     | ProductPrice   |
|------------+---------------------------------+----------------|
| 1001       | Left handed screwdriver         | 25.99          |
| 1001       | Long Weight (blue)              | 14.75          |
| 1001       | Long Weight (green)             | 11.99          |
| 1002       | Sledge Hammer                   | 33.49          |
| 1003       | Chainsaw                        | 245.00         |
| 1003       | Straw Dog Box                   | 55.99          |
| 1004       | Bottomless Coffee Mugs (4 Pack) | 9.99           |
+------------+---------------------------------+----------------+

Der ASC Teil bedeutet aufsteigend . Wenn Sie den ORDER BY verwenden -Klausel, ist sie standardmäßig aufsteigend, sodass Sie ASC weglassen können Teil, wenn Sie möchten.

Wir könnten die Abfrage also auch so schreiben:

SELECT 
    VendorId,
    ProductName,
    ProductPrice
FROM Products
ORDER BY VendorId;

Absteigende Reihenfolge

Um es absteigend zu sortieren verwenden Sie DESC .

SELECT 
    VendorId,
    ProductName,
    ProductPrice
FROM Products
ORDER BY VendorId DESC;

Ergebnis:

+------------+---------------------------------+----------------+
| VendorId   | ProductName                     | ProductPrice   |
|------------+---------------------------------+----------------|
| 1004       | Bottomless Coffee Mugs (4 Pack) | 9.99           |
| 1003       | Chainsaw                        | 245.00         |
| 1003       | Straw Dog Box                   | 55.99          |
| 1002       | Sledge Hammer                   | 33.49          |
| 1001       | Left handed screwdriver         | 25.99          |
| 1001       | Long Weight (blue)              | 14.75          |
| 1001       | Long Weight (green)             | 11.99          |
+------------+---------------------------------+----------------+

Ordnen Sie nach mehreren Spalten

Sie können mehrere Spalten angeben, nach denen sortiert werden soll. Dadurch können Sie angeben, wie die Zeilen sortiert werden sollen, wenn es mehrere Zeilen mit demselben Wert in der ersten sortierten Spalte gibt.

Es ist wahrscheinlich einfacher, dies an einem Beispiel zu demonstrieren.

SELECT 
    VendorId,
    ProductName,
    ProductPrice
FROM Products
ORDER BY VendorId DESC, ProductName DESC, ProductPrice DESC;

Ergebnis:

+------------+---------------------------------+----------------+
| VendorId   | ProductName                     | ProductPrice   |
|------------+---------------------------------+----------------|
| 1004       | Bottomless Coffee Mugs (4 Pack) | 9.99           |
| 1003       | Straw Dog Box                   | 55.99          |
| 1003       | Chainsaw                        | 245.00         |
| 1002       | Sledge Hammer                   | 33.49          |
| 1001       | Long Weight (green)             | 11.99          |
| 1001       | Long Weight (blue)              | 14.75          |
| 1001       | Left handed screwdriver         | 25.99          |
+------------+---------------------------------+----------------+

Wenn wir uns auf die drei Zeilen mit einer VendorId konzentrieren von 1001 , können wir sehen, dass das vorherige Beispiel die Produktnamen in aufsteigender Reihenfolge zurückgegeben hat, aber in diesem Beispiel haben wir sie in absteigender Reihenfolge zurückgegeben. Das liegt daran, dass wir den ProductName nominiert haben als zweite Spalte in unserem ORDER BY -Klausel, und wir haben DESC angegeben für absteigende Reihenfolge.

Die zweite Spalte greift nur, wenn es Duplikate in der ersten ORDER BY gibt Säule. Wenn nicht, sind alle nachfolgenden Spalten für die weitere Sortierung irrelevant.

Wenn wir uns den ProductPrice ansehen -Spalte sehen wir, dass diese Spalte keine Auswirkung auf die Sortierung hatte, obwohl wir ProductPrice DESC angegeben haben . Wir können sehen, dass die Preise alle in aufsteigender Reihenfolge sind, obwohl wir darauf bestehen, dass sie in absteigender Reihenfolge sein sollten. Der Grund, warum diese Spalte keine Auswirkung hatte, liegt darin, dass es in der zuvor sortierten Spalte keine Duplikate gab. Daher wirkte sich die Reihenfolge der ersten beiden Spalten auf die Ergebnisse aus, die Reihenfolge der dritten Spalte jedoch nicht.

Das soll nicht heißen, dass die dritte Spalte niemals Wirkung zeigen wird. Wenn wir später einen anderen Left handed screwdriver eingesetzt haben , aber zu einem anderen Preis als dem ProductPrice Die Reihenfolge der Spalte würde aufgrund der Tatsache wirksam, dass es doppelte Werte im ProductName gibt Spalte.

Aufsteigendes mit Absteigendem mischen

Sie können jede Spalte mit aufsteigender und absteigender Reihenfolge mischen. Sie müssen nicht alle gleich sein. Zum Beispiel könnten wir dies tun:

SELECT 
    VendorId,
    ProductName,
    ProductPrice
FROM Products
ORDER BY VendorId DESC, ProductName ASC, ProductPrice DESC;

Ergebnis:

+------------+---------------------------------+----------------+
| VendorId   | ProductName                     | ProductPrice   |
|------------+---------------------------------+----------------|
| 1004       | Bottomless Coffee Mugs (4 Pack) | 9.99           |
| 1003       | Chainsaw                        | 245.00         |
| 1003       | Straw Dog Box                   | 55.99          |
| 1002       | Sledge Hammer                   | 33.49          |
| 1001       | Left handed screwdriver         | 25.99          |
| 1001       | Long Weight (blue)              | 14.75          |
| 1001       | Long Weight (green)             | 11.99          |
+------------+---------------------------------+----------------+

Ordnen Sie nach Spaltenaliasen

Der ORDER BY -Klausel akzeptiert Spaltenaliase als eine Spalte, nach der sortiert werden soll.

Zum Beispiel könnten wir dies tun:

SELECT 
    VendorId AS ID,
    ProductName AS Name,
    ProductPrice AS Price
FROM Products
ORDER BY ID DESC, Name DESC, Price DESC;

Ergebnis:

+------+---------------------------------+---------+
| ID   | Name                            | Price   |
|------+---------------------------------+---------|
| 1004 | Bottomless Coffee Mugs (4 Pack) | 9.99    |
| 1003 | Straw Dog Box                   | 55.99   |
| 1003 | Chainsaw                        | 245.00  |
| 1002 | Sledge Hammer                   | 33.49   |
| 1001 | Long Weight (green)             | 11.99   |
| 1001 | Long Weight (blue)              | 14.75   |
| 1001 | Left handed screwdriver         | 25.99   |
+------+---------------------------------+---------+

Ordnen Sie nach Spalten, die nicht in der SELECT-Liste enthalten sind

Der ORDER BY -Klausel akzeptiert Spalten, die nicht in SELECT angegeben sind Liste.

Mit anderen Worten, Sie müssen keine Spalte auswählen, um nach dieser Spalte zu sortieren.

Beispiel:

SELECT
    ProductName AS Name,
    ProductPrice AS Price
FROM Products
ORDER BY VendorId DESC, Name DESC, Price DESC;

Ergebnis:

+---------------------------------+---------+
| Name                            | Price   |
|---------------------------------+---------|
| Bottomless Coffee Mugs (4 Pack) | 9.99    |
| Straw Dog Box                   | 55.99   |
| Chainsaw                        | 245.00  |
| Sledge Hammer                   | 33.49   |
| Long Weight (green)             | 11.99   |
| Long Weight (blue)              | 14.75   |
| Left handed screwdriver         | 25.99   |
+---------------------------------+---------+

Hier haben wir nach der VendorId bestellt Spalte, obwohl wir sie nicht in SELECT aufgenommen haben Liste.

Nach Spalten-ID sortieren

Der ORDER BY -Klausel akzeptiert auch die Spalten-ID anstelle des Spaltennamens.

Zum Beispiel könnten wir dies tun:

SELECT 
    VendorId AS ID,
    ProductName AS Name,
    ProductPrice AS Price
FROM Products
ORDER BY 1 DESC, 2 DESC, 3 DESC;

Ergebnis:

+------+---------------------------------+---------+
| ID   | Name                            | Price   |
|------+---------------------------------+---------|
| 1004 | Bottomless Coffee Mugs (4 Pack) | 9.99    |
| 1003 | Straw Dog Box                   | 55.99   |
| 1003 | Chainsaw                        | 245.00  |
| 1002 | Sledge Hammer                   | 33.49   |
| 1001 | Long Weight (green)             | 11.99   |
| 1001 | Long Weight (blue)              | 14.75   |
| 1001 | Left handed screwdriver         | 25.99   |
+------+---------------------------------+---------+

Dies wird jedoch nicht empfohlen.

Erstens macht es die Abfrage für andere schwieriger zu lesen und zu verstehen.

Zweitens, wenn jemand später die Reihenfolge der Spalten im SELECT geändert hat Liste, müssten sie auch die Reihenfolge von ORDER BY ändern aufführen. Dies könnte sehr leicht vergessen werden, und die Ergebnisse der Abfrage werden in der falschen Reihenfolge angezeigt.

Hier ist ein Beispiel dafür, was ich meine.

SELECT 
    ProductName AS Name,
    VendorId AS ID,
    ProductPrice AS Price
FROM Products
ORDER BY 1 DESC, 2 DESC, 3 DESC;

Ergebnis:

+---------------------------------+------+---------+
| Name                            | ID   | Price   |
|---------------------------------+------+---------|
| Straw Dog Box                   | 1003 | 55.99   |
| Sledge Hammer                   | 1002 | 33.49   |
| Long Weight (green)             | 1001 | 11.99   |
| Long Weight (blue)              | 1001 | 14.75   |
| Left handed screwdriver         | 1001 | 25.99   |
| Chainsaw                        | 1003 | 245.00  |
| Bottomless Coffee Mugs (4 Pack) | 1004 | 9.99    |
+---------------------------------+------+---------+

Ich habe lediglich den ProductPrice verschoben Position der Spalte in SELECT Liste, und es hat die Reihenfolge der Ergebnisse komplett durcheinander gebracht.

Standardreihenfolge

In SQL, wenn Sie ORDER BY nicht verwenden -Klausel gibt es keine Garantie, in welcher Reihenfolge Ihre Ergebnisse angezeigt werden. Auch wenn es aussehen kann wie Ihre Datenbank die Ergebnisse nach einer bestimmten Spalte sortiert, ist dies möglicherweise nicht der Fall.

Generell ohne ORDER BY -Klausel werden die Daten in der Reihenfolge sortiert, in der sie in die Tabelle geladen wurden. Wenn jedoch Zeilen gelöscht oder aktualisiert wurden, wird die Reihenfolge davon beeinflusst, wie das DBMS den zurückgewonnenen Speicherplatz wiederverwendet.

Verlassen Sie sich daher nicht darauf, dass das DBMS die Ergebnisse in einer sinnvollen Reihenfolge sortiert. Wenn Sie möchten, dass Ihre Ergebnisse sortiert werden, verwenden Sie den ORDER BY Klausel.

Bestellung mit Ausnahmen

Es kann vorkommen, dass Sie eine Ausnahme in Ihren ORDER BY aufnehmen müssen Klausel.

Sie möchten beispielsweise alphabetisch nach einer Spalte mit Ausnahme einer Zeile sortieren. Möglicherweise möchten Sie, dass eine Zeile (oder mehrere Zeilen) ganz oben angezeigt werden, während alle übrigen Zeilen in einer bestimmten Reihenfolge angeordnet sind.

Glücklicherweise gibt es eine einfache Möglichkeit, dies zu tun. Siehe So schreiben Sie eine ORDER BY-Klausel mit Ausnahmen, wenn Sie dies tun müssen.