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.
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.
Domain kaufen
Registrieren Sie Ihre perfekte Domain - Inklusive Wildcard-SSL-Zertifikat
- Inklusive Domain Lock
- Inklusive 2 GB E-Mail-Postfach
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
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
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.
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.
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.
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“
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:
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“
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.
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.
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).