Lösung Übung A: Hinführend zu HAVING

Hinweis: Diese Aufgaben fangen ganz leicht an und führen Schritt für Schritt zu HAVING hin. HAVING wird erst in der letzten Aufgabe benutzt.


A1)
 Gebe die vollständige Tabelle schueler aus

SELECT *
FROM schueler

A2) Gebe alle Schülernamen aus und in welchem Klassenzimmer sie sind

SELECT name, klassenzimmer
FROM schueler

A3) Gebe alle Schülernamen aus wenn sie in einem Klassenzimmer größer 200 sind

SELECT name, klassenzimmer
FROM schueler
WHERE klassenzimmer > 200

A4) Begründe, warum folgende Anweisung irreführend ist

SELECT name, klassenzimmer, count() AS Anzahl
FROM schueler

1. Fehlende GROUP BY-Klausel
Du verwendest eine Aggregatfunktion (COUNT(*)), aber keine GROUP BY. Das führt zu einem Konflikt:
COUNT(*) berechnet einen Gesamtwert (z. B. Anzahl aller Zeilen).
name und klassenzimmer sind nicht aggregierte Spalten.
In den meisten SQL-Dialekten (z. B. PostgreSQL, MySQL im strict mode) ist das nicht erlaubt und führt zu einem Fehler.

2. Unklare Bedeutung der Ausgabe
Selbst wenn die Datenbank es erlaubt (z. B. MySQL ohne strict mode), ist das Ergebnis irreführend, weil:
COUNT(*) liefert die Gesamtanzahl aller Schüler.
name und klassenzimmer stammen dann aus irgendeiner zufälligen Zeile.
Das Ergebnis wirkt so, als würde die Anzahl zu genau diesem Schüler gehören – was falsch ist.

A5) Gebe alle möglichen Klassenzimmernummern aus

SELECT klassenzimmer
FROM schueler
GROUP BY klassenzimmer
# oder
SELECT DISTINCT klassenzimmer
FROM schueler

A6) Gebe die Anzahl der Schüler aus, die in Klassenzimmern mit einer Nummer >= 200 sind

SELECT klassenzimmer, COUNT(*) AS "Anzahl"
FROM schueler
WHERE klassenzimmer >= 200

A7) Gebe alle Klassenzimmernummer und die Anzahl der Schüler aus, die in Klassenzimmern mit einer Nummer >=200 sind

SELECT klassenzimmer, COUNT(*) AS "Anzahl"
FROM schueler
WHERE klassenzimmer >= 200
GROUP BY klassenzimmer

A8) Gebe alle Klassenzimmernummer und die Anzahl der Schüler aus

SELECT klassenzimmer, COUNT(*) AS "Anzahl"
FROM schueler
GROUP BY klassenzimmer

A9) Wir wollen herausbekommen, in welchen Klassenzimmern zu wenig Schüler unterrichtet werden. Gebe eine Liste der Klassenzimmer und die in diesen Klassenzimmern unterrichteten Schüler aus (Spalten "Klassenzimmer", "Anzahl"). Dabei interessieren uns nur die Klassenzimmer, in denen weniger als 10 Schüler sitzen.

SELECT klassenzimmer, COUNT(*) AS "Anzahl"
FROM schueler
GROUP BY klassenzimmer
HAVING COUNT(*) < 10