MS-SQL Joins erklärt: Inner-, Outer-, Left-, Right- Join; Union
Mit Hilfe von Joins können Daten in SQL von einer oder mehrer Tabellen zusammengefügt werden. Joins werden in der Praxis oft mit anderen Abfragen (Queries) kombiniert: Zum Beispiel werden meist für die Auswahl von Daten nicht, wie hier verwendet, ein "select * from", sondern die jeweiligen Spalten ausgewählt: "select spalte1,spalte2 from", bzw. können die Joins natürlich mit "where" oder anderen Queries kombiniert oder verschachtelt werden, siehe SQL Queries.
Test-Setup Microsoft SQL Server
Zum Testen habe ich mir die kostenlose SQL Server 2019 Express Version und das SQL Management-Studio (SSMS) heruntergeladen. Zudem gibt es jetzt sogar die Möglichkeit den SQL Server auf Linux oder in einem Docker-Container zu installieren.
Ich habe 2 Tabellen in der Datenbank erstellt: Personen und Staedte. Mit der in Personen enthaltenen Spalte PLZ können wir uns die zugehörige Stadt aus der Tabelle Staedte holen.
Ich habe hier absichtlich bestimmte PLZ nicht angelegt, bzw. auch PLZ verwendet die in der Tabelle Personen nicht vorkommen, damit die Auswirkung der Joins besser ersichtlich werden.
Tabelle Personen
id | Vorname | Nachname | PLZ |
1 | Hannah | Müller | D-10115 |
2 | Mia | Huber | A-1010 |
3 | Emilia | Gruber | D-80331 |
4 | Emma | Schmidt | CH-3000 |
5 | Sophia | Weber | A-5020 |
6 | Lea | Meyer | D-22111 |
Tabelle Staedte
id | Stadt | PLZ |
1 | Berlin | D-10115 |
2 | Wien | A-1010 |
3 | Salzburg | A-5020 |
4 | Salzburg | A-5026 |
5 | München | D-80331 |
6 | Graz | A-8010 |
INNER JOIN
Ein Inner Join verbindet nur Spalten bei denen die angegebene Prüfung zutrifft, andere werden ausgelassen:
im SQL-Management-Studio: New Query:
select * from Personen INNER JOIN Staedte ON Personen.PLZ = Staedte.PLZ
und diese ausführen: Execute:
Result:
Als Ergebnis bekommen wir die Daten beider Tabellen, bei denen es einen Treffer gibt, also die PLZ sich in beiden Tabellen deckt:
id | Vorname | Nachname | PLZ | id | Stadt | PLZ |
---|---|---|---|---|---|---|
1 | Hannah | Müller | D-10115 | 1 | Berlin | D-10115 |
2 | Mia | Huber | A-1010 | 2 | Wien | A-1010 |
5 | Sophia | Weber | A-5020 | 3 | Salzburg | A-5020 |
3 | Emilia | Gruber | D-80331 | 5 | München | D-80331 |
LEFT JOIN
Ein Left-Join verwendet die erste Tabelle und verknüpft, wenn möglich, die Daten mit der 2ten Tabelle. Sollte es in der 2ten Tabelle keinen passenden Eintrag geben, wird NULL als Wert eingetragen:
select * from Personen LEFT JOIN Staedte ON Personen.PLZ = Staedte.PLZ
Result
Als Ergebnis werden bei einem Left-Join die Daten der ersten Tabelle angezeigt und falls möglich Treffer von der 2ten Tabelle:
id | Vorname | Nachname | PLZ | id | Stadt | PLZ |
---|---|---|---|---|---|---|
1 | Hannah | Müller | D-10115 | 1 | Berlin | D-10115 |
2 | Mia | Huber | A-1010 | 2 | Wien | A-1010 |
3 | Emilia | Gruber | D-80331 | 5 | München | D-80331 |
4 | Emma | Schmidt | CH-3000 | NULL | NULL | NULL |
5 | Sophia | Weber | A-5020 | 3 | Salzburg | A-5020 |
6 | Lea | Meyer | D-22111 | NULL | NULL | NULL |
RIGHT JOIN
Ein Right-Join ist ähnlich einem Left-Join verwendet aber die 2te Tabelle als Basis und sucht nach Einträgen in der 1ten. Auch hier werden die Felder mit NULL befüllt für die es keinen Treffer gibt:
select * from Personen RIGHT JOIN Staedte ON Personen.PLZ = Staedte.PLZ
Result
Als Ergebnis werden bei einem Right-Join die Daten der zweiten Tabelle angezeigt und falls möglich Treffer von der ersten Tabelle:
id | Vorname | Nachname | PLZ | id | Stadt | PLZ |
---|---|---|---|---|---|---|
1 | Hannah | Müller | D-10115 | 1 | Berlin | D-10115 |
2 | Mia | Huber | A-1010 | 2 | Wien | A-1010 |
5 | Sophia | Weber | A-5020 | 3 | Salzburg | A-5020 |
NULL | NULL | NULL | NULL | 4 | Salzburg | A-5026 |
3 | Emilia | Gruber | D-80331 | 5 | München | D-80331 |
NULL | NULL | NULL | NULL | 6 | Graz | A-8010 |
FULL JOIN (FULL OUTER JOIN)
Zu guter letzt noch der "Full-Join", oft auch als "Full Outer JOIN" bezeichnet. Hier werden alle Daten von beiden Spalten zusammengefügt, sollte es keinen Treffer geben, wird dies wieder mit "NULL" befüllt
select * from Personen FULL JOIN Staedte ON Personen.PLZ = Staedte.PLZ
Result
Als Ergebnis werden bei einem Full-Join die Daten der beider Tabelle angezeigt und falls möglich Treffer von der jeweils anderen Tabelle:
id | Vorname | Nachname | PLZ | id | Stadt | PLZ |
---|---|---|---|---|---|---|
1 | Hannah | Müller | D-10115 | 1 | Berlin | D-10115 |
2 | Mia | Huber | A-1010 | 2 | Wien | A-1010 |
3 | Emilia | Gruber | D-80331 | 5 | München | D-80331 |
4 | Emma | Schmidt | CH-3000 | NULL | NULL | NULL |
5 | Sophia | Weber | A-5020 | 3 | Salzburg | A-5020 |
6 | Lea | Meyer | D-22111 | NULL | NULL | NULL |
NULL | NULL | NULL | NULL | 4 | Salzburg | A-5026 |
NULL | NULL | NULL | NULL | 6 | Graz | A-8010 |
UNION
Mit Hilfe eines UNION können 2 Tabellen zu einer zusammengefügt werden. Dazu erstelle ich eine weitere Tabelle: Personen2 und füge dort nochmal eine Person hinzu:
Tabelle Personen2
id | Vorname | Nachname | PLZ |
---|---|---|---|
1 | Cordula | Grün | A-5020 |
Query
SELECT * FROM Personen
UNION
SELECT * FROM Personen2;
Result
Das Ergebnis eines UNION sind die Daten beider Tabellen, da die Spalten identisch sind, einfach angefügt:
id | Vorname | Nachname | PLZ |
---|---|---|---|
1 | Cordula | Grün | A-5020 |
1 | Hannah | Müller | D-10115 |
2 | Mia | Huber | A-1010 |
3 | Emilia | Gruber | D-80331 |
4 | Emma | Schmidt | CH-3000 |
5 | Sophia | Weber | A-5020 |
6 | Lea | Meyer | D-22111 |
{{percentage}} % positiv
DANKE für deine Bewertung!
Fragen / Kommentare
(sortiert nach Bewertung / Datum) [alle Kommentare(neueste zuerst)]
Die Tabelle PLZ muß wohl Staedte heißen, wie sonst sollte ein Personen IRGENDEIN JOIN Staedte denn funktionieren
Natürlich, danke habe ich ausgebessert.
Beitrag erstellt von Bernhard
"Ein Inner Join verbindet nur Spalten die in beiden Tabellen vorkommen, andere werden ausgelassen:" Das ist etwas verwirrend. Es werden ja alle Spalten angezeigt bei einem Inner Join, nur die Tupel, die die Bedinung nicht erfüllen werden ausgelassen. Bin komplette Anfängerin und daher kann ich falsch liegen, aber deine Aussage und die fertige Tabelle sind widersprüchlich. LG
danke für den Hinweis: Ich habe die Formulierung etwas angepasst.
Beitrag erstellt von Bernhard