Hier im Forum bekommt ihr bei euren fragen schnelle hilfe.Hier geht es rund um das Web SeitenProgrammieren.Alles rund ums Javascript,Html,Php,Css und Sql.Auf fast allen Fragen haben wir eine Antwort.
Der Soforthilfe-chat verspricht das ,was sein Name sagt. Hier sind Leute Online die sofort ihre hilfe anbieten.Seht in der OnlineListe nach und wenn einer Online ist werdet ihr auch antwort bekommen. Admine ,Moderatoren und Helfer sind unsere Spezialisten in Sachen Web Programierung
71 Unwetterwarnungen in Deutschland
Die Datenbank wurde zuletzt am 02.08.2020 17:34:28 aktualiesiert
71

MySQL-Abfragen über mehrere Tabellen (JOINs)

MySQL-Dump "kunden-einfach.sql"

Damit Sie die Beispiele in den Folien und im Video-Tutorial nachvollziehen können, laden Sie sich diesen MySQL-Dump herunter: kunden-einfach.sql, öffnen Sie ihn in der Workbench (File -> Open SQL Script …) und lassen ihn laufen. Es wird eine Datenbank "Kunden" angelegt, die zwei Tabellen ("orte" und "kunden") enthält.

Daten aus zwei Tabellen abfragen

Beispielszenario: Im Bild sind zwei verknüpfte Tabellen zu sehen, die mit einem Fremdschlüssel verbunden sind. Überlegen Sie sich, welches die Primärschlüssel sind und welches der Fremdschlüssel.

Zwei Tabellen

Lösung:
kunden( kundeID, kundeName, kundeVorname, kundeTelefon, ?kundeLand, kundeNummer)
laender( landID, landName, landLieferstatus)

Primärschlüssel sind also kundeID und landID (erkennbar an der Unterstreichung), Fremdschlüssel ist kundeLand in der Tabelle kunden (erkennbar an dem Pfeil vor kundeLand). Der Fremdschlüssel kundeLand verweist auf den Primärschlüssel der Tabelle laender.

Tab. “kunden” enthält also 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-Code
  CREATE 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-Code
  INSERT 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/LEFT JOIN

Syntax:

MySQL-Code
  SELECT 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).

Dieses sinnlose Ergebnis nennt man das Kartesische Produkt. Überprüfen Sie Ihre Abfrageergebnisse immer daraufhin, ob Sie Ihren Abfrageergebnissen durch korrekte Einschränkungen Sinn gegeben haben.

Wenn in den Tabellen Felder mit identischen Namen sind, muss angegeben werden, aus welcher Tabelle der Wert geholt wird, Syntax: tabellenname.feldname

MySQL-Code
  SELECT kundeName, kunden.land, laender.land FROM kunden JOIN laender WHERE kunden.land = laender.land  

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.

MySQL-Code
  INSERT INTO kunden VALUES ('', 'Supermann', 'Sabine', '034-233444', '9', '11');  

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-Code
  SELECT kundeID, kundeName, kundeLand, landID, landName FROM kunden LEFT JOIN laender ON kundeLand = landID  

Achtung: “WHERE” wird hier ersetzt durch “ON”.

Möglichkeit 2: Implizite Schreibweise

Statt explizit JOIN zu schreiben, können wir die abzufragenden Tabellen auch einfach mit Kommas trennen:

MySQL-Code
  SELECT * FROM ort, kunde  

Übrigens entspricht INNER JOIN exakt JOIN. Man spricht von syntaktischem Zucker (syntactic sugar).