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!

Aktualisiert: 02.05.2022 von Bernhard | Translation English |ūüĒĒ

‚ě® MS-SQL Queries | ‚ě¶ System | enableLUA: Windows Script -Benutzerkontensteuerung ‚ě®

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