0Pricing
Coding Interview Prep · Lektion

Die GROUP-BY-Regel für SELECT-Spalten

Warum jede nicht aggregierte Spalte in GROUP BY erscheinen muss und was der Modus only_full_group_by bewirkt

Die GROUP-BY-Regel für SELECT-Spalten ist eine kostenlose Coding Interview Prep-Lektion auf CoddyKit. Dies ist Lektion 1 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Coding Interview Prep-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Coding Interview Prep-Kurs umfasst insgesamt 4 Lektionen.

Warum Interviewer mit GROUP BY beginnen

Bei GROUP BY unterscheiden sich Anfänger von Entwicklern auf mittlerem Niveau. Die wichtigste Regel, die sie testen, lautet: Jede Spalte in Ihrer SELECT-Liste muss entweder innerhalb einer Aggregatfunktion stehen oder in GROUP BY aufgeführt sein.

Wenn Sie diese Regel brechen, kann die Datenbank nicht entscheiden, welchen Wert sie für eine Gruppe mit mehreren Zeilen anzeigen soll. Interviewer bauen genau diesen Fehler ein, um zu prüfen, ob Sie wirklich verstehen, was eine Gruppe ist.

Was eine Gruppe tatsächlich ist

GROUP BY fasst viele Zeilen zu einer Zeile pro unterschiedlichem Schlüssel zusammen. Nach der Gruppierung verfügt die Datenbank nicht mehr über die einzelnen Zeilen. Sie hat nur noch eine zusammenfassende Zeile pro Gruppe.

  • Spalten, nach denen Sie gruppiert haben, haben pro Gruppe genau einen eindeutigen Wert.
  • Aggregate wie COUNT, SUM und AVG reduzieren die vielen Werte auf einen einzigen.
  • Jede andere unveränderte Spalte ist mehrdeutig: Welcher der vielen Werte soll angezeigt werden?
SELECT department, COUNT(*) AS headcount
FROM employees
GROUP BY department;

Der klassische Fehler

Hier ist der Fehler, den Interviewer besonders gerne sehen. Sie gruppieren nach department, wählen aber zusätzlich name aus – eine nicht aggregierte Spalte, die nicht in GROUP BY enthalten ist.

Jede Abteilung hat viele Mitarbeiter und damit viele Namen pro Gruppe. Die Datenbank kann keinen davon auswählen, daher weist standardkonformes SQL die Abfrage zurück.

-- ERROR: name is not in GROUP BY and not aggregated
SELECT department, name, COUNT(*)
FROM employees
GROUP BY department;

Zwei Möglichkeiten zur Behebung

Es gibt zwei zulässige Lösungen, und der Interviewer möchte hören, dass Sie wissen, dass beide unterschiedliche Ergebnisse liefern:

  • Fügen Sie die Spalte zu GROUP BY hinzu, wenn Sie tatsächlich eine feinere Gruppierung wünschen (eine Zeile pro Abteilung und Name).
  • Verpacken Sie sie in ein Aggregat wie MAX(name) oder COUNT(name), wenn Sie pro bestehender Gruppe einen Wert erhalten möchten.
-- Finer grouping
SELECT department, name, COUNT(*) AS rows_for_person
FROM employees
GROUP BY department, name;

ONLY_FULL_GROUP_BY in MySQL

Eine beliebte Falle: Ältere MySQL-Versionen erlaubten die Auswahl nicht gruppierter Spalten und gaben stillschweigend einen beliebigen Wert aus der Gruppe zurück. Dadurch entstanden falsche Berichte, die auf den ersten Blick korrekt aussahen.

Moderne MySQL-Versionen aktivieren ONLY_FULL_GROUP_BY standardmäßig und setzen damit die Standardregel durch. PostgreSQL, SQL Server und Oracle haben sie schon immer durchgesetzt. Wenn Sie gefragt werden, warum eine Abfrage „auf dem alten Server funktioniert hat, jetzt aber fehlschlägt“, lautet die Antwort: ONLY_FULL_GROUP_BY.

-- Legal under ONLY_FULL_GROUP_BY because every
-- selected column is grouped or aggregated
SELECT department, MAX(hire_date) AS latest_hire
FROM employees
GROUP BY department;

Ausnahme aufgrund funktionaler Abhängigkeit

Es gibt eine Feinheit, mit der Interviewer Ihr Verständnis auf die Probe stellen. Wenn Sie nach dem Primärschlüssel einer Tabelle gruppieren, ist jede andere Spalte dieser Tabelle funktional abhängig vom Schlüssel und hat daher pro Gruppe genau einen Wert.

PostgreSQL und moderne MySQL-Versionen erlauben die Auswahl dieser abhängigen Spalten, ohne sie aufzulisten. Der Gruppierungsschlüssel bestimmt sie eindeutig, daher besteht keine Mehrdeutigkeit.

-- Legal: id is the PK, so name is determined by it
SELECT e.id, e.name, COUNT(o.id) AS orders
FROM employees e
LEFT JOIN orders o ON o.employee_id = e.id
GROUP BY e.id;

Beispiel: Verkäufe nach Region

Angenommen, Sie müssen den Gesamtumsatz pro Region ausgeben. Der Gruppierungsschlüssel ist region; die Kennzahl ist SUM(amount). Alles andere muss aggregiert oder weggelassen werden.

Beachten Sie, wie übersichtlich das ist: eine Zeile pro Region, die jeweils einen einzigen summierten Wert enthält. So sieht jeder aggregierte Bericht aus.

SELECT region,
       SUM(amount)   AS total_sales,
       COUNT(*)      AS num_orders,
       AVG(amount)   AS avg_order
FROM sales
GROUP BY region;

Details und Zusammenfassung kombinieren

Eine trickreiche Aufgabe: „Zeigen Sie den Betrag jeder Bestellung zusammen mit dem Gesamtbetrag ihrer Region.“ Mit einfachem GROUP BY können Sie das nicht erledigen, weil die Gruppierung die einzelnen Zeilen auflöst.

Die richtige Antwort ist eine Window-Funktion (SUM(amount) OVER (PARTITION BY region)) oder ein Rückverknüpfen mit einer gruppierten Unterabfrage. Der Sinn der Frage ist, zu erkennen, dass GROUP BY hier das falsche Werkzeug ist.

-- Detail rows kept, region total added per row
SELECT order_id, region, amount,
       SUM(amount) OVER (PARTITION BY region) AS region_total
FROM sales;

GROUP BY und SELECT-Aliase

Können Sie in GROUP BY einen in SELECT definierten Alias verwenden? Das hängt vom SQL-Dialekt ab, und genau diese Uneinheitlichkeit prüfen Interviewer gerne.

  • MySQL und PostgreSQL: erlauben die Gruppierung nach einem SELECT-Alias.
  • SQL Server und Oracle: erlauben dies nicht; Sie müssen den vollständigen Ausdruck wiederholen.

Die portable Lösung besteht darin, den Ausdruck in GROUP BY zu wiederholen; das funktioniert überall.

-- Portable: repeat the expression rather than the alias
SELECT EXTRACT(YEAR FROM order_date) AS yr, COUNT(*)
FROM sales
GROUP BY EXTRACT(YEAR FROM order_date);

DISTINCT oder GROUP BY für Eindeutigkeit

Wenn Sie nur eindeutige Kombinationen und kein Aggregat benötigen, verhält sich GROUP BY ohne Aggregat wie DISTINCT. Interviewer fragen möglicherweise, welche Variante verständlicher ist.

Verwenden Sie DISTINCT, um Ihre Absicht auszudrücken („Ich möchte eindeutige Zeilen“). Verwenden Sie GROUP BY nur dann, wenn Sie zusätzlich Aggregate berechnen. Das Ergebnis ist gleich, aber die Lesbarkeit vermittelt eine andere Absicht.

-- These return the same rows
SELECT DISTINCT department, role FROM employees;
SELECT department, role FROM employees GROUP BY department, role;

So formulieren Sie es im Vorstellungsgespräch

Wenn Sie mit einer GROUP-BY-Frage konfrontiert werden, sprechen Sie die Regel laut aus: „Jede ausgewählte Spalte ist entweder ein Gruppierungsschlüssel oder in ein Aggregat eingeschlossen, weil die Gruppierung eine Zeile pro Schlüssel hinterlässt.“

Nennen Sie anschließend Ihren Gruppierungsschlüssel und Ihre Kennzahlen und bestätigen Sie, dass keine Spalte ohne Gruppierung durchrutscht. Diese strukturierte Antwort signalisiert Kompetenz auf mittlerem Niveau, noch bevor Sie die Abfrage schreiben.

Kurzer Test

Testen Sie Ihr Verständnis der zentralen GROUP-BY-Regel.

Zusammenfassung

Die Regel: Jede SELECT-Spalte ist ein Gruppierungsschlüssel oder ein Aggregat. Warum: GROUP BY lässt eine Zeile pro Schlüssel übrig, daher sind nicht gruppierte Rohspalten mehrdeutig.

  • Beheben Sie Verstöße, indem Sie die Spalte gruppieren oder aggregieren.
  • Das frühere Verhalten von MySQL gab beliebige Werte zurück; ONLY_FULL_GROUP_BY setzt den Standard durch.
  • Die funktionale Abhängigkeit vom Primärschlüssel ist die einzige gesetzlich zulässige Ausnahme.
  • Wenn Sie Detailzeilen neben Gruppensummen beibehalten möchten, verwenden Sie Fensterfunktionen statt GROUP BY.

Häufig gestellte Fragen

Ist die Lektion „Die GROUP-BY-Regel für SELECT-Spalten“ kostenlos?

Ja — der vollständige Text von „Die GROUP-BY-Regel für SELECT-Spalten“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Coding Interview Prep-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Coding Interview Prep-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Die GROUP-BY-Regel für SELECT-Spalten“?

Warum jede nicht aggregierte Spalte in GROUP BY erscheinen muss und was der Modus only_full_group_by bewirkt Du übst Coding Interview Prep mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um Coding Interview Prep zu starten?

Keine Vorkenntnisse erforderlich. Coding Interview Prep auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 1 von 4.

Wie lange dauert die Lektion „Die GROUP-BY-Regel für SELECT-Spalten“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser Coding Interview Prep-Lektion Code schreiben und ausführen?

Ja. Jede Coding Interview Prep-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Die GROUP-BY-Regel für SELECT-Spalten
  2. HAVING oder WHERE
  3. Nach mehreren Spalten und Ausdrücken gruppieren
  4. Gruppen zählen und filtern
← Zurück zu Coding Interview Prep