Site x5

INNER JOIN

Tabelle L
Tabelle L
Tabelle R
Tabelle R

Der INNER JOIN kombiniert Datensätze, bei denen es in beiden Tabellen eine Übereinstimmung gibt, basierend auf einer Join-Bedingung.

Syntax von INNER JOIN

SELECT <Spalten> FROM tabelle_l
INNER JOIN tabelle_r ON <Bedingung>;

Beispieltabelle

Wir gehen von folgendem Beispielschema samt Beispieldaten aus:

arbeitet
arbeitet
Mitarbeiter
Mitarbeiter
Abteilung
Abteilung
n
n
1
1
Mitarbeiter
Mitarbeiter
PK
PK
id
id
vorname
vorname
nachname
nachname
FK
FK
abteilung
abteilung
Abteilung
Abteilung
PK
PK
id
id
name
name
standort
standort
Mitarbeiter
id
id
vorname
vorname
nachname
nachname
abteilung
abteilung
1
1
Adam
Adam
Heim
Heim
2
2
2
2
Julia
Julia
Klein
Klein
2
2
3
3
Lorenz
Lorenz
Knack
Knack
3
3
4
4
Heidi
Heidi
Hell
Hell
NULL
NULL
5
5
Otto
Otto
Karl
Karl
NULL
NULL
Abteilung
id
id
name
name
1
1
Personal
Personal
2
2
IT
IT
3
3
Produktion
Produktion
Entity Relationship Modell
Entity Relationship Modell
Relationales Datenmodell
Relationales Datenmodell
Datenbank Tabellen
Datenbank Tabellen

Kombiniere Mitarbeiter und Abteilung

Wir können die entsprechenden Zeilen aus der Abteilungs-Tabelle an die entsprechenden Zeilen aus der Mitarbeiter-Tabelle "joinen":

Mitarbeiter
id
id
vorname
vorname
nachname
nachname
abteilung
abteilung
1
1
Adam
Adam
Heim
Heim
2
2
2
2
Julia
Julia
Klein
Klein
2
2
3
3
Lorenz
Lorenz
Knack
Knack
3
3
4
4
Heidi
Heidi
Hell
Hell
NULL
NULL
5
5
Otto
Otto
Karl
Karl
NULL
NULL
Abteilung
id
id
name
name
1
1
Personal
Personal
2
2
IT
IT
3
3
Produktion
Produktion
3
3
Produktion
Produktion
2
2
IT
IT
2
2
IT
IT
SELECT * 
FROM Mitarbeiter
    INNER JOIN Abteilung
    ON Mitarbeiter.abteilung = Abteilung.id;

Wenn wir diesen JOIN-Query absenden, passiert folgendes: In einem Zwischenschritt, von dem wir nichts mitbekommen, wird jede Zeile aus Tabelle 1 mit jeder Zeile aus Tabelle 2 kombiniert. Bis hierhin ist das der CROSS JOIN. Aber dann wird die Bedingung geprüft und alle Zeilen die nicht passen (ein großteil), werden verworfen und nicht in die Ergebnistabelle übernommen.

zwischentabelle
id
id
vorname
vorname
nachname
nachname
abteilung
abteilung
id
id
name
name
1
1
Adam
Adam
Heim
Heim
2
2
1
1
Personal
Personal
1
1
Adam
Adam
Heim
Heim
2
2
2
2
IT
IT
1
1
Adam
Adam
Heim
Heim
2
2
3
3
Produktion
Produktion
2
2
Julia
Julia
Klein
Klein
2
2
1
1
Personal
Personal
2
2
Julia
Julia
Klein
Klein
2
2
2
2
IT
IT
2
2
Julia
Julia
Klein
Klein
2
2
3
3
Produktion
Produktion
3
3
Lorenz
Lorenz
Knack
Knack
3
3
1
1
Personal
Personal
3
3
Lorenz
Lorenz
Knack
Knack
3
3
2
2
IT
IT
3
3
Lorenz
Lorenz
Knack
Knack
3
3
3
3
Produktion
Produktion
4
4
Heidi
Heidi
Hell
Hell
NULL
NULL
1
1
Personal
Personal
4
4
Heidi
Heidi
Hell
Hell
NULL
NULL
2
2
IT
IT
4
4
Heidi
Heidi
Hell
Hell
NULL
NULL
3
3
Produktion
Produktion
5
5
Otto
Otto
Karl
Karl
NULL
NULL
1
1
Personal
Personal
5
5
Otto
Otto
Karl
Karl
NULL
NULL
2
2
IT
IT
5
5
Otto
Otto
Karl
Karl
NULL
NULL
3
3
Produktion
Produktion
Mitarbeiter
Mitarbeiter
Abteilung
Abteilung

Die Ergebnistabelle sieht dann so aus:

Ergebnistabelle
id
id
vorname
vorname
nachname
nachname
abteilung
abteilung
id
id
name
name
1
1
Adam
Adam
Heim
Heim
2
2
2
2
IT
IT
2
2
Julia
Julia
Klein
Klein
2
2
2
2
IT
IT
3
3
Lorenz
Lorenz
Knack
Knack
3
3
3
3
Produktion
Produktion
Mitarbeiter
Mitarbeiter
Abteilung
Abteilung

Wir sehen, dass wir jetzt redundante Spalten haben (abteilung und id).

Wenn wir die SELECT-Klausel wie folgt anpassen:

SELECT
    m.id,
    m.vorname,
    m.nachname,
    a.name AS abteilung
FROM Mitarbeiter m
    INNER JOIN Abteilung a
    ON m.abteilung = a.id;

sieht das Ergebnis viel besser aus:

Ergebnistabelle
id
id
vorname
vorname
nachname
nachname
abteilung
abteilung
1
1
Adam
Adam
Heim
Heim
IT
IT
2
2
Julia
Julia
Klein
Klein
IT
IT
3
3
Lorenz
Lorenz
Knack
Knack
Produktion
Produktion

Ausgefilterte Zeilen

Die rot markierten Zeilen sind nicht in der Ergebnistabelle vorhanden, das liegt daran, dass diese Zeilen keinen "Join-Partner" in der jeweils anderen Tabelle gefunden haben.

Mitarbeiter
id
id
vorname
vorname
nachname
nachname
abteilung
abteilung
1
1
Adam
Adam
Heim
Heim
2
2
2
2
Julia
Julia
Klein
Klein
2
2
3
3
Lorenz
Lorenz
Knack
Knack
3
3
4
4
Heidi
Heidi
Hell
Hell
NULL
NULL
5
5
Otto
Otto
Karl
Karl
NULL
NULL
Abteilung
id
id
name
name
1
1
Personal
Personal
2
2
IT
IT
3
3
Produktion
Produktion

Warum manchmal gerade diese Zeilen so interessant sind und wie man sie per Query ausliest, erfahren Sie auf der nächsten Seite.

Fazit

Wie wir gesehen haben, ist es ohne viel Aufwand möglich, die ausgelagerten Daten wieder zusammenzuführen.

Das ermöglicht es uns, die Daten redundanzfrei zu speichern und bei Bedarf wieder zu kombinieren.