MB Dev .tech
Registrieren Login

SQL · JOINs & Relations

← Zurück zu SQL Basics

JOINs sind der Punkt, an dem SQL „richtig mächtig“ wird: Du kannst Daten aus mehreren Tabellen so kombinieren, als wären sie eine einzige große Tabelle. Das brauchst du fast immer, sobald Tabellen miteinander verknüpft sind.

Merke
JOIN verbindet Tabellen über passende Spalten

Meistens: Fremdschlüssel in Tabelle B zeigt auf Primary Key in Tabelle A. Beispiel: orders.customer_idcustomers.id.

1) Das Problem ohne JOIN

Stell dir vor, du hast eine Liste von Bestellungen. In der Tabelle orders steht aber nur die customer_id. Du willst aber den Namen des Kunden sehen.

orders (vereinfacht)

id | customer_id | total_cents
---+-------------+-------------
1  | 1           | 1999
2  | 2           | 1299
3  | 1           | 3499

Ohne JOIN würdest du nur IDs sehen – das ist für Menschen nicht besonders hilfreich. Der JOIN „holt“ dir die passenden Kundendaten dazu.

2) INNER JOIN (der wichtigste)

INNER JOIN bedeutet: „Gib mir nur Zeilen, bei denen es auf beiden Seiten einen Treffer gibt.“

Bestellungen + Kundennamen

SELECT
  o.id,
  o.total_cents,
  c.name AS customer_name
FROM orders o
INNER JOIN customers c ON c.id = o.customer_id
ORDER BY o.id ASC;
Tipp
Aliase machen SQL lesbarer

orders o und customers c spart Tipparbeit und macht Abfragen übersichtlich – besonders bei mehreren JOINs.

3) Warum o.id statt nur id?

In vielen Tabellen gibt es gleich benannte Spalten – z.B. id. Wenn du JOINs machst, ist id plötzlich „mehrdeutig“. Darum schreibt man den Tabellennamen oder Alias davor:

Qualifizierte Spalten

SELECT o.id, c.id
FROM orders o
INNER JOIN customers c ON c.id = o.customer_id;
Merke
Bei JOINs immer mit Alias arbeiten

Das verhindert Fehler, macht die Abfrage verständlicher und ist Standard in der Praxis.

4) LEFT JOIN (wenn du „alles links“ behalten willst)

LEFT JOIN bedeutet: „Gib mir alle Zeilen aus der linken Tabelle – auch wenn rechts nichts passt.“ Wenn es rechts keinen Treffer gibt, sind die rechten Spalten NULL.

Typische Frage: „Zeige mir alle Kunden – auch die, die noch nie bestellt haben.“

Kunden + ggf. Bestellungen

SELECT
  c.id,
  c.name,
  o.id AS order_id
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
ORDER BY c.id ASC;
Tipp
LEFT JOIN + WHERE kann tricky sein

Wenn du nach dem LEFT JOIN in WHERE auf eine Spalte der rechten Tabelle filterst, kann es passieren, dass du wieder wie ein INNER JOIN wirkst. (Das ist ein häufiger „Warum fehlen mir Zeilen?“ Moment.)

5) Wichtig: JOINs können Zeilen „vervielfachen“

Ein klassischer Anfänger-Schock: „Warum bekomme ich plötzlich so viele Zeilen?“

Wenn ein Kunde 3 Bestellungen hat, erscheint der Kunde beim JOIN auch 3-mal – logisch, denn jede Bestellung ist eine eigene Zeile in orders.

Merke
JOIN „multipliziert“ Zeilen bei 1:n Beziehungen

Das ist nicht falsch – du musst nur wissen, was du abfragen willst. Für „pro Kunde eine Zeile“ nutzt du oft GROUP BY.

6) Beispiel-Abfrage, wie man sie oft in Apps sieht

Eine typische „Übersicht“-Abfrage: letzte Bestellungen mit Kundennamen, sortiert nach Datum.

Praxis-Abfrage

SELECT
  o.id,
  c.name AS customer_name,
  o.total_cents,
  o.created_at
FROM orders o
INNER JOIN customers c ON c.id = o.customer_id
ORDER BY o.created_at DESC
LIMIT 20;

7) Häufiger Performance-Fallstrick: „N+1“

Ein häufiger Fehler in Anwendungen: Man lädt erst alle Bestellungen (1 Query) und dann pro Bestellung den Kunden (N Queries). Das nennt man „N+1“-Problem.

Achtung
Viele kleine Queries sind oft langsamer als ein sauberer JOIN

In der Praxis: Lieber in einer Abfrage joinen, statt 100 einzelne Abfragen zu machen.

Wie geht es weiter?

Jetzt kannst du Daten lesen und kombinieren. Als Nächstes schauen wir uns an, wie man Daten sicher schreibt: INSERT, UPDATE und DELETE – inklusive typischer Anfängerfehler.

Nächster Schritt
INSERT/UPDATE/DELETE Basics

Besonders wichtig: UPDATE/DELETE ohne WHERE – das ist einer der gefährlichsten Klassiker.