INNER JOIN: Definition und Anwendung

Abfragen über mehrere Datenbanktabellen realisieren Sie im relationalen Datenbankmodell mithilfe von SQL-JOINs. Bei allen JOIN-Typen mit Ausnahme des CROSS-JOINs handelt es sich um eine Kombination aus kartesischem Produkt und Selektion.

Das Datenbank-Managementsystem (DBMS) bildet zunächst das Kreuzprodukt zweier Datenbanktabellen. Anschließend filtert es das Ergebnis gemäß einer vom Anwender via SQL-Statement definierten Selektionsbedingung. Der INNER JOIN hebt sich dabei von allen anderen JOIN-Typen durch eine minimale Ergebnismenge ab. Als Ergebnis eines INNER JOINs werden lediglich die Datensätze des Kreuzproduktes ausgegeben, die die Selektionsbedingung erfüllen. Das Resultat ist eine Ergebnistabelle (ein View) ohne Nullwerte.

INNER JOINs in der Praxis

Wir verdeutlichen den INNER JOIN an einem Beispiel und gehen dabei von zwei Tabellen aus. In der Tabelle „mitarbeiter“ sind die Mitarbeiter eines Unternehmens inklusive Mitarbeiter-ID (m_id) und zugehöriger Abteilung (a_id) erfasst.

Tabelle: mitarbeiter

m_id nachname vorname a_id
1 Schmidt Udo 3
2 Müller Wolfgang 1
3 Meyer Günther 1
4 Krause Helmut 2
5 Schneider Kevin NULL

Die Tabelle zeigt zwei Besonderheiten: Die Mitarbeiter Müller und Meyer arbeiten in derselben Abteilung. Der Mitarbeiter Schneider wurde bisher noch keiner Abteilung zugeordnet.

Die Tabelle „abteilungen“ listet alle Abteilungen des Unternehmens inklusive ID und Standortangabe auf.

Tabelle: abteilungen

a_id bezeichnung standort
1 Vertrieb Frankfurt
2 IT Bad Homburg
3 Personal Offenbach
4 Forschung Bad Homburg

Beide Tabellen sind über eine Fremdschlüsselbeziehung miteinander verknüpft. Die Abteilungs-ID, die in der Tabelle „abteilungen“ als Primärschlüssel fungiert, wurde in die Tabelle „mitarbeiter“ als Fremdschlüssel integriert.

Diese Verknüpfung ermöglicht uns einen INNER JOIN über beide Tabellen. Ein solcher ist beispielsweise notwendig, um zu ermitteln, welcher Mitarbeiter an welchem Standort tätig ist.

Bei Abfragen relationaler Datenbanken wird in der Regel eine Entsprechung von Primär- und Fremdschlüssel als Selektionsbedingung definiert. Die Bedingung gilt als erfüllt, wenn der ausgewählte Fremdschlüssel der einen Tabelle mit dem Primärschlüssel der anderen Tabelle übereinstimmt (=). Es werden somit nur die Datensätze ausgegeben, die gemeinsame Werte enthalten.

Ein solcher INNER JOIN wird in der relationalen Algebra folgendermaßen notiert.

mitarbeiter⋈a_id=a_idabteilungen

Relationale Datenbanksysteme nehmen Befehle allerdings nicht in der Syntax der relationalen Algebra entgegen, sondern in Form von SQL-Statements.

SELECT * FROM mitarbeiter INNER JOIN abteilungen ON mitarbeiter.a_id = abteilungen.a_id;

Der Befehl SELECT weist das DBMS an, Daten aus der Datenbank abzufragen. Alternativ bietet SQL die Möglichkeit, Daten einzutragen (INSERT INTO), zu ändern (UPDATE) oder zu löschen (DELETE FROM). Auf den Befehl SELECT folgt die Angabe, welche Daten abgerufen werden sollen. Da wir den kompletten Datensatz abrufen möchten, wählen wir einen entsprechenden Platzhalter: den Asterisk (*).

Der Befehl SELECT erfordert in jedem Fall das Keyword FROM sowie die Angabe, aus welcher Tabelle bzw. aus welchem Tabellenverbund (JOIN) die Daten abgerufen werden sollen. In unserem Fall ist die Datenquelle ein INNER JOIN über die Tabellen „abteilungen“ und „mitarbeiter“. Zudem geben wir mit dem Schlüsselwort ON eine Bedingung für die Verknüpfung an. Wir möchten lediglich die Datensätze verknüpfen und als Ergebnistabelle ausgeben lassen, bei denen die a_id der Tabelle „mitarbeiter“ der a_id der Tabelle „abteilungen“ entspricht.

Tipp

Da der INNER JOIN der wichtigste SQL-JOIN ist, können Sie das Schlüsselwort „INNER“ bei Bedarf auch weglassen.

Ein INNER JOIN über die beiden Ausgangstabellen mit der Bedingung mitarbeiter.a_id = abteilungen.a_id liefert folgende Ergebnistabelle.

Tabelle: SQL INNER JOIN über „mitarbeiter“ und „abteilungen“

m_id nachname vorname mitarbeiter.a_id abteilungen.a_id bezeichnung standort
1 Schmidt Udo 3 3 Personal Offenbach
2 Müller Wolfgang 1 1 Vertrieb Frankfurt
3 Meyer Günther 1 1 Vertrieb Frankfurt
4 Krause Helmut 2 2 IT Bad Homburg

Vergleicht man die Ergebnistabelle mit den beiden Ausgangstabellen, fällt auf, dass jeweils ein Datensatz aus jeder Tabelle fehlt. Und zwar die Datensätze für deren Wert in der Spalte a_id keine Entsprechung in der jeweils anderen Tabelle vorhanden ist.

(5, Schneider, Kevin, NULL) 

und

(4, Forschung, Bad Homburg) 

Dem Mitarbeiter Schneider wurde noch keine Abteilung zugewiesen. Der Abteilung Forschung wurden noch keine Mitarbeiter zugewiesen. Beide Datensätze werden bei einem INNER JOIN, der der Gegenüberstellung von Mitarbeitern zu ihren jeweiligen Abteilungen dient, ausgeblendet.

Möchten wir hingegen genau solche Unregelmäßigkeiten ermitteln und im Rahmen der Abfrage sichtbar machen, sollten wir statt eines INNER JOINs einen OUTER JOIN wählen.

Unterarten des INNER JOINs

INNER JOINs lassen sich als THETA JOINs, EQUI JOINs, NON EQUI JOINs und NATURAL JOINs realisieren.

THETA JOINs, EQUI JOINs und NON EQUI JOINs

Der INNER JOIN der SQL-Terminologie entspricht dem THETA JOIN der relationalen Algebra. Der THETA JOIN grenzt sich von EQUI JOINs und NON EQUI JOINs dadurch ab, dass er Anwendern einen uneingeschränkten Satz an Vergleichsoperatoren zur Auswahl stellt. EQUI JOINs hingegen schränken die Selektionsbedingung bei Abfragen auf die Gleichheit von Spaltenwerten ein. Bei NON EQUI JOINs wiederum sind alle Vergleichsoperatoren mit Ausnahme des Gleichheitszeichens erlaubt.

JOIN-Typ Erlaubte Vergleichsoperatoren
THETA JOIN = (gleich) < (kleiner als) > (größer als)≤ (kleiner oder gleich)≥ (größer oder gleich)<> (ungleich)!= (ungleich)
EQUI JOIN = (gleich)
NON EQUI JOIN < (kleiner als) > (größer als)≤ (kleiner oder gleich)≥ (größer oder gleich)<> (ungleich)!= (ungleich)

NATURAL JOINs

Werden zwei Tabellen (wie in den vorangehenden Beispielen) über gleichnamige Spalten verbunden, werden INNER JOINs in der Regel als NATURAL JOINs umgesetzt.

Bei NATURAL JOINs handelt es sich um eine Unterart des EQUI JOINs. Wie der EQUI JOIN setzt auch der NATURAL JOIN die Gleichheit zweier Spalten-Werte als Selektionsbedingung voraus.

Ein NATURAL INNER JOIN über die Tabellen „mitarbeiter und „abteilungen“ ließe sich beispielsweise folgendermaßen realisieren:

SELECT * FROM mitarbeiter INNER JOIN abteilungen USING(a_id);

Das SQL-Statement weist das DBMS an, die aufgeführten Tabellen zu verbinden. Die Selektionsbedingung wird mithilfe des Schlüsselworts USING realisiert, das angibt, welche Spalten auf Gleichheit geprüft werden sollen. Voraussetzung ist, dass in beiden Tabellen eine Spalte a_id existiert. Datensätze beider Tabellen werden nur dann in die Ergebnismenge aufgenommen, wenn das DBMS identische Werte in den mit a_id bezeichneten Spalten vorfindet.

Auch die Ergebnistabelle des NATURAL JOINs unterscheidet sich von der des klassischen INNER JOINs dadurch, dass gleichnamige Spalten der Ausgangstabellen nicht doppelt aufgelistet, sondern zu einer gemeinsamen Spalte zusammengeführt werden.

Tabelle: NATURAL JOIN über „mitarbeiter“ und „abteilungen“

m_id nachname vorname a_id bezeichnung standort
1 Schmidt Udo 3 Personal Offenbach
2 Müller Wolfgang 1 Vertrieb Frankfurt
3 Meyer Günther 1 Vertrieb Frankfurt
4 Krause Helmut 2 IT Bad Homburg

Statt die Abteilungs-IDs beider Tabellen als mitarbeiter.a_id und abteilungen.a_id doppelt aufzuführen, wird lediglich eine Spalte a_id ausgespielt.

Für NATURAL JOINs steht eine Kurzschreibweise zur Verfügung, die ohne USING-Klausel auskommt. Stattdessen verwendet man den Operator NATURAL JOIN. Die Kurzschreibweise der oben aufgeführten Operation entspricht folgendem SQL-Statement.

SELECT * FROM mitarbeiter NATURAL JOIN abteilungen;

Der Operator NATURAL JOIN verbindet Tabellen automatisch über gleichnamige Spalten. Die Selektionsbedingung muss somit nicht explizit definiert werden.

Hinweis

Ein NATURAL JOIN wird automatisch als INNER JOIN umgesetzt. Möchten Sie hingegen einen OUTER JOIN als NATURAL JOIN umsetzen, sind zusätzliche Schlüsselwörter erforderlich (beispielsweise NATURAL LEFT OUTER JOIN).