Thesenpapier zum Thema MySQL: das Kommando JOIN zur Tabellenverknüpfung
Referenten: Worawran Nitirojntanad, Lin Gan
1. Definition des JOINS
Als JOIN (Deutsch: Verbund oder Verbindung) wird ein Kommando bezeichnet, das zur Verknüpfung der Datensätze zweier oder mehrerer Tabellen unter den angegebenen Kriterien dient.
Im MySQL gliedern sich die JOINS in die folgenden Varianten:
- INNER JOIN
- LEFT/RIGHT JOIN
- FULL OUTER JOIN
- „Self Join“
Als Beispiele für die einzelnen JOIN-Varianten werden die Tabellen `panhupl_tokens` und `pos_penn` in der Datenbank des DHVLabs (2018) verwendet:
Abbildung 1: die Tabelle `panhupl_tokens`
Abbildung 2: die Tabelle `pos_penn`
2. Der INNER JOIN
Der INNER JOIN stützt sich auf der Bildung des Kreuzprodukts bzw. kartesischen Produkts der Datensätze in den verknüpften Tabellen:
Abbildung 3: Kreuzprodukt der Datensätze in den Tabellen X und Y
Mittels des Statements JOIN ohne Angabe einer Verknüpfungsbedingung werden die gesamten Datensätze der beiden Tabellen `panhupl_tokens` und `pos_penn` zusammengeführt:
SELECT * FROM `panhupl_tokens` JOIN `pos_penn`
Dadurch erfolgt der JOIN in Form eines Kreuzprodukts der Anzahl der Datensätze in den zwei verknüpften Tabellen, nämlich 51072*58. Folglich wird die Ergebnistabelle mit 2962176 Datensätzen und 12 Spalten erzielt, wobei Beziehungen zwischen den Daten nicht berücksichtigt werden:
Abbildung 4: Kombination der Tabellen `panhupl_tokens` und `pos_penn`
durch das Statement JOIN ohne Angabe einer Verknüpfungsbedingung
Mithilfe der Angabe der Verknüpfungsbedingung durch die Anweisung ON, dass die Werte in den Feldern wortart der Tabelle `panhupl_tokens` und in den Feldern pos der Tabelle `pos_penn` identisch sein müssen, können die Datensätze der zwei Tabellen sinnvoll miteinander kombiniert werden:
SELECT * FROM `panhupl_tokens` JOIN `pos_penn` ON panhupl_tokens.wortart = pos_penn.pos
Unter dieser Verknüpfungsbedingung vollzieht sich ein Vergleich aller Datensätze in den Feldern wortart und pos. Infolgedessen sind die Datensätze mit übereinstimmenden Werten in den beiden Feldern einander zugeordnet, während die ohne Entsprechungen aus dem Ergebnis des Kreuzprodukts ausgeschlossen werden:
Abbildung 5: Kombination der Tabellen `panhupl_tokens` und `pos_penn`durch das Statement JOIN
mit Angabe der Verknüpfungsbedingung panhupl_tokens.wortart = pos_penn.pos
3. Der LEFT/RIGHT JOIN
Während sich das Ergebnis des INNER JOINS ausschließlich auf die Datensätze mit Entsprechungen in den beiden angegebenen Feldern beschränkt, enthält das Ergebnis durch das Schlüsselwort LEFT die sämtlichen Datensätze der linken Tabelle unabhängig davon, ob sie eine Übereinstimmung mit den Feldern der rechten Tabelle aufweisen:
SELECT * FROM `panhupl_tokens` LEFT JOIN `pos_penn` ON panhupl_tokens.wortart = pos_penn.pos
Als Ergebnisse erscheinen hierbei alle Datensätze der linken Tabelle `panhupl_tokens`, während die nicht vorhandenen Daten aus der rechten Tabelle `pos_penn` durch 'NULL' aufgefüllt werden:
Abbildung 6: Kombination der Tabellen `panhupl_tokens` und `pos_penn` durch das Statement LEFT JOIN
Die 'NULL' bzw. die Datensätze ohne entsprechende Werte in einer der zwei Tabellen sind anschließend anhand der Bedingung „… WHERE Feld IS NULL“ auffindbar:
SELECT * FROM `panhupl_tokens` LEFT JOIN `pos_penn` ON panhupl_tokens.wortart = pos_penn.pos WHERE pos_penn.pos IS NULL
Abbildung 7: Auffinden von 'NULL' in der rechten Tabelle `pos_penn`
durch die Bedingung WHERE pos_penn.pos IS NULL
Entgegengesetzt liefert das Schlüsselwort RIGHT als Ergebnisse alle Datensätze der rechten Tabelle `pos_penn` und 'NULL' anstelle der fehlenden Werte in der linken Tabelle `panhupl_tokens`:
SELECT * FROM `panhupl_tokens` RIGHT JOIN `pos_penn` ON panhupl_tokens.wortart = pos_penn.pos
Abbildung 8: Kombination der Tabellen `panhupl_tokens` und `pos_penn` durch das Statement RIGHT JOIN
4. Der FULL OUTER JOIN
Als FULL OUTER JOIN wird die Kombination der Ergebnisse des LEFT und RIGHT JOINS verstanden. Obschon MySQL keine direkte Abfrage mit dem Statement OUTER JOIN unterstützt, lässt sich der erwähnte Vorgang durch die Kommandos UNION ALL und UNION ausführen.
Als Ergebnis liefert das Statement UNION ALL die Zusammenstellung der gesamten Datensätze der zwei Tabellen. Dabei könnte eine Duplikation vorliegen, wenn die beiden Ergebnisse über einen identischen Datensatz verfügen:
SELECT * FROM `panhupl_tokens`
LEFT JOIN pos_penn ON panhupl_tokens.wortart = pos_penn.pos
UNION ALL
SELECT * FROM `panhupl_tokens`
RIGHT JOIN pos_penn ON panhupl_tokens.wortart = pos_penn.pos
Abbildung 9: Kombination der Ergebnisse des LEFT und RIGHT JOINS durch das Kommando UNION ALL
Vergleichsweise werden mit dem Statement UNION alle doppelten Datensätze entfernt, so dass in der Ergebnistabelle keine duplizierten Werte vorkommen. Dies führt dennoch zu einer längeren Dauer der Ergebnisabfrage als bei dem UNION ALL:
SELECT * FROM `panhupl_tokens` LEFT JOIN pos_penn ON panhupl_tokens.wortart = pos_penn.pos UNION SELECT * FROM `panhupl_tokens RIGHT JOIN pos_penn ON panhupl_tokens.wortart = pos_penn.pos
Abbildung 10: Kombination der Ergebnisse des LEFT und RIGHT JOINS durch das Kommando UNION
5. Der „Self Join“
Der „Self-Join“ bezieht sich auf die vielfache Verknüpfung einer Tabelle mit sich selbst. Diese Variante des JOINS ermöglicht eine horizontale Sequenzierung der Datensätze in derselben Tabelle, welche für die Analyse der Datensequenzen in der Korpuslinguistik nützlich ist.
Beim dreifachen Verbund der Tabelle `panhupl_tokens` mit sich selbst werden zunächst die originale Tabelle als a und ihre Duplikationen als b und c definiert. Unter der Verknüpfungsbedingung, dass sich sowohl der Wert in den Feldern a.id und b.id als auch der Wert in den Feldern b.id und c.id um den Wert 1 voneinander unterscheiden müssen, werden die aufeinander folgenden Datensätze aus diesen drei Feldern auf eine neue Zeile gereiht:
SELECT a.id, a.token, b.token, c.token FROM `panhupl_tokens` AS a JOIN `panhupl_tokens` AS b ON a.id = b.id -1 JOIN `panhupl_tokens` AS c ON b.id = c.id -1 ORDER BY a.id
Abbildung 11: dreifache Kombination der Tabelle `panhupl_tokens` („Self Join“)
6. Literatur
DHVLab (2018): Datenrepositorium. [https://dhvlab.gwi.uni-muenchen.de/sql/].
München: IT-Gruppe Geisteswissenschaften der LMU.
Lücke, Stephan/Riepl, Christian/Trautmann Caroline (2017): Softwaretools und Methoden für die korpuslinguistische Praxis. Korpus im Text [Online], 1. http://www.kit.gwi.uni-muenchen.de/pdf/band/001/korpus-im-text_band_001_v001.pdf [Stand: 10.01.2020]
SELFHTML (2008): Datenbank/Einführung in Joins. https://wiki.selfhtml.org/wiki/Datenbank/Einf%c3%bchrung_in_Joins [Stand: 11.01.2020]
Bibliographie
- Lücke u.a. 2017a = Lücke, Stephan / Riepl, Christian / Trautmann, Caroline (2017): Korpus im Text. Softwaretools und Methoden für die korpuslinguistische Praxis, vol. 1, München, Universitätsbibliothek der LMU, LMU/ITG [Open-Access-Version; ISBN: 978-3-95896-016-9 (elektronische Version)] (Link).