faecher:informatik:oberstufe:datenbanken:joinsii:start

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.

Link zu der Vergleichsansicht

Nächste Überarbeitung
Vorherige Überarbeitung
Nächste ÜberarbeitungBeide Seiten, nächste Überarbeitung
faecher:informatik:oberstufe:datenbanken:joinsii:start [21.10.2020 19:35] – angelegt sbelfaecher:informatik:oberstufe:datenbanken:joinsii:start [23.11.2020 21:10] – [INNER JOIN] sbel
Zeile 1: Zeile 1:
 ====== SQL - Joins II ====== ====== SQL - Joins II ======
  
 +Mit dem ''JOIN''-Statement lassen sich Werte aus mehreren Tabellen direkt kombinieren, ohne zunächst durch die Abfrage mehrerer Tabellen zunächst das Tabellenprodukt zu bilden und dieses anschliessend zu filtern.
 +
 +Es wird aloso ein einzelnes Statement an das DMBS gesendet mit dem mehrere Tabellen zugleich abgefragt und direkt verknüpft werden - das Prinzip bleibt jedoch gleich, auch beim Einsatz des JOIN Statements müssen Primär- und  Fremdschlüsselspalten angegeben werden, damit eine sinnvolle Ergebnistabelle zurückgegeben wird.
 +
 +In MySQL stehen vier JOIN-Typen zur Verfügung: LEFT JOIN, RIGHT JOIN, INNER JOIN und FULL JOIN.
 +
 +===== LEFT JOIN =====
 +
 +Die Syntax für einen LEFT JOIN ist wie folgt:
 +<code sql>
 +SELECT * FROM tabelle1
 +LEFT JOIN tabelle2 ON tabelle1.SpaltennameA = tabelle2.Spaltenname
 +LEFT JOIN tabelle3 ON tabelle1.SpaltennameB = tabelle3.Spaltenname
 +WHERE ...
 +</code>
 +
 +LEFT JOIN bedeutet nun, dass stets alle Zeilen der Tabelle zurückgegeben, die beim FROM aufgeführt sind - als gewissermaßen "links" stehen. Diese Tabelle stellt die Basis für das Ergebnis dar. 
 +
 +Es kann jetzt aber sein, dass in der Tabelle die per LEFT JOIN verknüpft wird kein passender Eintrag gefunden wird, 
 +es gibt also keinen Datensatz in den beiden Tabellen, bei denen ''tabelle1.SpaltennameA = tabelle2.Spaltenname'' ist. In diesem Fall erhalten diese Felder den NULL Wert, die Datenfelder der Ausgangstabelle werden aber auf jeden Fall ausgegeben.
 +
 +==== Beispiel: ====
 +<code sql>
 +SELECT * FROM lehrer LEFT JOIN schueler ON lehrer.id=schueler.KLID 
 +</code>
 +
 +{{ :faecher:informatik:oberstufe:datenbanken:joinsii:leftjoin01.png |}}
 +
 +Es werden also die Lehrer zusammen mit den Schülern ausgegeben, die sie unterrichten. Weil als Selektor ''*'' angegeben war, werden alle Felder beider Tabellen, bei denen die Join-Bedingung erfüllt ist ausgegeben - das wird man meist nicht wollen, s.u. Emmi Nöther hat keine Schüler, da es sich jedoch um einen Left Join handelt, wird ihr Datensatz dennoch ausgegeben und die fehlenden Schüler:innen durch NULL-Felder ersetzt.
 +
 +Natürlich kann man nun wie immer selektieren, welche Felder ausgegeben werden sollen, mit einer WHERE-Clause bestimmte Datensätze herausfiltern oder die Ergebnisse sortieren:
 +
 +<code sql>
 +SELECT lehrer.name,lehrer.vorname, schueler.name, schueler.vorname 
 +FROM lehrer 
 +LEFT JOIN schueler ON lehrer.id=schueler.KLID 
 +ORDER BY lehrer.name ASC 
 +</code>
 +
 +{{ :faecher:informatik:oberstufe:datenbanken:joinsii:leftjoin02.png |}}
 +
 +<code sql>
 +SELECT lehrer.name,lehrer.vorname, schueler.name, schueler.vorname 
 +FROM lehrer 
 +LEFT JOIN schueler ON lehrer.id=schueler.KLID 
 +WHERE lehrer.name LIKE "%t%"
 +ORDER BY lehrer.name ASC
 +</code>
 +
 +{{ :faecher:informatik:oberstufe:datenbanken:joinsii:leftjoin02a.png |}}
 +
 +Hier kann man auch nochmal schön demonstrieren, wie man mit der Benennung von Feldern mittels ''AS'' die Lesbarkeit der Statements verbessern kann:
 +
 +<code sql>
 +SELECT lehrer.name  AS Lname,lehrer.vorname AS LVname, schueler.name AS SName, schueler.vorname AS SVname 
 +FROM lehrer 
 +LEFT JOIN schueler ON lehrer.id=schueler.KLID 
 +ORDER BY lehrer.name ASC 
 +</code>
 +
 +{{ :faecher:informatik:oberstufe:datenbanken:joinsii:leftjoin03.png |}}
 +
 +===== Weitere Join-Statements =====
 +
 +==== RIGHT JOIN ====
 +
 +
 +Die Syntax von RIGHT JOIN entspricht der von LEFT JOIN. Der Unterschied ist, dass hier die Tabelle die im JOIN hinzugefügt wird als Basis für die Datensätze dient - gibt es keine Treffer, werden die Felder der mit FROM selektierten Tabelle mit NULL-Werten gefüllt:
 +<code sql>
 +SELECT * FROM lehrer RIGHT JOIN schueler ON lehrer.id=schueler.KLID 
 +</code>
 +
 +{{ :faecher:informatik:oberstufe:datenbanken:joinsii:rightj01.png |}}
 +
 +"Kartoffelchips" und "Schokocreme" haben keinen Klassenlehrer, diese werden mit NULL aufgefüllt.
 +
 +==== INNER JOIN ====
 +
 +Bei einem INNER JOIN muss eine passende Zeile in den Tabellen gefunden werden, Datebnsätze, die die JOIN-Bedingung nicht erfüllen werden nicht zurückgegeben.
 +
 +<code sql>
 +SELECT * FROM lehrer INNER JOIN schueler ON lehrer.id=schueler.KLID 
 +</code>
 +
 +{{ :faecher:informatik:oberstufe:datenbanken:joinsii:innerj.png |}}
  • faecher/informatik/oberstufe/datenbanken/joinsii/start.txt
  • Zuletzt geändert: 16.11.2023 11:48
  • von Svenja Müller