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 hier. </WRAP> === 3.3 Beispiel: Total Einbrüche pro Jahr (Kanton ZH) ===

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

Was passiert? SUM(…) aggregiert pro Jahr; ORDER BY sortiert chronologisch.

=== 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. HAVING – Gruppen nach Kennzahlen filtern ===== === 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.

—- ===== 5. Live-Beispiele im Unterricht (wie angekündigt) =====

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;

—- ===== 6. Tipps & Best Practices =====

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.1762707706.txt.gz
  • Zuletzt geändert: 2025/11/09 18:01
  • von gkoch