# SQL 08: n:m Beziehungen & Junction Tables 🌐 Willkommen zu **Modul 08** und dem Finale von **Lehrpfad 2: Relationale Joins & Datenbank-Design**! Viele reale Beziehungen sind n:m-Beziehungen (Viele-zu-Viele): Ein Student belegt viele Kurse, und ein Kurs hat viele Studenten. Relationale Datenbanken kΓΆnnen n:m nicht direkt in einer einzigen FremdschlΓΌsselspalte speichern – sie nutzen eine **Junction Table** (VerknΓΌpfungstabelle). --- ## πŸ’‘ 1. Das Wichtigste in KΓΌrze ### Die Anatomie einer Junction Table (n:m BrΓΌcke) ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ studenten β”‚ 1 n β”‚ einschreibungen β”‚ n 1 β”‚ kurse β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ ───────────── β”‚ (Junction Table) β”‚ ───────────── β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ PK id β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ PK id β”‚ β”‚ name β”‚ β”‚ PK,FK student_id β”‚ β”‚ titel β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ PK,FK kurs_id β”‚ β”‚ ects β”‚ β”‚ semester β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ note β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` ### Definition mit zusammengesetztem PrimΓ€rschlΓΌssel ```sql CREATE TABLE einschreibungen ( student_id INTEGER NOT NULL, kurs_id INTEGER NOT NULL, semester TEXT NOT NULL, note REAL CHECK (note >= 1.0 AND note <= 5.0), status TEXT NOT NULL DEFAULT 'angemeldet', -- Zusammengesetzter PrimΓ€rschlΓΌssel verhindert Doppel-Einschreibungen: PRIMARY KEY (student_id, kurs_id), FOREIGN KEY (student_id) REFERENCES studenten(id) ON DELETE CASCADE, FOREIGN KEY (kurs_id) REFERENCES kurse(id) ON DELETE CASCADE ); ``` ### Abfrage ΓΌber zwei JOINs (3-Wege-Join) ```sql SELECT s.matrikelnummer, s.vorname || ' ' || s.nachname AS student, k.titel AS kurs, k.ects, e.semester, e.note FROM studenten s JOIN einschreibungen e ON s.id = e.student_id JOIN kurse k ON e.kurs_id = k.id ORDER BY s.nachname, k.kurs_code; ``` --- ## 🎯 Aufgaben in `aufgabe.sql` 1. **TODO 1**: `PRAGMA foreign_keys = ON;` setzen und Tabellen `studenten` und `kurse` anlegen. 2. **TODO 2**: Junction Table `einschreibungen` mit `PRIMARY KEY (student_id, kurs_id)` und `ON DELETE CASCADE` erstellen. 3. **TODO 3**: 4 Studenten, 3 Kurse und 7 Einschreibungen einfΓΌgen. 4. **TODO 4**: 3-Wege-Join-Abfrage schreiben (Studentenname, Kurs-Titel, ECTS, Semester, Note). 5. **TODO 5**: Alle Studenten finden, die den Kurs mit Code `'DB101'` mit Note <= 2.0 bestanden haben. 6. **TODO 6**: Kaskadierendes LΓΆschen testen: LΓΆsche den Kurs `'WEB201'` (`DELETE FROM kurse WHERE kurs_code = 'WEB201';`) und prΓΌfe, dass alle VerknΓΌpfungen in `einschreibungen` automatisch gelΓΆscht wurden. --- ## πŸš€ AusfΓΌhrung Klicke in der Web-IDE auf **Code ausfΓΌhren** oder **Tests ausfΓΌhren**, um deine n:m-Modellierung zu ΓΌberprΓΌfen.