Zurück zur Artikelliste Artikel
9 Leseminuten

Eine ausführliche Anleitung zu SQL ORDER BY

Oft ist es notwendig, die Ausgabe einer SQL-Abfrage in einer bestimmten Reihenfolge und nicht willkürlich darzustellen. In diesem Artikel erkläre ich Ihnen die vielen Möglichkeiten, die Sie mit der SQL-Klausel ORDER BY haben.

Um Datensätze in SQL zu sortieren, müssen Sie die ORDER BY Klausel verwenden. In diesem Artikel erkläre ich im Detail, wie Sie ORDER BY verwenden können, um die Ausgabe nach einer oder mehreren Spalten zu sortieren, und zwar in aufsteigender (A-Z) oder absteigender (Z-A) Reihenfolge und unter Verwendung vorhandener oder durch eine Aggregatfunktion berechneter Spalte(n). Keine Sorge - es ist nicht so kompliziert, wie es klingt!

Wie man Zeilen in SQL sortiert

Wenn Sie die Ausgabe Ihrer SQL-Abfrage nicht sortieren, wird die Reihenfolge der Zeilen willkürlich sein. Wenn Sie möchten, dass die Zeilen der Ergebnistabelle in einer bestimmten Reihenfolge erscheinen, müssen Sie die ORDER BY Klausel verwenden.

Die grundlegende Syntax für ORDER BY lautet wie folgt:

SELECT ...columns...
FROM table
ORDER BY sorting_column ASC/DESC;
  • Nach dem Schlüsselwort ORDER BY geben Sie einfach die Spalte(n) an, nach denen Sie die Datensätze sortieren möchten.
  • Diese Spalten müssen in der Ausgabe nicht angezeigt werden, d. h. sie werden in der Anweisung SELECT aufgeführt.
  • Die Sortierreihenfolge (aufsteigend oder absteigend) legen Sie mit den Schlüsselwörtern DESC und ASC fest. Das Schlüsselwort ASC ist optional; wenn kein Schlüsselwort nach dem Spaltennamen angegeben wird, werden die Zeilen standardmäßig in aufsteigender Reihenfolge sortiert.
  • ORDER BY wird an das Ende der Abfrage gesetzt.

In diesem Artikel finden Sie eine Animation, die zeigt, wie ORDER BY funktioniert. Sehen wir uns nun einige praktische ORDER BY Anwendungsfälle an.

ORDER BY Eine Spalte

Stellen Sie sich vor, wir betreiben ein Geschäft, das Halloween-Kostüme verkauft. Wir haben verschiedene Arten von Kostümen, Masken, Hüten und Accessoires auf Lager. Hier ist die Tabelle mit unseren products:

products
idnamecategoryquantityprice
11Wonder Womancostumes219.95
12Vampiremasks43.95
13Magic Wandaccessories62.50
14Wizard of Ozhats33.95
15Supermancostumes314.95
16Hulkcostumes212.50
17Witchhats44.95
18Rapunzelcostumes0NULL
19Snow Whitecostumes123.95
20Freddy Kruegermasks33.95
21Alienmasks0NULL
22Cowboyhats34.95
23Ghostbusteraccessories213.95
24Swordaccessories73.50
25Zombiemasks82.95

Einfaches ORDER BY: Sortieren nach einer Spalte

Beginnen wir mit einem sehr einfachen Beispiel: Wir sortieren unsere Artikel alphabetisch nach Namen. Um die Elemente in alphabetischer Reihenfolge zu sortieren, müssen wir nur unsere Ergebnismenge nach der Namensspalte in aufsteigender Reihenfolge ordnen. Wie wir wissen, ist die aufsteigende Reihenfolge die Standardeinstellung in SQL, so dass das Schlüsselwort ASC weggelassen werden kann. Hier ist unsere Abfrage:

SELECT *
FROM products
ORDER BY name;

Und hier ist das Ergebnis, mit allen Datensätzen, die alphabetisch nach dem Produktnamen sortiert sind:

idnamecategoryquantityprice
21Alienmasks0NULL
22Cowboyhats34.95
20Freddy Kruegermasks33.95
23Ghostbusteraccessories213.95
16Hulkcostumes212.50
13Magic Wandaccessories62.50
18Rapunzelcostumes0NULL
19Snow Whitecostumes123.95
15Supermancostumes314.95
24Swordaccessories73.50
12Vampiremasks43.95
17Witchhats44.95
14Wizard of Ozhats33.95
11Wonder Womancostumes219.95
25Zombiemasks82.95

Ziemlich einfach, oder? Lassen Sie uns nun unsere Halloween-Kostüme nach dem Preis sortieren, beginnend mit dem teuersten. Um vom höchsten zum niedrigsten Preis zu gelangen, muss in absteigender Reihenfolge sortiert werden. Daher sollte unsere ORDER BY-Klausel das Schlüsselwort DESC enthalten:

SELECT *
FROM products
ORDER BY price DESC;
idnamecategoryquantityprice
19Snow Whitecostumes123.95
11Wonder Womancostumes219.95
15Supermancostumes314.95
23Ghostbusteraccessories213.95
16Hulkcostumes212.50
17Witchhats44.95
22Cowboyhats34.95
14Wizard of Ozhats33.95
12Vampiremasks43.95
20Freddy Kruegermasks33.95
24Swordaccessories73.50
25Zombiemasks82.95
13Magic Wandaccessories62.50
21Alienmasks0NULL
18Rapunzelcostumes0NULL

Hier sind einige interessante Dinge über SQL-Sortierungen zu beachten:

  • Reihenfolge von Zeilen mit gleichem Wert. Einige Artikel in unserer Tabelle haben den gleichen Preis - insbesondere die Hexen- und Cowboyhüte kosten 4,95 $, während der Hut des Zauberers von Oz und die Masken des Vampirs und Freddy Krueger 3,95 $ kosten. Wie ordnet SQL solche Zeilen an? Es gibt eigentlich keine spezifischen Regeln für diese Fälle; das Ergebnis ist nicht-deterministisch. Mit anderen Worten, die Reihenfolge der Zeilen, die denselben Sortierspaltenwert enthalten, kann bei jeder Ausführung der Abfrage variieren. Wenn die Reihenfolge der Zeilen konsistent sein muss, verwenden Sie eine eindeutige Spalte zum Sortieren der Zeilen. Wenn das nicht möglich ist, versuchen Sie, die Ergebnismenge mit einer Kombination von Spalten zu sortieren, die eine bestimmte Reihenfolge ergeben. Wir werden das Sortieren nach mehreren Spalten später in diesem Artikel behandeln.
  • Sortierverhalten für NULL-Werte. In der obigen Ergebnistabelle werden Zeilen mit NULL-Werten in der Sortierspalte ganz ans Ende der Tabelle gesetzt. Dieses Verhalten ist jedoch in verschiedenen relationalen Datenbanken nicht einheitlich. Ich habe MySQL verwendet, um diese Abfrage auszuführen, und diese Datenbank betrachtet NULL-Werte als den niedrigsten möglichen Wert. Daher werden sie zuletzt sortiert, wenn eine absteigende Reihenfolge verlangt wird. Das Ergebnis wäre in den Datenbanken SQL Server und SQLite dasselbe. PostgreSQL- und Oracle-Datenbanken hingegen behandeln NULL-Werte als die größtmöglichen Werte und sortieren sie bei absteigender Reihenfolge an erster Stelle. In den meisten Fällen können Sie das Standardverhalten von ORDER BY in Bezug auf NULL-Werte ändern. Wie das geht, erfahren Sie in dieser ausführlichen Anleitung.

Großartig! Kommen wir nun zu komplizierteren Beispielen.

Sortieren nach einer Spalte, die durch eine Aggregatfunktion berechnet wurde

In SQL können Sie Ergebnisse nach einer oder mehreren berechneten Spalten sortieren. Diese Spalte kann mit einer der Aggregatfunktionen (wie AVG(), SUM(), COUNT(), MAX(), MIN()) oder einer anderen Methode berechnet werden. Schauen wir uns an, wie das in der Praxis funktioniert.

In unserem nächsten Beispiel wollen wir sehen, welche Produktkategorien teurere Artikel enthalten. Insbesondere wollen wir die Kategorien nach ihrem durchschnittlichen Produktpreis sortieren, beginnend mit dem teuersten.

Wir berechnen den Durchschnittspreis für jede Kategorie und sortieren die Zeilen dann in absteigender Reihenfolge nach dieser berechneten Spalte:

SELECT category, AVG(price) AS avg_price
FROM products
GROUP BY category
ORDER BY avg_price DESC;

Beachten Sie, dass die ORDER BY -Klausel an letzter Stelle steht, nach der GROUP BY -Klausel. Hier ist das Ergebnis:

categoryavg_price
costumes17.84
accessories6.65
hats4.62
masks3.62

Es ist gut zu wissen, dass ORDER BY die Zahlennotation akzeptiert, wenn es sich auf die Sortierspalte bezieht. Um zum Beispiel die Ergebnismenge nach der ersten Spalte zu sortieren, können Sie einfach ORDER BY 1 schreiben.

Dementsprechend würde die folgende Abfrage das gleiche Ergebnis wie in der obigen Tabelle liefern:

SELECT category, AVG(price) AS avg_price
FROM products
GROUP BY category
ORDER BY 2 DESC;

Da die Spalte avg_price die zweite in unserer Anweisung SELECT ist, können wir in der Klausel ORDER BY mit "2" darauf verweisen.

Dieser Ansatz spart uns Zeit bei der Eingabe, hat aber einen entscheidenden Nachteil. Wenn Sie die Abfrage ändern, indem Sie der Anweisung SELECT weitere Felder hinzufügen, sollten Sie daran denken, zu prüfen, ob die Zahl in der ORDER BY noch relevant ist oder geändert werden muss. Leider wird dieser Schritt häufig übersehen, was zu einer falschen Reihenfolge in der Ergebnismenge führt.

ORDER BY Multiple Columns

ORDER BY ermöglicht die Sortierung der Ergebnismenge nach zwei oder mehr Spalten. Um dieses Werkzeug richtig zu nutzen, müssen Sie jedoch verstehen, wie es funktioniert:

  • Die Sortierung beginnt mit der Sortierung der Daten auf der Grundlage der ersten in der ORDER BY genannten Spalte. Enthält diese Spalte dieselben Werte, werden die entsprechenden Zeilen auf der Grundlage der zweiten in der ORDER BY -Klausel aufgeführten Spalte sortiert, und so weiter. Die Reihenfolge der Spalten ist also wichtig.
  • Sie können die Reihenfolge (d. h. aufsteigend oder absteigend) für jede der in ORDER BY aufgeführten Spalten wählen. Um die Reihenfolge festzulegen, setzen Sie einfach das Schlüsselwort DESC oder ASC hinter jede der aufgeführten Spalten. Wenn Sie das Schlüsselwort DESC / ASC weglassen, wird standardmäßig in aufsteigender Reihenfolge sortiert.

Sehen wir uns einige Beispiele an.

Sortieren nach mehreren Spalten in SQL

Sie erinnern sich vielleicht daran, dass das Ergebnis der Sortierung nach Preis nicht eindeutig war, als wir unsere Produkte nach Preis sortierten. Insbesondere gab es mehrere Artikel mit demselben Preis, die eigentlich an derselben Position erscheinen sollten, aber tatsächlich zufällig angeordnet waren. Wenn wir in solchen Fällen mehr Kontrolle über die Sortierreihenfolge haben wollen, sollten wir eine weitere Spalte in die ORDER BY Klausel einfügen.

Zum Beispiel können wir die Artikel zunächst nach ihrem Preis sortieren (vom teuersten zum billigsten). Dann können wir die Artikel mit demselben Preis alphabetisch sortieren. Dies bedeutet, dass nach dem Preis in absteigender Reihenfolge und dann nach dem Namen in aufsteigender Reihenfolge sortiert wird. Hier ist die Abfrage:

SELECT id, name, price
FROM products
ORDER BY price DESC, name;
idnameprice
19Snow White23.95
11Wonder Woman19.95
15Superman14.95
23Ghostbuster13.95
16Hulk12.50
22Cowboy4.95
17Witch4.95
20Freddy Krueger3.95
12Vampire3.95
14Wizard of Oz3.95
24Sword3.50
25Zombie2.95
13Magic Wand2.50
21AlienNULL
18RapunzelNULL

Wir haben nur drei Spalten ausgewählt, damit wir uns besser auf die Sortierergebnisse konzentrieren können. Wie Sie sehen können:

  • Die Cowboy- und Hexenhüte haben denselben Preis und sind nun alphabetisch geordnet.
  • Eine weitere Gruppe von Artikeln zum Preis von 3,95 $ ist ebenfalls alphabetisch nach Namen geordnet.
  • Schließlich betrachtet SQL die NULL-Werte in der Preisspalte als denselben Wert, so dass diese Zeilen alphabetisch nach dem Namen des Artikels geordnet sind.

Sie können die Zahlennotation verwenden, wenn Sie mehrere Spalten in der ORDER BY Klausel auflisten; dies funktioniert auf die gleiche Weise. Die folgende Abfrage liefert die gleichen Ergebnisse wie die obige:

SELECT id, name, price
FROM items
ORDER BY 3 DESC, 2;

Sie sollten jedoch sehr vorsichtig mit der Zahlennotation sein, da die Bearbeitung der Abfrage die Spaltenreihenfolge - und damit die Sortierausgabe - ändern kann.

Sortieren nach mehreren berechneten Spalten

Lassen Sie uns unser letztes Sortierbeispiel noch etwas komplexer gestalten. In diesem Fall wollen wir die Produktkategorien nach der Gesamtzahl der vorrätigen Artikel sortieren, beginnend mit der Kategorie mit den wenigsten Artikeln. Wenn eine der Kategorien die gleiche Anzahl von Artikeln auf Lager hat, soll die Kategorie mit dem höchsten Produktpreis zuerst aufgeführt werden.

Mit anderen Worten, wir wollen die Ausgabe nach zwei Spalten sortieren, die beide mit Hilfe von Aggregatfunktionen berechnet werden. Außerdem:

  • Die Summe der Anzahl der Artikel in jeder Kategorie soll in aufsteigender Reihenfolge sortiert werden.
  • Der maximale Produktpreis in jeder Kategorie soll in absteigender Reihenfolge sortiert werden.

Hier ist die Abfrage und das Ergebnis:

SELECT 
  category, 
  SUM(quantity) AS total_quantity, 
  MAX(price) AS max_price
FROM items
GROUP BY category
ORDER BY total_quantity, max_price DESC;
categorytotal_quantitymax_price
costumes823.95
hats104.95
accessories1513.95
masks153.95

In dieser Abfrage berechnen wir die Gesamtzahl der Artikel (SUM(quantity)) und den maximalen Produktpreis (MAX(price)) für jede Kategorie (GROUP BY category). Außerdem ordnen wir die Aliasnamen zu (total_quantity bzw. max_price). Schließlich ordnen wir die Ausgabe nach total_quantity in aufsteigender Reihenfolge (ohne das Schlüsselwort ASC ) und nach max_price in absteigender Reihenfolge (unter Verwendung des Schlüsselworts DESC ).

Wie erwartet, ist die Tabelle nach der Gesamtzahl der Artikel in jeder Kategorie sortiert, beginnend mit Kostümen (die die wenigsten Artikel auf Lager haben). Beachten Sie jedoch, dass die Kategorien Zubehör und Masken beide 15 Artikel auf Lager haben. In diesem Fall kommt die Sortierung nach der zweiten Spalte ins Spiel und diese beiden Zeilen werden nach dem teuersten Produkt in der entsprechenden Kategorie geordnet. Die Kategorie Zubehör steht also an erster Stelle (da sie Ghostbusters enthält, das 13,95 $ kostet), während die Kategorie Masken an letzter Stelle steht (da die teuersten Masken nur 3,95 $ kosten).

Weitere fortgeschrittene Verwendungen von ORDER BY - wie das Einfügen von Ausdrücken in die Bedingung ORDER BY - finden Sie in diesem umfassenden Leitfaden.

Zeit zum Üben von SQL ORDER BY!

ORDER BY scheint recht einfach zu verstehen zu sein. Das Sortieren von Datensätzen in SQL hat jedoch viele Nuancen, die man am besten mit etwas Übung lernt. Ich empfehle, mit dem Kurs SQL für Anfänger Kurs zu beginnen; er deckt unter anderem alles ab, was Sie über das Sortieren von Zeilen in SQL wissen müssen. Der Kurs ist interaktiv und enthält 149 Programmieraufgaben, von ganz einfachen bis hin zu fortgeschrittenen Aufgaben.

Wenn Sie sich eine solide SQL-Grundlage aneignen wollen, sollten Sie den Kurs LearnSQL.de's SQL-Grundlagen Kurs. Er umfasst SQL für Anfänger und zwei weitere Kurse, die Standard-SQL-Funktionen, das Erstellen und Aktualisieren von Tabellen in SQL und vieles mehr behandeln.

Vielen Dank fürs Lesen und viel Spaß beim Lernen!