Dies ist eine alte Version des Dokuments!


Warum GROUP BY? Ohne GROUP BY erhalten Sie eine einzige Aggregatkennzahl über alle Zeilen. Mit GROUP BY erhalten Sie eine Zeile pro Gruppe (z. B. pro Jahr, pro Firma, pro Gemeinde).

1. Regeln bei Abfragen mit Aggregatfunktionen

  • In SELECT dürfen neben Aggregaten nur Spalten stehen, die auch im GROUP BY vorkommen.
  • WHERE filtert Zeilen vor dem Gruppieren; HAVING filtert Gruppen nach dem Gruppieren.

2. Beispiel: Wie viele Missionen pro Firma (Top 10)?

SELECT company, COUNT(*) AS starts
FROM missions
GROUP BY company
ORDER BY starts DESC
LIMIT 10;

Was passiert? Wir zählen pro Firma und sortieren absteigend; LIMIT begrenzt die Ausgabe. Firmen und Starts – Infos zu den Firmen-Kürzel gibts ganz am Schluss dieser Seite.

3. Beispiel: Total Einbrüche pro Jahr (Kanton ZH)

SELECT ausgangsjahr, SUM(straftaten_total) AS total_faelle
FROM einbrueche
GROUP BY ausgangsjahr
ORDER BY ausgangsjahr DESC
LIMIT 5;

Was passiert? SUM(…) aggregiert pro Jahr (GROUP BY ausgangsjahr); ORDER BY … DESC sortiert chronologisch absteigend. LIMIT 5 → max 5 Ergebnisse. Während den COVID-19-Jahren ging die Zahl der Einbrüche im Kanton Zürich zurück – jetzt steigt sie wieder an.

3.4 Beispiel: Total pro Jahr **und** Tatbestand

SELECT ausgangsjahr,
       tatbestand,
       SUM(straftaten_total) AS total_faelle
FROM zh_einbrueche.einbrueche
GROUP BY ausgangsjahr, tatbestand
ORDER BY ausgangsjahr, tatbestand;

Was passiert? Mehrspaltiges GROUP BY → Kennzahlen pro (Jahr × Tatbestand).

Typischer Fehler:

SELECT gemeindename, SUM(straftaten_total)
FROM zh_einbrueche.einbrueche;  -- ❌ fehlendes GROUP BY → Fehler/Zufallswerte

Immer alle nicht aggregierten Spalten ins GROUP BY aufnehmen.


4.1 Warum HAVING?

WHERE kann keine Aggregatfunktionen enthalten. Wenn Sie Gruppen nach einer Kennzahl (z. B. SUM(…), COUNT(…)) filtern möchten → HAVING.

4.2 Beispiel: Firmen mit **mehr als 100** Missionen (Top 5)

SELECT company,
       COUNT(*) AS starts
FROM spacemission.missions
GROUP BY company
HAVING COUNT(*) > 100
ORDER BY starts DESC
LIMIT 5;

Was passiert? Erst gruppieren, dann Gruppen mit COUNT > 100 behalten.

4.3 Beispiel: Jahre mit über **25'000** Einbruch-Fällen (ZH)

SELECT ausgangsjahr,
       SUM(straftaten_total) AS total_faelle
FROM zh_einbrueche.einbrueche
GROUP BY ausgangsjahr
HAVING SUM(straftaten_total) > 25000
ORDER BY total_faelle DESC;

Was passiert? HAVING filtert nur jene Jahre, deren Summe über dem Schwellwert liegt.


COUNT – Missionen gesamt bis 2022

SELECT COUNT(*) 
FROM spacemission.missions
WHERE YEAR(launch_date) <= 2022;

SUM – Views aller 100 YouTube-Songs

SELECT SUM(view_count)
FROM youtube_top_100_songs_2025.youtube_top_100_songs_2025;

AVG – Durchschnittliche Songdauer

SELECT AVG(duration)
FROM youtube_top_100_songs_2025.youtube_top_100_songs_2025;

MAX/MIN – Längster / Kürzester Song

SELECT MAX(duration) FROM youtube_top_100_songs_2025.youtube_top_100_songs_2025;
SELECT MIN(duration) FROM youtube_top_100_songs_2025.youtube_top_100_songs_2025;

GROUP BY – Wie viele Missionen pro Firma

SELECT company, COUNT(*) AS starts
FROM spacemission.missions
GROUP BY company
ORDER BY starts DESC
LIMIT 10;

HAVING – Firmen mit über 100 Missionen (Top 5)

SELECT company, COUNT(*) AS starts
FROM spacemission.missions
GROUP BY company
HAVING COUNT(*) > 100
ORDER BY starts DESC
LIMIT 5;

Aliasse *Spalten:* SELECT SUM(x) AS totalAS ist optional (SELECT SUM(x) total). *Tabellen:* FROM t AS x oder FROM t x (in MySQL beides ok). Wenn Sie einer Tabelle einen Alias geben, verwenden Sie ihn konsequent (x.col statt t.col).

WHERE vs. HAVINGWHERE: Zeilen vor dem Gruppieren filtern (z. B. Jahre ab 2018). • HAVING: Gruppen nach Aggregaten filtern (z. B. SUM(…) > 25000).

NULL-Fallen COUNT(spalte) ignoriert NULL → bewusste Spaltenwahl! Bei Quoten/Prozenten Division durch 0 vermeiden: NULLIF(denominator, 0).

Weiterführend / Struktur in mehrere Seiten Für grössere Lernpakete empfiehlt sich eine Aufteilung: • LU10/Teil A: Aggregatfunktionen Basics (COUNT, SUM, AVG, MIN/MAX) • LU10/Teil B: GROUP BY – ein- und mehrspaltig, Sortierung, DISTINCT vs. GROUP BY • LU10/Teil C: HAVING – Gruppen filtern, typische Muster • LU10/Teil D: Performance & Indizes, Best Practices, kleine Mini-Projekte

Infos zu den Firmen involviert in die "Space Race"

Kürzel in Liste Ausgeschrieben / Organisation Land / Region
RVSN USSR Strategic Missile Forces of the USSR (Raketentruppen der strategischen Bestimmung) Sowjetunion (historisch)
CASC China Aerospace Science and Technology Corporation China
Arianespace Arianespace S.A. (europäischer Launch-Dienstleister) Europa / Frankreich
General Dynamics General Dynamics Astronautics (u. a. Atlas-Programm; historisch) USA
VKS RF Russian Aerospace Forces (WKS / Vozdushno-Kosmicheskiye Sily) Russland
NASA National Aeronautics and Space Administration USA
SpaceX Space Exploration Technologies Corp. USA
US Air Force United States Air Force (historischer Launch-Operator) USA
ULA United Launch Alliance (JV von Boeing & Lockheed Martin) USA
Boeing The Boeing Company (Boeing Launch Services / Delta-Programm) USA
  • modul/m290_guko/learningunits/lu10/theorie/b_group_by.1762708203.txt.gz
  • Zuletzt geändert: 2025/11/09 18:10
  • von gkoch