SQL JOIN

JOINs in SQL sind Befehle, um SQL Tabellen miteinander zu verbinden.

Mit JOINs kann man spezifische Verknüpfungen zwischen Tabellen herstellen, wie INNER JOIN, LEFT JOIN und RIGHT JOIN, die es ermöglichen, Daten gezielt auszuwählen und nur die relevanten Zeilen anzuzeigen.
Dies verbessert nicht nur die Lesbarkeit der Abfragen, sondern auch die Effizienz, da nur die notwendigen Daten verarbeitet werden.
Durch die Verwendung von JOINs wird die Datenbankabfrage klar strukturiert, was die Wartung und das Verständnis der Abfragen erleichtert.

JOIN-Typen Übersicht:

          Tabelle A          Tabelle B
          ┌────────┐         ┌────────┐
          │   A    │         │   B    │
          └────────┘         └────────┘
               │                  │
               └────────┬─────────┘
                        │
         ┌──────────────┼──────────────┐
         │              │              │
    ┌────▼────┐    ┌───▼────┐    ┌───▼─────┐
    │ INNER   │    │ LEFT   │    │ RIGHT   │
    │ JOIN    │    │ JOIN   │    │ JOIN    │
    └─────────┘    └────────┘    └─────────┘

Visuelle Darstellung - INNER JOIN:

Tabelle A: Schueler          Tabelle B: Kurse
┌────┬─────────┐             ┌────┬──────────┐
│ ID │ Name    │             │ ID │ Kursname │
├────┼─────────┤             ├────┼──────────┤
│ 1  │ Max     │             │ 1  │ Math     │
│ 2  │ Anna    │             │ 2  │ Deutsch  │
└────┴─────────┘             └────┴──────────┘
       │                            │
       └─────────┬──────────────────┘
                 │
      Tabelle C: Einschreibung
      ┌───────────┬─────────┐
      │ SchuelerID│ KursID  │
      ├───────────┼─────────┤
      │     1     │    1    │
      │     1     │    2    │
      │     2     │    1    │
      └───────────┴─────────┘

SELECT Schueler.Name, Kurse.Kursname
FROM Schueler
INNER JOIN Einschreibung ON Schueler.ID = Einschreibung.SchuelerID
INNER JOIN Kurse ON Einschreibung.KursID = Kurse.ID;

Ergebnis:
┌─────────┬──────────┐
│ Name    │ Kursname │
├─────────┼──────────┤
│ Max     │ Math     │
│ Max     │ Deutsch  │
│ Anna    │ Math     │
└─────────┴──────────┘

Venn-Diagramme der JOINs:

INNER JOIN:              LEFT JOIN:               RIGHT JOIN:
  ┌───┐ ┌───┐           ┌───┐ ┌───┐              ┌───┐ ┌───┐
  │ A │ │ B │           │ A │ │ B │              │ A │ │ B │
  └─┬─┘ └─┬─┘           └─┬─┘ └─┬─┘              └─┬─┘ └─┬─┘
    │ ███ │               │████████                ███████ │
    └─────┘               └─────┘                  └─────┘
   Nur         Alles von A +      Alles von B +
   Überschneidung  Überschneidung   Überschneidung

FULL OUTER JOIN:         CROSS JOIN:
  ┌───┐ ┌───┐           ┌───┐ ┌───┐
  │ A │ │ B │           │ A │ │ B │
  └─┬─┘ └─┬─┘           └─┬─┘ └─┬─┘
████████████              Jede Zeile von A
                         mit jeder Zeile von B

Die JOIN-Typen

Übersicht

  • INNER JOIN: Nur übereinstimmende Zeilen
  • LEFT JOIN: Alle Zeilen von links + Übereinstimmungen
  • RIGHT JOIN: Alle Zeilen von rechts + Übereinstimmungen
  • FULL OUTER JOIN: Alle Zeilen von beiden Tabellen
  • CROSS JOIN: Kartesisches Produkt (jede mit jeder)

Syntax-Vergleich

INNER JOIN

SELECT s.name, k.kursname
FROM Schueler s
INNER JOIN Kurse k ON s.kurs_id = k.id;

LEFT JOIN

SELECT s.name, k.kursname
FROM Schueler s
LEFT JOIN Kurse k ON s.kurs_id = k.id;

Alte Syntax (mit WHERE)

-- Funktioniert, aber NICHT empfohlen
SELECT s.name, k.kursname
FROM Schueler s, Kurse k
WHERE s.kurs_id = k.id;

Prüfungsrelevant

JOIN vs WHERE:

  • JOIN ist EXPLIZIT und LESBAR
  • WHERE ist IMPLIZIT und schwerer zu verstehen
  • Moderne SQL nutzt JOIN

Wichtigste JOIN-Typen:

  1. INNER JOIN: Standard, nur Übereinstimmungen
  2. LEFT JOIN: Wichtig für "auch wenn keine Zuordnung"
  3. RIGHT JOIN: Selten genutzt (meist umgedreht als LEFT)

ON vs USING:

  • ON: Flexibel, verschiedene Spaltennamen
  • USING: Nur wenn Spalten gleich heißen
Best Practices

  1. Tabellen-Aliase verwenden
FROM Schueler s  -- ✓ Kurz und lesbar
JOIN Kurse k     -- ✓
  1. JOIN statt WHERE
-- ✓ RICHTIG
FROM A JOIN B ON A.id = B.a_id

-- ✗ VERALTET
FROM A, B WHERE A.id = B.a_id
  1. Reihenfolge beachten
  • Größte Tabelle zuerst
  • Dann kleinere Tabellen joinen

Siehe auch