Was ist eine SQL Join und wie funktioniert dieser?
Inner, Left, Right Join … ??
Ich erkläre Dir in diesem Tutorial, wie einfach ein Join ist und was für „bessere“ Alternativen Du kennen solltest.
Beginnen wir!
Grundlagen zu SQL Join
Mit diesem Grundlagen-Wissen verstehst Du die Typen von Joins besser im Praxis-Teil besser und schneller.
Was ist ein SQL Join?
Ein Join führt inhaltlich verknüpfte Zeilen aus zwei Tabellen zusammen.
Die Verknüpfung der Zeilen funktioniert über Primär- und Fremdschlüssel, die wie ein HTTP-Link aufeinander zeigen.
Primärschlüssel sind nur einmalig in der Tabelle vorhanden, während Fremdschlüssel mehrfach auf eine Zeile in einer anderen Tabelle verweisen können.
Beispiel: 2 Tabellen mit Join verbinden
- Tabelle: Produkt-Name mit einer Kategorie-Nummer als Fremdschlüssel
- Tabelle: Kategorie-Namen mit einer Kategorie-Nummer als Primärschlüssel
Bei der Zusammenführung von der Tabelle 1 und 2 erhält jedes Produkt neben der Kategorie-Nummer den Klartext der Kategorie.
Wann verwende ich einen SQL Join?
Wenn Du versuchst aus mehreren normalisierten Tabellen menschlich lesbare Informationen zu gewinnen und Du Dir nicht nur Indizes ansehen willst, brauchst Du einen Join.
Praxis: Typen von SQL Join erklärt
- Inner Join ist die Schnittmenge aus der Tabelle 1 und der Tabelle 2
- Einen X-fachen Join brauchst Du, um mehrere Tabellen zu verbinden (mehrere Join-Typen und Verwendungen notwendig)
- Ein Left Join besteht aus allen Reihen aus der linken Tabelle mit den angefügten Spalten aus der rechten. Einige Reihen aus der linken Tabelle können keinen Partner haben (NULL)
- Ein Right Join besteht aus allen Reihen aus der rechten Tabelle mit angefügten Spalten aus der linken. Einige Reihen aus der rechten Tabelle können keinen Partner haben (NULL)
- Ein Full Other Join besteht aus allen Reihen aus der linken und der rechten Tabelle. Linke und rechte Reihen können keinen Partner haben (NULL)
- Beim Self Join verbindest Du eine Tabelle mit der gleichen Tabelle (unten erklärt)
Beispiel für die SQL-Befehele
Als Beispiel habe ich ein Lagerverwaltungstool verwendet.
Hier kannst Du die SQL herunterladen.
product_id | product_name | category_id_fk | warehouse_id_fk |
0 | Monitor X500 USB C | 1 | 2 |
1 | Drohne 16K M100 | 2 | 2 |
2 | Phone SuperSlim100 | 3 | 3 |
category_id | category_name |
1 | Monitore |
2 | Fluggeräte |
3 | Smartphones |
4 | Kaffeemaschinen |
warehouse_id | warehouse_name |
1 | Außenlager |
2 | Sicherheitslager |
3 | Hochstapellager |
4 | Tresorraum |
Inner Join
In welchen Lagern liegt, welches Produkt?
Ein Inner Join kann Dir helfen. Die Ergebnis-Tabelle zeigt keine Produkte, die in keinem Lager liegen (out of stock), und keine Lager die leer sind
SELECT products.product_name, categories.category_name
FROM products
INNER JOIN categories ON products.category_id_fk = categories.category_id
Ergebnis: Alle Produkte mit Kategorie-Namen in Klartext
product_name | category_name |
Monitor X500 USB C | Monitore |
Drohne 16K M100 | Fluggeräte |
Phone SuperSlim100 | Smartphones |
BestPhone 1000 | Smartphones |
Join mehrfach
Wenn Du noch das Warehouse hinzufügen willst, verwende den Inner Join zweifach:
SELECT products.product_name, categories.category_name, warehouse.warehouse_name
FROM products
INNER JOIN categories ON products.category_id_fk = categories.category_id
INNER JOIN warehouse ON products.warehouse_id_fk = warehouse.warehouse_id
Ergebnis: Du erhältst eine Übersicht über Produkte mit ihrer Kategorie-Bezeichnung und dem Lagerort.
product_name | category_name | warehouse_name |
Monitor X500 USB C | Monitore | Sicherheitslager |
Drohne 16K M100 | Fluggeräte | Sicherheitslager |
Phone SuperSlim100 | Smartphones | Hochstapellager |
BestPhone 1000 | Smartphones | Sicherheitslager |
Left Join
Du willst nur alle Produkte anzeigen? Leere Kategorien interessieren Dich nicht`? Mit dem Left Join schneidest Du den Rest ab.
SELECT products.product_name, categories.category_name
FROM products
LEFT JOIN categories ON products.category_id_fk = categories.category_id
Ergebnis: Jedes Produkt ist eine Kategorie zu geordnet.
product_name | category_name |
Monitor X500 USB C | Monitore |
Drohne 16K M100 | Fluggeräte |
Phone SuperSlim100 | Smartphones |
BestPhone 1000 | Smartphones |
Right Join
Lasse Dir alle Kategorien anzeigen, wenn kein Produkt der Kategorie zugeordnet ist. NULL beschreibt ein leeres Feld.
SELECT products.product_name, categories.category_name
FROM products
RIGHT JOIN categories ON products.category_id_fk = categories.category_id
Ergebnis: Im Bereich Kaffeemaschienen gibt es im Lager keine Produkte.
product_name | category_name |
Monitor X500 USB C | Monitore |
Drohne 16K M100 | Fluggeräte |
Phone SuperSlim100 | Smartphones |
BestPhone 1000 | Smartphones |
NULL | Kaffeemaschinen |
Full Other Join
Du brauchst alle Daten aus beiden Tabellen? Nutze den Full Other Join!
MySQL stellt keinen Kurzbegriff für den Full Other Join zur Verfügung.
Du erzeugst diesen Join mit einer Vereinigung der Tabellen aus einem Right Join und Left Join. Bei einer Vereinigung fügt die Datenbank alle Tabellenzeilen zusammen und sortiert die doppelten Zeilen heraus.
SELECT products.product_name, categories.category_name
FROM products
RIGHT JOIN categories ON products.category_id_fk = categories.category_id
UNION
SELECT products.product_name, categories.category_name
FROM products
LEFT JOIN categories ON products.category_id_fk = categories.category_id
Ergebnis: Weil jedes Produkt eine Kategorie hat, steht in der category_name
Spalte keine NULL. Über Constraints kannst Du vermeiden, dass ein Sachbearbeiter-Depp ein Produkt ohne Kategorie anlegt.
product_name | category_name |
Monitor X500 USB C | Monitore |
Drohne 16K M100 | Fluggeräte |
Phone SuperSlim100 | Smartphones |
BestPhone 1000 | Smartphones |
NULL | Kaffeemaschinen |
Self Join
Vergesse nicht, dass Du eine Tabelle mit sich selbst verbinden lassen kannst. Bei Hierarchien ist die ID
, die ID
auf den Chef verweist. Nur der CEO ist nach der Logik von SQL sich selbst sein Chef J
ID | Name | BossID |
0 | CEO Gründer Gründer | 0 |
1 | Mr. Abteilungsleiter Schlau | 0 |
2 | Mrs. Mitarbeiterin | 1 |
Ergebnis: Ein Self Join bewikt eine Selbstverknüpfung:
ID | Name | BossID | NameBoss | BossIDvonBoss |
0 | CEO Gründer Gründer | 0 | CEO Gründer Gründer | 0 |
1 | Mr. Abteilungsleiter Schlau | 0 | CEO Gründer Gründer | 0 |
2 | Mrs. Mitarbeiterin | 1 | Mr. Abteilungsleiter Schlau | 1 |
Mehrere Self Joins ermöglichen die Suche nach dem X-ten Vorgesetzten.
Praxis-Performance beim SQL Join
Hast Du einen Join mit großen Tabellen (+ 10.000 Zeilen) versucht? In der Uni / Schule lernst Du brav den Join – in der Praxis (bei großen Datenmengen) ist dieser großer Mist …
Join schneller ausführen
Die Ausführung eines Joins ist sehr Prozessor- und RAM-lastig. Ein SAP-System kann ca. 60.000 Tabellen haben und bei manchen Konten 100.000 Zeilen haben. Entweder Du…
- … käufst Dir eine stärkere Maschine (RAM, CPU)
- … beschränkst die Daten Deines Joins
- … verwendest Krücken wie einem Material Views oder ähnliches
- … optimierst die Join-Abfrage mit speziellen Regeln
- … oder vermeidest den Join und machst die Abfragen gleich korrekt
Big Data und Join? NoSQL ist die Lösung!
Bei großen Datenmengen und vielen Tabellen solltest Du auf NoSQL umsteigen. NoSQL speichert Datensätze nicht in Tabellen, sondern in Dokumenten wie JSONs.
„Moderne Unternehmen“ verwenden …
- Apache Hadoop nach Googles Big Table (für Petabytes an Daten)
- Apache Cassandra mit hoher Ausfallsicherheit
- CouchDB mit eigener HTTP-Schnittstelle
- MongoDB mit BSON
Du hast keine vorgegebenen Spaltenbezeichnungen, sondern Indizes, die über alle Dokumente hinweg die Daten dursuchbar machen.
Rechnerarchitektur für schnelle SQL Joins
Eine einzelne Maschine zu kaufen ist voll 80er Jahre.
Selbst mit eienr NoSQL brauchst Du viel Rechenpower. Miete Dir in einem hochmodernen Cluster mehr Systemressourcen an, wenn Du diese für die Ausführung brauchst.