Der einzige Unterschied zum NATURAL JOIN ist, dass beim INNER JOIN die Spalten, die auf gleiche Werte überprüft werden sollen, von Dir angegeben werden. So ist es erstens kein Problem, wenn die zu verknüpfenden Spalten nicht denselben Namen haben, und zweitens werden so unbeabsichtigte Verbindungen anderer gleichnamiger Spalten verhindert. Das Ergebnis der Abfrage ist die Schnittmenge der gejointen Tabellen.
Der INNER JOIN wird gebildet, indem man in der FROM-Klausel a INNER JOIN b ON a.Attribut = b.Attribut einfügt. Das Wort Attribut ist ein Synonym für Spalte. Optional kann man nun die WHERE-Klausel nutzen, um weitere Bedingungen hinzuzufügen. Schematisch sieht die INNER JOIN-Syntax folgendermaßen aus:
SELECT * FROM a
INNER JOIN b
ON a.Attribut = b.Attribut
WHERE irgendwas;
Wir möchten die customer- und die address-Tabelle mithilfe eines INNER JOIN verbinden.
SELECT customer.first_name,
customer.last_name, address.address_id, address.address,
address.city_id
FROM customer
INNER JOIN address ON customer.address_id = address.address_id;
Ergebnis (Ausschnitt):
first_name |
last_name |
address_id |
address |
city_id |
---|---|---|---|---|
Mary |
Smith |
5 |
1913 Hanoi Way |
463 |
Patricia |
Johnson |
6 |
1121 Loja Avenue |
449 |
Linda |
Williams |
7 |
692 Joliet Street |
38 |
Barbara |
Jones |
8 |
1566 Inegl Manor |
349 |
Der "Doppel-Join" wird zunächst genau so wie der vorherige Join gebildet, jedoch werden anstatt von zweien drei Tabellen verwendet.
Wie Du in der vorherigen Lektion erfahren hast, kann man in einem einzigen JOIN-Statement bis zu 61 Tabellen miteinander verbinden.
Um den "doppelten" INNER JOIN zu bilden, verwenden wir zunächst die Struktur aus der Einführung, erweitern diese jedoch folgendermaßen: Wir hängen an das Ende einfach ein weiteres INNER JOIN c ON c.Attribut = b.Attribut an.
Natürlich hätte das ON-Statement auch so aussehen können: a.Attribut = c.Attribut.
Wollen wir c sowohl mit a als auch mit b verbinden, so verbinden wir obrige ON-Statements mit einem AND: ... ON b.Attribut = b.Attribut AND c.Attribut = c.Attribut.
Noch einmal übersichtlich dargestellt:
SELECT * FROM a
INNER JOIN b
ON a.Attribut = b.Attribut
INNER JOIN c
ON b.Attribut = c.Attribut |
ON a.Attribut = c.Attribut |
ON b.Attribut = c.Attribut AND a.Attribut = c.Attribut
[WHERE | AND {irgendwas}];
Die Pipe (|) bedeutet "oder" wird jedoch in MySQL nicht als solches verwendet — wie Du Dich sicher erinnern wirst, gibt es dazu das OR — dient jedoch in diesem Sachzusammenhang immer dem Aufzeigen von verschiedenen Möglichkeiten. Mehr dazu findest Du hier.
Wir erweitern unseren Join aus dem vorherigen Beispiel (Beispiel 1), indem wir noch die city-Tabelle hinzufügen.
SELECT customer.first_name,
customer.last_name, address.address_id, address.address,
city.city_id, city.city, city.country_id
FROM customer
INNER JOIN address ON
customer.address_id = address.address_id
INNER JOIN city ON address.city_id = city.city_id;
Ergebnis (Ausschnitt):
first_name |
last_name |
address_id |
address |
city_id |
city |
country_id |
---|---|---|---|---|---|---|
Mary |
Smith |
5 |
1913 Hanoi Way |
463 |
Sasebo |
50 |
Patricia |
Johnson |
6 |
1121 Loja Avenue |
449 |
San Bernadino |
103 |
Linda |
Williams |
7 |
692 Joliet Street |
38 |
Athenai |
39 |
Barbara |
Jones |
8 |
1566 Inegl Manor |
349 |
Myingyan |
64 |
Benutze in Deiner Abfrage statt "INNER JOIN" nur "JOIN"! In mariaDB ist JOIN der Standardausdruck für INNER JOIN.
Richte Dich jedoch in Klausuren nach den Vorgaben des Lehrkörpers!