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

 

positive Bewertung({{pro_count}})
Beitrag bewerten:
{{percentage}} % positiv
negative Bewertung({{con_count}})

DANKE für deine Bewertung!

Fragen / Kommentare


(sortiert nach Bewertung / Datum) [alle Kommentare(neueste zuerst)]

✍anonym
21.03.2021 10:31
Vielen Dank für den Ohrwurm ab UNION :D

✍anonym
08.03.2021 10:16
Die Tabelle PLZ muß wohl Staedte heißen, wie sonst sollte ein Personen IRGENDEIN JOIN Staedte denn funktionieren
✍Bernhard
gepostet am 08.03.2021 10:40
Natürlich, danke habe ich ausgebessert.

Beitrag erstellt von Bernhard

✍anonym
12.03.2022 14:21
"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
✍Bernhard
gepostet am 12.03.2022 15:05
danke für den Hinweis: Ich habe die Formulierung etwas angepasst.

Beitrag erstellt von Bernhard