Aufgabe 14 - SQL Joins (E-Sports Edition) - Newcomers
Aufgabe 14 - SQL Joins (E-Sports Edition) - Newcomers
Abschnitt betitelt „Aufgabe 14 - SQL Joins (E-Sports Edition) - Newcomers“Worum geht es?
Abschnitt betitelt „Worum geht es?“In dieser Übung werden Daten aus mehreren Tabellen mit den verschiedenen Join-Typen verknüpft (siehe Kapitel 8 - Joins). An einem absichtlich unsauberen Datenbestand werden fehlende Zuordnungen („Orphans”) sichtbar. Im Expertenteil geht es um die häufigste Join-Falle überhaupt.
Was Sie dafür brauchen
Abschnitt betitelt „Was Sie dafür brauchen“- Kapitel 8 - Joins, Abschnitte INNER/LEFT/RIGHT/FULL/CROSS, Semi- und Anti-Join.
- Ein PostgreSQL-Server und ein SQL-Editor.
Welche Kompetenzen Sie erwerben und zeigen
Abschnitt betitelt „Welche Kompetenzen Sie erwerben und zeigen“- Sie setzen alle Join-Typen sicher ein.
- Sie spüren verwaiste Datensätze mit Outer Joins und
IS NULLauf. - Sie nutzen Semi-Joins mit
EXISTSund verbinden eine Tabelle mit sich selbst. - Sie erkennen und vermeiden die Filter-Falle beim LEFT JOIN.
Pädagogische Einordnung
Abschnitt betitelt „Pädagogische Einordnung“- Reproduktion: die Standard-Joins anwenden (Teil A).
- Reorganisation und Transfer: spezielle Join-Szenarien lösen (Teile B und C).
- Reflexion, Problemlösung und Urteilsbildung: die LEFT-JOIN-Filterfalle analysieren und begründen (Teil D).
Arbeitsaufträge
Abschnitt betitelt „Arbeitsaufträge“Die Übung ist auf etwa zwei Stunden ausgelegt. Teil D ist der Expertenteil.
Schema und Testdaten
Abschnitt betitelt „Schema und Testdaten“CREATE TABLE teams ( team_id INT PRIMARY KEY, team_name VARCHAR(50), region VARCHAR(30), rank INTEGER);
CREATE TABLE matches ( match_id SERIAL PRIMARY KEY, team_id INTEGER, -- absichtlich ohne Foreign Key game VARCHAR(50), kills INTEGER);
INSERT INTO teams VALUES(1, 'Cyber Vipers', 'Europe', 1),(2, 'Neon Samurais', 'Asia', 5),(3, 'Arctic Foxes', 'North America', 12),(4, 'Desert Rats', 'Africa', 20);
INSERT INTO matches (team_id, game, kills) VALUES(1, 'League of Legends', 25),(1, 'Valorant', 40),(2, 'Counter-Strike', 15),(2, 'League of Legends', 10),(99, 'Dota 2', 50);Teil A - Standard-Joins
Abschnitt betitelt „Teil A - Standard-Joins“- INNER JOIN:
team_name,gameundkillsaller Teams, die tatsächlich ein Match gespielt haben. - LEFT JOIN: alle Teams mit ihren Spielen, auch Teams ohne Match (wie „Arctic Foxes”).
- RIGHT JOIN: Match-Einträge, die keinem existierenden Team zugeordnet sind (
game,kills,team_id). - FULL OUTER JOIN: alle Teams und alle Matches, unabhängig von der Zuordnung.
Teil B - Spezielle Szenarien
Abschnitt betitelt „Teil B - Spezielle Szenarien“- CROSS JOIN: alle Teams mit den zwei fiktiven Sponsoren
'Red Bull'und'Logitech'kombinieren. - Inaktive Teams: mit
LEFT JOINundWHERE ... IS NULLalle Teams ohne Match finden. - Gezielte Filterung:
team_nameundkillsaller Spiele aus der Region'Europe'mit mehr als 30 Kills, mit Tabellen-Aliasen.
Teil C - Semi-, Anti- und Self-Join
Abschnitt betitelt „Teil C - Semi-, Anti- und Self-Join“- Semi-Join: alle Details der Teams, für die mindestens ein Match existiert (mit
EXISTS). - Self-Join: Paare von Teams aus derselben Region mit unterschiedlichem Rang, ohne Doppelpaare (A-B und B-A).
- Matching-Check: Liste, die je Team „Aktiv” oder „Inaktiv” anzeigt, je nachdem, ob es Einträge in
matcheshat.
Teil D - Expertenteil: Die LEFT-JOIN-Filterfalle
Abschnitt betitelt „Teil D - Expertenteil: Die LEFT-JOIN-Filterfalle“-
Schreiben Sie eine Abfrage, die alle Teams samt ihrer Spiele im Spiel
'Valorant'zeigt und dabei auch Teams behält, die kein Valorant gespielt haben (deren Spiel dannNULList). Erster Versuch:SELECT t.team_name, m.gameFROM teams tLEFT JOIN matches m ON m.team_id = t.team_idWHERE m.game = 'Valorant';Führen Sie diese Abfrage aus. Sie liefert nicht das gewünschte Ergebnis. Erklären Sie in zwei bis drei Sätzen, warum die
WHERE-Bedingung den LEFT JOIN faktisch in einen INNER JOIN verwandelt. -
Korrigieren Sie die Abfrage, indem Sie die Bedingung in die
ON-Klausel verschieben, und zeigen Sie, dass nun alle Teams erscheinen.SELECT t.team_name, m.gameFROM teams tLEFT JOIN matches m ON m.team_id = t.team_id AND m.game = 'Valorant'; -
Formulieren Sie als Merksatz, wann eine Bedingung in die
ON-Klausel und wann in dieWHERE-Klausel gehört. -
Zusatz: Ermitteln Sie je Region die Gesamtzahl der Kills (auch Regionen mit Teams ohne Match sollen mit
0erscheinen). Nutzen SieLEFT JOIN,COALESCEundGROUP BY.
Wissenscheck
Abschnitt betitelt „Wissenscheck“- Was passiert bei einem
INNER JOIN, wenn dieteam_idinmatchesauf einen nicht existierenden Wert zeigt? - Warum ist ein
CROSS JOINohne Filter bei großen Tabellen gefährlich? - Welchen Join-Typ verwendet man, um alle Teams inklusive der ohne Matches zu listen?
- Warum verwandelt ein
WHERE m.game = 'Valorant'einen LEFT JOIN in einen INNER JOIN? - Wann gehört eine Bedingung in die
ON- und wann in dieWHERE-Klausel?
- Die Datei
aufgabe14_joins.sqlmit allen Abfragen, fehlerfrei ausführbar, mit Aliasen und sauberer Formatierung, inklusive der beiden Varianten aus Teil D und dem Merksatz als Kommentar.
HTL Villach, Schuljahr 2025-2026,
https://www.htl-villach.at