E051-02, „GROUP BY clause“


BigQueryDb2 (LUW)DuckDBH2MariaDBMySQLOracle DBPostgreSQLSQL ServerSQLite20162018202020222024✓ 3.21.0 - 3.51.0✓ 2017 - 2025✓ 10 - 18✓ 18c - 23.26.1✓ 8.0.11 - 9.6.0✓ 10.3 - 12.2.2⚡ 1.4.192 - 2.4.240a✓ 1.0.0 - 1.4.0✓ 11.1 - 12.1.3⚡ 2.0a✓ 2.0
  1. ⚡Inkompatibler Zugriff auf Select-Namen möglich

Erweiterungen

Die Group By-Klause hat zahlreiche, weit verbreitete Erweiterungen. Zu aller erst ist zu erwähnen, dass der SQL-Standard in der Group By-Klausel nur Spaltennamen, aber keine allgemeinen Ausdrücke zulässt. Dennoch unterstützen alle getesteten Systeme diese Möglichkeit ①. In diesem Zusammenhang ist es sehr praktisch, wenn man in der Group By-Klausel auch Spaltennamen verwenden kann, die erst in der Select-Klausel eingeführt werden ②. Auch diese Möglichkeit ist weit verbreitet, geht jedoch mit einer Gefahr einher:

SELECT b AS a
  FROM (VALUES (1, 1), (1, 2)) t(a,b)
 GROUP BY a

Da die in der Select-Klausel definiert Spalte „a“ in der Group By-Klausel grundsätzlich nicht sichtbar ist, erfolgt die Gruppierung hier eindeutig nach der ersten Spalte der Tabelle „t“ sodass nur eine Gruppe entsteht. Manche Systeme geben dem in der Select-Klausel definierten Ausdruck Vorrang, was zu einem inkompatiblen Ergebnis mit zwei Gruppen führt.

Eine Möglichkeit ohne potentielle Mehrdeutigkeiten auf Select-Einträge zu verweisen ist die Verwendung von Spaltennummern, beginnend mit 1 ③. Damit geht man natürlich das Risiko ein, dass eine spätere Änderung der Select-Klausel die Bedeutung der Abfrage ändert. Je größer die Abfrage, genauer gesagt je weiter die Select und die Group By-Klauseln getrennt sind, desto größer das Risiko. Dasselbe Risiko geht man auch mit der Group By All-Variante ④ einher, die aller Voraussicht im nächsten SQL-Standard enthalten sei wird.

BigQuery 2026-02-12abDb2 (LUW) 12.1.3DuckDB 1.4.0cH2 2.4.240bMariaDB 12.2.2MySQL 9.6.0aOracle DB 23.26.1dPostgreSQL 18SQL Server 2025SQLite 3.51.0Ausdrücke in Group BySelect-Namen in Group By ②Group By <unsigned integer> ③Group By All
  1. Nur, wenn der komplette Select-Eintrag dem Group By-Element gleicht. Also z. B. nicht:
    SELECT a + b FROM ... GROUP BY a, b
  2. Select-Klausel Namen haben bei Mehrdeutigkeiten Vorrang
  3. Kann Aggregate und Nicht-Aggregate nicht mischen: a + count(*)
  4. Entfernt die Group By All-Klausel manchmal, wenn sie zu einem Fehler führt, der ohne Group By nicht auftritt
Standard-Funktionen
Nicht-Standard-Funktionen

Normative Referenzen

E051-02, „GROUP BY clause“ ist eine verpflichtende Funktion in ISO/IEC 9075-2:2023. Die Funktionalität war bereits in ANSI X3.135-1989 verpflichtend.

20 Jahre SQL-Evolution kann man nicht an einem Tag nachholen. Abonniere den Newsletter via E-Mail, Bluesky oder RSS, um sukzessive aufzuholen und modern-sql.com am Radar zu behalten.

Über den Autor

Foto von Markus Winand

Markus Winand gibt auf modern-sql.com Einblick in SQL und zeigt, wie es von verschiedenen Systemen unterstützt wird. Zuvor machte er use-the-index-luke.com, was er noch immer wartet. Markus kann als Trainer, Sprecher und Berater auf winand.at engagiert werden.

Sein Buch kaufen

Titelbild von „SQL Performance Explained“: Eichhörnchen läuft durchs Grass

Die Essenz: SQL-Tuning auf 200 Seiten

Jetzt Kaufen
(Taschenbuch und/oder PDF)

Sein Training

Markus verwandelt veraltetes SQL-92-Wissen in solides und zeitgemäßes SQL-Know-how

Erfahren Sie mehr»

Neuigkeiten Abonnieren

Markus Winands MailinglistenMarkus Winands RSS-FeedMarkus Winand auf LinkedInMarkus Winand auf XINGMarkus Winand auf MastodonMarkus Winand auf Bluesky
Copyright 2015-2026 Markus Winand. Alle Rechte vorbehalten.
Impressum | Kontakt | KEINE GEWÄHR | Handelsmarken | Datenschutz und DSGVO