GROUP BY wird verwendet, um Zeilen zu gruppieren und Daten zu aggregieren, kann aber bei falscher Anwendung zu schwerwiegenden Fehlern oder suboptimaler Leistung führen.
Wichtige Feinheiten:
Beispiel:
SELECT customer_id, COUNT(*) as orders FROM orders WHERE order_date >= '2024-01-01' GROUP BY customer_id HAVING COUNT(*) > 10;
Kann man in SELECT nach GROUP BY auf Felder verweisen, die weder in GROUP BY noch in einer Aggregatfunktion angegeben sind?
Antwort: Nein, das führt in den meisten SQL-Implementierungen zu einem Fehler (z.B. in MS SQL, PostgreSQL). Einige spezifische DBs können ein zufälliges, falsches Ergebnis anzeigen (insbesondere in MySQL, wenn sql_mode 'ONLY_FULL_GROUP_BY' deaktiviert ist), aber dieses Verhalten ist inkorrekt und wird vom Standard nicht garantiert. Korrektes Beispiel:
SELECT department, AVG(salary) FROM employees GROUP BY department;
Geschichte
In einem E-Commerce-Projekt wurde der Bericht "Umsatz nach Produkten" mit der Abfrage SELECT sku, price, SUM(qty) FROM orders GROUP BY sku erstellt. Berücksichtigt wurde nicht: price war nicht im GROUP BY und war außerhalb der Aggregatfunktion, das Ergebnis — MySQL gab den ersten verfügbaren Preis zurück, was während der Aktion zu erheblichen Fehlern im Bericht führte. Lösung — entweder price in GROUP BY aufnehmen oder eine Aggregatfunktion verwenden.
Geschichte
In einem BI-Projekt benötigte ein komplexer Bericht mit mehreren JOIN und GROUP BY anstatt von geplanten 3 tatsächlich 80 Minuten. Nach Analyse stellte sich heraus: Es fehlten Indizes auf dem Feld aus GROUP BY und der Filterung, wodurch riesige temporäre Tabellen zur Aggregation erstellt wurden. Lösung — Indizes optimieren und die Abfrage mit tabellarischen Ausdrücken umschreiben.
Geschichte
Ein Entwickler verwendete HAVING zur Filterung von Werten anhand eines nicht aggregierten Attributs eines Benutzers. Infolgedessen verarbeitete der Server die Gruppierung auf allen Daten und entfernte sie dann mit HAVING, wodurch die Leistung gesenkt wurde. Korrektur — Diese Überprüfung in WHERE auslagern, um die Auswahl vor der Aggregation einzuschränken.