Mehrere Tabellen abfragen mit JOIN / LEFT JOIN
Beispielszenario: Im Bild sind zwei verknüpfte Tabellen zu sehen, die mit einem Fremdschlüssel verbunden sind.

Tab. “kunden” enthält ein Feld “kundeLand”. Hier wird die ID eines Landes eingetragen, die sich auf das Feld landID in der Tabelle “laender” bezieht.
Wenn man bei einer SELECT-Abfrage kundenNamen und landName im Volltext anzeigen will, muss man Daten aus beiden Tabellen holen.
Code zur Generierung dieser beiden Tabellen:
MySQL-CodeCREATE TABLE kunden (kundeID INT AUTO_INCREMENT PRIMARY KEY NOT NULL, kundeName VARCHAR(50), kundeVorname VARCHAR(50), kundeTelefon VARCHAR(50), kundeLand INT, kundeNummer INT); CREATE TABLE laender (landID INT AUTO_INCREMENT NOT NULL PRIMARY KEY, landName VARCHAR(50), landLieferstatus INT);
…mit einigen Dummy-Daten:
MySQL-CodeINSERT INTO kunden VALUES ('', 'Schmitt', 'Fritz', '030-300202', '1', '13'); INSERT INTO kunden VALUES ('', 'Müller', 'Mario', '030-220202', '1', '15'); INSERT INTO kunden VALUES ('', 'Hauser', 'Hannes', '0233-22233', '3', '11'); INSERT INTO kunden VALUES ('', 'Vogel', 'Vasili', '034-3444', '2', '16'); INSERT INTO laender VALUES ('', 'Deutschland', ''); INSERT INTO laender VALUES ('', 'Schweiz', ''); INSERT INTO laender VALUES ('', 'Frankreich', '');
Möglichkeit 1: JOIN
Syntax:
MySQL-CodeSELECT kundeID, kundeName, kundeLand, landID, landName FROM kunden JOIN laender WHERE kundeLand = landID
Wählt aus den beiden Tabellen kunden und laender (kunden JOIN laender) die angegebenen felder (kundeID, kundeName, kundeLand, landID, landName) aus und beschränkt sich auf die Fälle, wo kundeLand mit der landID übereinstimmt (WHERE kundeLand = landID).
Lässt man hier das WHERE-Statement weg, werden alle Datensätze von “kunden” mit allen Datensätzen von “laender” kombiniert, so dass bei 3 Ländern und 4 Kunden insgesamt 12 Zeilen ausgegeben werden (von denen jeweils vier dreifach ausgegeben werden – damit sind 8 redundant).
Wenn in den Tabellen Felder mit identischen Namen sind, muss angegeben werden, aus welcher Tabelle der Wert geholt wird, Syntax: tabellenname.feldname
MySQL-CodeSELECT kundeName, kunden.land, laender.land FROM kunden JOIN laender WHERE kunden.land = laender.land
Möglichkeit 2: LEFT JOIN
Ist in der Tabelle “kunden” ein Wert für kundeLand angegeben, der nicht in der Tabelle “laender” gefunden werden kann, dann wird dieser Datensatz nicht ausgegeben. Ein solcher fehlerhafter Datensatz wäre ergänzend zum SQL-Listing oben z.B.
Die landID 9 existiert nicht, also wird der Datensatz bei der obigen Abfrage nicht ausgegeben.
Mit LEFT JOIN werden alle Datensätze der linken (“left”) Tabelle ausgegeben:
MySQL-CodeSELECT kundeID, kundeName, kundeLand, landID, landName FROM kunden LEFT JOIN laender ON kundeLand = landID
Achtung: “WHERE” wird hier ersetzt durch “ON”.
