Zurück zur Artikelliste Artikel
11 Leseminuten

Wie man GROUP BY und ORDER BY in derselben Abfrage verwendet: Eine detaillierte Anleitung

Wir zeigen Ihnen, wie Sie zwei grundlegende SQL-Klauseln - GROUP BY und ORDER BY - in einer Abfrage verwenden können.

GROUP BY und ORDER BY sind grundlegende SQL-Klauseln. Als solche werden sie relativ früh im Lernprozess gelehrt. Und sie stellen normalerweise keine große Hürde für Anfänger dar. Die gleichzeitige Verwendung von GROUP BY und ORDER BY kann jedoch verwirrend sein. Am Ende dieses Artikels wird Ihre Verwirrung zu diesem Thema verschwunden sein.

Wenn Sie die Verwendung von GROUP BY mit ORDER BY praktisch üben möchten, hilft Ihnen unser interaktiver SQL für Anfänger Kurs helfen. Wie der Name schon sagt, behandelt er die SQL-Grundlagen. Das macht es einfacher, den Themen zu folgen, die wir in diesem Artikel vorstellen werden.

Der Kurs selbst enthält 129 Übungen zum Üben der grundlegenden SQL-Konzepte. Zu diesen Konzepten gehören das Ziehen von Daten aus einer oder mehreren Tabellen (JOINs) und das Filtern von Daten mithilfe von WHERE und Operatoren wie LIKE, ILIKE, IN und BETWEEN. Natürlich gibt es auch GROUP BY und die Mengenoperationen UNION, INTERSECT und EXCEPT.

Was sind GROUP BY und ORDER BY in SQL?

GROUP BY und ORDER BY sind nicht dass elbe - das ist offensichtlich!

Die SQL-Klausel GROUP BY gruppiert Datenzeilen mit denselben Werten in den angegebenen Spalten. Diese Klausel wird am häufigsten mit SQL-Aggregatfunktionen verwendet, um Statistiken (wie z. B. die Anzahl bestimmter Werte, die Summe, den Durchschnitt und den Mindest-/Maximalwert in einer Menge) für eine Gruppe von Zeilen zu berechnen. Hier ist ein einfaches Beispiel:

SELECT 
  country,
  COUNT(*)
FROM box_office
GROUP BY country;

Die Abfrage fordert die Datenbank auf, die Daten nach den Werten in der Spalte country zu gruppieren. Dann zeigt sie den Ländernamen an und zählt die Zeilen. So erfahren wir, wie viele Datensätze aus der Tabelle zu jedem Land gehören.

Lassen Sie uns nun über ORDER BY sprechen. Dieser Befehl sortiert die Abfrageausgabe in aufsteigender (1 bis 10, A bis Z) oder absteigender (10 bis 1, Z bis A) Reihenfolge. Die aufsteigende Sortierung ist die Standardeinstellung; wenn Sie das Schlüsselwort ASCending oder DESCending weglassen, wird die Abfrage in aufsteigender Reihenfolge sortiert. Sie können die Sortierreihenfolge mit ASC oder DESC angeben. Hier ist ein einfaches Beispiel:

SELECT 
  movie,
  city,
  gross
FROM box_office
ORDER BY gross;

Diese Abfrage wählt den Filmnamen, die Stadt, in der der Film gezeigt wird, und die Bruttoeinnahmen aus. Dann wird die Ausgabe mit Hilfe der ORDER BY Klausel nach den Bruttoeinnahmen sortiert.

Das ist Ihnen wahrscheinlich bekannt. Sehen wir uns nun an, wie diese SQL-Klauseln zusammen verwendet werden können. Es könnte hilfreich sein, diesen Artikel über die Funktionsweise von GROUP BY oder den Leitfaden zu ORDER BY zur Hand zu haben, nur für den Fall, dass Sie eine Klarstellung zu etwas benötigen, das wir in diesem Artikel erwähnen.

Beispielhafte Daten

Wir verwenden eine Tabelle namens box_office in den folgenden Beispielen. Sie können sie mit dieser Abfrage erstellen.

idmoviecitycountrygross
1Beau Is AfraidAmsterdamNetherlands483,754.22
2The French DispatchValenciaSpain385,741.59
3Beau Is AfraidValenciaSpain40,874.59
4The French DispatchMadridSpain845,125.98
5Beau Is AfraidRotterdamNetherlands352,147.77
6The French DispatchDen HaagNetherlands100,524.14
7Beau Is AfraidMadridSpain147,874.56
8The French DispatchBarcelonaSpain354,789.52
9Beau Is AfraidDen HaagNetherlands208,471.52
10The French DispatchAmsterdamNetherlands408,974.56
11Beau Is AfraidBarcelonaSpain205,487.23
12The French DispatchRotterdamNetherlands236,974.54

Es handelt sich um eine Übersicht über die Einspielergebnisse von zwei Filmen: "Beau Is Afraid" und "The French Dispatch".

Die Daten zeigen die Einnahmen (in US-Dollar) von Kinos in zwei Ländern - Spanien und den Niederlanden - und ihren jeweiligen Städten: Amsterdam, Rotterdam, Den Haag, Barcelona, Madrid und Valencia.

GROUP BY und ORDER BY einer unaggregierten Spalte in SELECT

Beginnen wir mit dem einfachsten Beispiel für die Verwendung von GROUP BY und ORDER BY in einer Abfrage. Wir möchten die Liste der Filme in alphabetischer Reihenfolge anzeigen.

Hier sehen Sie, wie Sie nach einer Spalte gruppieren und das Ergebnis nach einer Spalte ordnen:

SELECT movie
FROM box_office
GROUP BY movie
ORDER BY movie ASC; 

Die Abfrage wählt den Filmnamen aus der Tabelle box_office. Dann müssen wir GROUP BY verwenden. Andernfalls würde die Ausgabe alle zwölf Zeilen der Tabelle enthalten, die die sich wiederholenden Namen der beiden gleichen Filme aus der Tabelle box_office. Wir wollen, dass jeder Film nur einmal erscheint, denn das ist der Sinn der Liste. Die Gruppierung der Daten erfolgt einfach durch Angabe der Spalte, nach der gruppiert werden soll, in der Klausel GROUP BY.

Die Ausgabe wird mit der Klausel ORDER BY geordnet. Wie bei GROUP BY geben wir den Spaltennamen in der Klausel an. Wir möchten, dass die Ausgabe alphabetisch sortiert wird, also folgt auf den Spaltennamen das ASC.

Anhand dieses Bildes der Ausführungsreihenfolge der SQL-Abfrage können wir sehen, wie die Datenbank zum Ergebnis kommt.

GROUP BY und ORDER BY in ein und derselben Abfrage

Die Abfrage ruft zunächst die Tabelle in der FROM -Klausel ab. Dann gruppiert sie die Daten entsprechend der angegebenen Spalte in GROUP BY. Danach wählt sie die Spalte in der Anweisung SELECT aus. Und erst danach wird die Ausgabe nach der ORDER BY -Klausel sortiert.

Mit anderen Worten: Die Daten werden erst gruppiert und dann sortiert. Dies führt uns zu einem wichtigen Hinweis: Wenn Sie sowohl GROUP BY als auch ORDER BY in einer Abfrage verwenden, muss GROUP BY immer und ohne Ausnahme vor ORDER BY stehen !

Werfen wir einen Blick auf die Ausgabe der Abfrage.

movie
Beau Is Afraid
The French Dispatch

Wie Sie sehen können, handelt es sich um eine Liste, die unsere beiden Filme in alphabetischer Reihenfolge enthält.

GROUP BY und ORDER BY einer Aggregatspalte in SELECT

Sie können GROUP BY zusammen mit ORDER BY verwenden, um nach einer Aggregatfunktion zu ordnen, die in SELECT angezeigt wird. Hier ist ein Beispiel:

SELECT 
  movie,
  SUM(gross) AS gross_per_movie
FROM box_office
GROUP BY movie
ORDER BY gross_per_movie DESC;

Die Abfrage wählt einen Film aus der Tabelle aus. Dann verwenden wir die Aggregatfunktion SUM(), um die Bruttoeinnahmen des Films zu summieren. Da wir die Bruttoeinnahmen pro Film anzeigen wollen, müssen wir die Ausgabe nach Filmnamen gruppieren. Als letzten Schritt wollen wir die Ausgabe von den höchsten bis zu den niedrigsten Einnahmen sortieren. Dies können wir erreichen, indem wir die aggregierte Spalte in ORDER BY auflisten. Es muss das Schlüsselwort DESC folgen, um vom höchsten zum niedrigsten Ergebnis zu sortieren.

Beachten Sie, dass wir den Alias gross_per_movie für die aggregierte Spalte in ORDER BY verwenden. Wir hätten auch den vollständigen Aggregatausdruck verwenden können:

SELECT 
  movie,
  SUM(gross) AS gross_per_movie
FROM box_office
GROUP BY movie
ORDER BY SUM(gross) DESC;

So sieht die Ausgabe aus:

moviegross_per_movie
The French Dispatch2,332,130.33
Beau Is Afraid1,438,609.89

Es werden zwei Filme und ihre Einnahmen in absteigender Reihenfolge angezeigt.

GROUP BY und ORDER BY einer unaggregierten Spalte nicht in SELECT

Im ersten Beispiel haben wir die Ausgabe nach der Spalte in SELECT geordnet. Versuchen wir nun, die Daten nach einer Spalte zu ordnen, die nicht in SELECT enthalten ist:

SELECT SUM(gross) AS gross_by_city
FROM box_office
GROUP BY city
ORDER BY city ASC;

In dieser Abfrage verwenden wir die Funktion SUM(), um den Bruttoverdienst nach Stadt zu berechnen. Es gibt jedoch keine Spalte "Stadt" in SELECT. Das liegt daran, dass wir nur die Bruttowerte sehen wollen. Wir gruppieren die Ausgabe trotzdem nach der Stadt, so wie wir es tun würden, wenn diese Spalte in SELECT enthalten wäre. Schließlich ordnen wir die Ausgabe alphabetisch nach der Stadt.

Die Ausgabe ist unten dargestellt:

gross_by_city
892,728.78
560,276.75
308,995.66
993,000.54
589,122.31
426,616.18

Wie Sie sehen können, funktioniert die Abfrage. Zur Erinnerung: Sie können die Ausgabe nach einer nicht aggregierten Spalte ordnen, die nicht in SELECT aufgeführt ist - aber nur, wenn diese Spalte in GROUP BY aufgeführt ist.

Das bedeutet, dass die Daten auch nach einer Spalte gruppiert werden können, die nicht in SELECT. Kann die Spalte in SELECT aufgeführt sein, aber nicht in GROUP BY? Nein! Denken Sie an diese Regel: Wenn die nicht gruppierte Spalte in SELECTerscheint, muss sie auch in GROUP BY.

GROUP BY und ORDER BY einer aggregierten Spalte nicht in SELECT

Lassen Sie uns das obige Beispiel ein wenig abändern und versuchen, die Daten nach einer aggregierten Spalte zu ordnen, die nicht in SELECT aufgeführt ist.

Hier ist der Code. Es wird versucht, eine Liste von Städten, geordnet nach Bruttoverdienst, anzuzeigen:

SELECT city
FROM box_office
GROUP BY city
ORDER BY SUM(gross);

Wir wählen die Spalte city aus und gruppieren die Ausgabe nach dieser Spalte.

Dann verwenden wir SUM() in ORDER BY, so dass wir die Ausgabe nach dem Verdienst pro Stadt sortieren können. Wir sortieren sie aufsteigend.

Schauen wir mal, ob die Abfrage funktioniert:

city
Den Haag
Valencia
Barcelona
Rotterdam
Amsterdam
Madrid

Ja, das tut sie! Hier noch ein Hinweis: Sie können die Ausgabe nach einer aggregierten Spalte sortieren, die nicht in der SELECT.

GROUP BY und ORDER BY Mehrere Spalten

Bis jetzt haben wir die Daten nur nach einer Spalte gruppiert. Sehen wir uns nun an, wie Sie Daten nach mehr als einer Spalte gruppieren können.

Zeigen wir jede Stadt und ihr Land:

SELECT 
  city,
  country,
  AVG(gross) AS average_gross
FROM box_office
GROUP BY city, country
ORDER BY city;

Wir wählen die Stadt und das Land aus. Danach verwenden wir AVG(), um den durchschnittlichen Bruttoverdienst nach Stadt zu berechnen. Dann listen wir die gleichen Spalten in GROUP BY auf. Wie Sie gelernt haben, muss jede Spalte, die in SELECT erscheint, auch in GROUP BY erscheinen. Wenn wir mehrere Spalten in GROUP BY auflisten, trennen wir sie einfach durch ein Komma.

Schließlich sortieren wir die Ausgabe nach Städten in aufsteigender Reihenfolge:

citycountryaverage_gross
AmsterdamNetherlands446,364.39
BarcelonaSpain280,138.38
Den HaagNetherlands154,497.83
MadridSpain496,500.27
RotterdamNetherlands294,561.16
ValenciaSpain213,308.09

Das wirft die Frage auf: Wenn Sie GROUP BY mehrere Spalten auflisten können, können Sie dann auch ORDER BY mehr als eine Spalte auflisten?

Versuchen wir es:

SELECT city,
	 country,
	 AVG(gross) AS average_gross
FROM box_office
GROUP BY city, country
ORDER BY country, city;

Das Prinzip ist dasselbe wie bei GROUP BY: Man listet einfach die Spalten in ORDER BY auf und trennt sie durch ein Komma.

Das ist das Ergebnis der Abfrage:

citycountryaverage_gross
AmsterdamNetherlands446,364.39
Den HaagNetherlands154,497.83
RotterdamNetherlands294,561.16
BarcelonaSpain280,138.38
MadridSpain496,500.27
ValenciaSpain213,308.09

Ja, die Ausgabe ist wirklich nach dem Land und dann nach jeder Stadt innerhalb des Landes geordnet.

Aggregierte Spalte sowohl in GROUP BY als auch in ORDER BY

Wir haben alle Kombinationen ausprobiert, aber wir haben nicht versucht, GROUP BY und ORDER BY mehrere Spalten, von denen eine aggregiert ist, zu kombinieren. Lassen Sie uns das versuchen:

SELECT 
  city,
  AVG(gross) AS average_gross_by_city
FROM box_office
GROUP BY city, AVG(gross)
ORDER BY city, AVG(gross);

Diese Abfrage soll den durchschnittlichen Bruttoverdienst nach Stadt anzeigen. Wir listen die Stadt in SELECT auf und verwenden die Funktion AVG(). Dann gruppieren wir nach Stadt und der aggregierten Spalte. Schließlich wird die Ausgabe nach der gleichen Spalte sortiert.

Die einzige Ausgabe, die wir erhalten, ist jedoch dieser Fehler.

GROUP BY und ORDER BY in ein und derselben Abfrage

Die Fehlermeldung bedeutet wörtlich, was sie sagt: Aggregatfunktionen sind in GROUP BY nicht erlaubt. Welchen Sinn hätte es überhaupt, sie in GROUP BY zu verwenden? Die Aggregatfunktion fasst die Daten zu einer Zeile zusammen, und GROUP BY kann damit nichts mehr anfangen.

Verwendung von GROUP BY mit HAVING und ORDER BY

GROUP BY und ORDER BY sind nicht die einzigen Klauseln, die in einer Abfrage verwendet werden können - wir können auch HAVING hinzufügen.

Schauen wir uns den folgenden Code an, um zu sehen, wie das funktioniert.

SELECT 
  city,
  SUM(gross) AS gross_per_city
FROM box_office
GROUP BY city
HAVING SUM(gross) > 800000
ORDER BY SUM(gross) > 800000 DESC;

Diese Abfrage sollte:

  • Städte mit einem Bruttoverdienst von mehr als 800.000 $ zurückgeben.
  • Den von dieser Stadt verdienten Betrag anzeigen.
  • Die Ausgabe nach Bruttoverdienst in absteigender Reihenfolge ordnen.

Dazu wählen wir die Spalte Stadt aus und verwenden die Funktion SUM(). Dann gruppieren wir die Ausgabe nach Stadt. Danach verwenden wir die Klausel HAVING, um nur die Städte mit einem Verdienst von über 800.000 $ anzuzeigen. Wir verwenden einfach die Aggregatspalte von SELECT und setzen sie mit dem Vergleichsoperator ">" gegen die Bedingung. Dann verwenden wir dasselbe in ORDER BY, um die Ausgabe absteigend zu sortieren.

Die Regel lautet hier: Die HAVING Klausel wird immer nach GROUP BY aber vor ORDER BY.

Um dies zu überprüfen, können Sie sich die Abbildung der Ausführungsreihenfolge der SQL-Abfrage noch einmal ansehen. Sie werden sehen, dass HAVING nach GROUP BY, aber vor ORDER BY ausgeführt wird. Mit anderen Worten: Die Daten werden zuerst gruppiert, dann gefiltert und schließlich geordnet.

Hier ist das Ergebnis der Abfrage:

citygross_per_city
Amsterdam892,728.78
Madrid993,000.54

Sie sehen, dass es nur zwei Städte gibt, in denen unsere beiden Filme mehr als 800.000 Dollar einspielten: Amsterdam und Madrid.

Üben Sie die Verwendung von GROUP BY mit ORDER BY

Dieser Artikel hat Ihnen gezeigt, dass GROUP BY und ORDER BY in ein und derselben SQL-Abfrage verwendet werden können. Und nicht nur das, sondern sie können auch auf verschiedene Arten verwendet werden.

Nebenbei haben wir einige wichtige Regeln gelernt:

  1. GROUP BY kommt vor ORDER BY.
  2. Die Ausgabe kann nur dann nach einer nicht aggregierten Spalte geordnet werden, die nicht in SELECT aufgeführt ist, wenn die Spalte in GROUP BY erscheint.
  3. Die Daten können nach einer nicht aggregierten Spalte gruppiert werden, die nicht in SELECT aufgeführt ist.
  4. Jede nicht aggregierte Spalte , die in SELECT erscheint, muss in GROUP BYaufgeführt sein.
  5. Die Ausgabe kann nach einer aggregierten Spalte geordnet werden , die nicht in SELECTaufgeführt ist.
  6. Eine aggregierte Spalte ist in GROUP BYnicht erlaubt.
  7. HAVING kommt nach GROUP BY, aber vor ORDER BY.

Obwohl wir diese Regeln erklärt haben und Sie das Gefühl haben, etwas gelernt zu haben, reicht das nicht aus.

Um dieses Wissen zu behalten, müssen Sie die Verwendung von GROUP BY und ORDER BY üben - besonders am Anfang Ihrer SQL-Reise. Übung in SQL bedeutet, viel Code zu schreiben. Nur so können Sie Ihr Wissen festigen. Unser interaktiver SQL für Anfänger Kurs bietet 129 praktische SQL-Übungen; das ist eine Menge Platz zum Üben!