Datenbanken · AE und SI
SQL: SELECT, JOIN und GROUP BY üben
Lerne SQL-Abfragen mit Filtern, Tabellenverknüpfungen und Aggregaten. Bestimme Ergebnisse und erkenne typische Fehler anhand kleiner Datensätze.
Verantwortlich: Bär Softwareentwicklung UG (haftungsbeschränkt) / Aktualisiert: 07.10.2026
Automatisch bewertetes Thementraining
Wissen direkt in einem kurzen Set prüfen
Bearbeite bis zu 5 zufällig ausgewählte Aufgaben in etwa 5 Minuten. Du erhältst nach jeder Aufgabe Feedback und am Ende eine kompakte Auswertung.
SELECT und WHERE: Daten gezielt auswählen
SELECT benennt die Ausgabespalten, FROM die Datenquelle und WHERE die Bedingung für einzelne Zeilen. ORDER BY legt die Sortierung fest. Ohne ORDER BY ist keine bestimmte Ausgabeordnung zugesichert.
NULL kennzeichnet einen fehlenden beziehungsweise unbekannten Wert. Prüfe ihn mit IS NULL statt mit = NULL. Bei gemischten AND- und OR-Bedingungen helfen Klammern, die Absicht eindeutig auszudrücken.
- SELECT name FROM kunden WHERE aktiv = 1 ORDER BY name
- Fehlende Werte: IS NULL oder IS NOT NULL
- AND bindet stärker als OR
JOIN: passende Zeilen verbinden
Ein INNER JOIN gibt passende Zeilenpaare aus. Ein LEFT JOIN behält auch Zeilen der linken Tabelle ohne Treffer; die rechten Spalten sind dann NULL.
Eine 1:n-Beziehung kann eine linke Zeile mehrfach im Ergebnis erscheinen lassen. Ein Filter auf die rechte Tabelle in WHERE kann beim LEFT JOIN die Zeilen ohne Treffer wieder entfernen.
- JOIN kunden k ON b.kunde_id = k.id
- Joinbedingungen ausdrücklich angeben
- COUNT(b.id) zählt beim LEFT JOIN nur nicht leere Bestellungs-IDs
GROUP BY und HAVING: Gruppen auswerten
GROUP BY fasst Zeilen nach den genannten Spalten zusammen. COUNT, SUM und AVG berechnen Kennzahlen je Gruppe. Wähle für portable Abfragen nur gruppierte Spalten oder Aggregate aus.
WHERE filtert die Eingabezeilen vor der Gruppierung; HAVING prüft danach die Gruppen. COUNT(*) zählt alle Ergebniszeilen, COUNT(spalte) nur die Zeilen mit einem Nicht-NULL-Wert in dieser Spalte.
- WHERE betrag > 0: einzelne Zeilen filtern
- GROUP BY kunde_id: eine Gruppe je Kunde
- HAVING SUM(betrag) > 100: Gruppen filtern
Durchgerechnetes Beispiel
Umsatz je Kunde
bestellungen enthält (kunde_id, betrag): (1, 40), (1, 80), (2, 50). Gesucht sind Kunden mit insgesamt mehr als 100 Euro.
- 01 Gruppiere mit GROUP BY kunde_id.
- 02 SUM(betrag) ergibt für Kunde 1 den Wert 120 und für Kunde 2 den Wert 50.
- 03 SELECT kunde_id, SUM(betrag) AS umsatz FROM bestellungen GROUP BY kunde_id HAVING SUM(betrag) > 100;
Ergebnis / Nur Kunde 1 erscheint mit 120 Euro.
Durchgerechnetes Beispiel
Auch Kunden ohne Bestellung zählen
kunden enthält IDs 1 und 2; bestellungen enthält die IDs 10 und 11, beide für Kunde 1.
- 01 Beginne mit kunden und verwende einen LEFT JOIN auf bestellungen.
- 02 SELECT k.id, COUNT(b.id) AS anzahl FROM kunden k LEFT JOIN bestellungen b ON b.kunde_id = k.id GROUP BY k.id ORDER BY k.id;
- 03 COUNT(b.id) zählt die NULL-Ergänzung für Kunde 2 nicht.
Ergebnis / Kunde 1 hat zwei Bestellungen, Kunde 2 hat null.
Jetzt in etwa 5 Minuten selbst anwenden
| Baustein | Zweck |
|---|---|
| WHERE | Einzelne Zeilen filtern |
| INNER JOIN | Nur passende Paare |
| LEFT JOIN | Alle linken Zeilen behalten |
| GROUP BY | Gruppen bilden |
| HAVING | Gruppen filtern |
Typische Fehler vermeiden
- SUM(betrag) gehört als Gruppenbedingung in HAVING, nicht in WHERE.
- COUNT(*) und COUNT(b.id) liefern bei einem LEFT JOIN nicht immer dasselbe Ergebnis.
- Ein JOIN ohne passende Bedingung kann die Zeilenzahl vervielfachen.
Direkt anwenden
8 Übungen mit Lösungen
Beantworte die Aufgabe zuerst selbst. Öffne danach die Lösung, um Antwort und Rechenweg zu vergleichen.
-
Anwendungsentwicklung
Welche Bedingung findet Kunden, deren E-Mail-Adresse NULL ist?
Übungsvorschau: Notiere hier zuerst deinen Ansatz oder starte dieselbe Aufgabe anschließend im bewerteten Lernmodus.
Lösung anzeigen Lösung ausblenden
Musterlösung: WHERE email IS NULL
IS NULL prüft fehlende Werte. Ein normaler Vergleich mit NULL liefert UNKNOWN.
-
Systemintegration
Die Tabelle umsaetze enthält Beträge 20, 30 und 70. SELECT COUNT(*) FROM umsaetze WHERE betrag >= 30 liefert welche Zahl?
Übungsvorschau: Notiere hier zuerst deinen Ansatz oder starte dieselbe Aufgabe anschließend im bewerteten Lernmodus.
Lösung anzeigen Lösung ausblenden
Musterlösung: 2
30 und 70 erfüllen >= 30. COUNT(*) zählt diese zwei Zeilen.
-
Anwendungsentwicklung
Du möchtest alle Kunden samt eventuell vorhandenen Bestellungen sehen, einschließlich Kunden ohne Bestellung. Welcher JOIN passt?
Übungsvorschau: Notiere hier zuerst deinen Ansatz oder starte dieselbe Aufgabe anschließend im bewerteten Lernmodus.
Lösung anzeigen Lösung ausblenden
Musterlösung: kunden LEFT JOIN bestellungen ON bestellungen.kunde_id = kunden.id
Der LEFT JOIN erhält alle Kunden der linken Tabelle; bei fehlender Bestellung sind die rechten Spalten NULL.
-
Systemintegration
kunden enthält IDs 1, 2 und 3. bestellungen enthält drei Zeilen mit kunde_id 1 und eine mit kunde_id 2. Wie viele Zeilen liefert ein INNER JOIN über kunde_id = kunden.id?
Übungsvorschau: Notiere hier zuerst deinen Ansatz oder starte dieselbe Aufgabe anschließend im bewerteten Lernmodus.
Lösung anzeigen Lösung ausblenden
Musterlösung: 4
Kunde 1 liefert drei passende Paare, Kunde 2 eines, Kunde 3 keines. Insgesamt sind es vier Zeilen.
-
Anwendungsentwicklung
Welche Klausel filtert nach GROUP BY kunde_id die Gruppen mit mehr als zwei Bestellungen?
Übungsvorschau: Notiere hier zuerst deinen Ansatz oder starte dieselbe Aufgabe anschließend im bewerteten Lernmodus.
Lösung anzeigen Lösung ausblenden
Musterlösung: HAVING COUNT(*) > 2
HAVING prüft die Gruppen nach der Aggregation. WHERE filtert vorher einzelne Eingabezeilen.
-
Systemintegration
kunden enthält nur IDs 1 und 2. bestellungen enthält IDs 10 und 11, beide für kunde_id 1. Welchen Wert liefert COUNT(b.id) für Kunde 2 bei einem LEFT JOIN von kunden k auf bestellungen b und GROUP BY k.id?
Übungsvorschau: Notiere hier zuerst deinen Ansatz oder starte dieselbe Aufgabe anschließend im bewerteten Lernmodus.
Lösung anzeigen Lösung ausblenden
Musterlösung: 0
Kunde 2 erhält eine ergänzte Ergebniszeile mit b.id = NULL. COUNT(b.id) zählt sie nicht; COUNT(*) würde sie zählen.
-
Anwendungsentwicklung
bestellungen enthält (kunde_id, betrag): (1, 25), (1, 35), (2, 80). Welchen Wert liefert SUM(betrag) für Kunde 1 bei GROUP BY kunde_id?
Übungsvorschau: Notiere hier zuerst deinen Ansatz oder starte dieselbe Aufgabe anschließend im bewerteten Lernmodus.
Lösung anzeigen Lösung ausblenden
Musterlösung: 60
Die beiden Zeilen für Kunde 1 werden zusammengefasst: 25 + 35 = 60.
-
Systemintegration
Ordne die SQL-Bausteine ihrer Hauptaufgabe zu.
Übungsvorschau: Notiere hier zuerst deinen Ansatz oder starte dieselbe Aufgabe anschließend im bewerteten Lernmodus.
Lösung anzeigen Lösung ausblenden
Musterlösung: WHERE → Einzelne Eingabezeilen filtern; GROUP BY → Zeilen zu Gruppen zusammenfassen; HAVING → Aggregierte Gruppen filtern; ORDER BY → Ergebnis sortieren
WHERE wirkt vor der Gruppierung, HAVING danach. ORDER BY legt die Ausgabeordnung fest.
Kurz erklärt
Häufige Fragen
Muss ich SQL für ein bestimmtes Datenbanksystem lernen?
Die Beispiele nutzen verbreitete SQL-Grundlagen. Datentypen, Funktionen und Spezialsyntax können sich zwischen Systemen unterscheiden.
Wie finde ich NULL-Werte?
Mit IS NULL. Der Vergleich = NULL liefert keine normale Wahr/Falsch-Prüfung auf einen fehlenden Wert.
Fachliche Referenz: PostgreSQL: Tabellen mit JOIN verbinden. Die Erklärungen und Aufgaben auf dieser Seite sind eigenständig formuliert.
Weiterlernen