CodeGym /Kurse /SQL SELF /Vollständiges Zusammenführen von Daten mit FULL OUTER JOI...

Vollständiges Zusammenführen von Daten mit FULL OUTER JOIN

SQL SELF
Level 11 , Lektion 4
Verfügbar

Heute schauen wir uns die wohl demokratischste Art des Daten-Joins an – FULL OUTER JOIN. Hier kommt wirklich jeder ins Ergebnis, selbst wenn er kein passendes Gegenstück hat.

FULL OUTER JOIN ist eine Art von Join, bei dem alle Zeilen aus beiden Tabellen zurückgegeben werden. Wenn es für eine Zeile in der einen Tabelle kein passendes Gegenstück in der anderen gibt, werden die fehlenden Werte im Ergebnis mit NULL aufgefüllt. Das ist so, als würdest du alle Leute zählen, die auf zwei verschiedene Partys gekommen sind: Selbst wenn jemand nur auf einer war, taucht er trotzdem in der Liste auf.

Visuell sieht das so aus:

Tabelle A                     Tabelle B
+----+----------+             +----+----------+
| id | name     |             | id | course   |
+----+----------+             +----+----------+
| 1  | Alice    |             | 2  | Math     |
| 2  | Bob      |             | 3  | Physics  |
| 4  | Charlie  |             | 5  | History  |
+----+----------+             +----+----------+

FULL OUTER JOIN ERGEBNIS:
+----+----------+----------+
| id | name     | course   |
+----+----------+----------+
| 1  | Alice    | NULL     |
| 2  | Bob      | Math     |
| 3  | NULL     | Physics  |
| 4  | Charlie  | NULL     |
| 5  | NULL     | History  |
+----+----------+----------+

Zeilen ohne Übereinstimmung bleiben erhalten, aber die Daten für die fehlenden Spalten werden mit NULL gefüllt.

Syntax von FULL OUTER JOIN

Die Syntax ist easy, aber die Power ist groß:

SELECT
    spalten
FROM 
    tabelle1
FULL OUTER JOIN 
    tabelle2
ON tabelle1.gemeinsame_spalte = tabelle2.gemeinsame_spalte;

Der Schlüsselteil ist hier FULL OUTER JOIN, wodurch PostgreSQL alle Zeilen aus beiden Tabellen nimmt. Wenn für eine Zeile keine Übereinstimmung nach dem ON-Kriterium gefunden wird, werden die Werte durch NULL ersetzt.

Beispiele zur Verwendung

Schauen wir uns echte Beispiele mit der bekannten Datenbank university und den Tabellen students und enrollments an.

Beispiel 1: Liste aller Studenten und Kurse

Stell dir vor, wir haben zwei Tabellen:

Tabelle students:

student_id name
1 Alice
2 Bob
3 Charlie

Tabelle enrollments:

enrollment_id student_id course
101 1 Math
102 2 Physics
103 4 History

Unsere Aufgabe: Eine vollständige Liste aller Studenten und Kurse erstellen, inklusive der Studenten, die in keinem Kurs eingeschrieben sind, und Kurse ohne Studenten.

Hier der Query:

SELECT
    s.student_id, 
    s.name, 
    e.course
FROM 
    students s
FULL OUTER JOIN 
    enrollments e
ON 
    s.student_id = e.student_id;

Ergebnis:

student_id name course
1 Alice Math
2 Bob Physics
3 Charlie NULL
NULL NULL History

Wie du siehst, sind alle Studenten und alle Kurse im Ergebnis. Student Charlie ist in keinem Kurs eingeschrieben, daher ist das Feld course für ihn NULL. Und der Kurs History hat keinen Studenten, daher sind student_id und name dort NULL.

Beispiel 2: Analyse von Verkäufen und Produkten

Jetzt denken wir an einen Shop. Wir haben zwei Tabellen:

Tabelle products:

product_id name
1 Laptop
2 Smartphone
3 Printer

Tabelle sales:

sale_id product_id quantity
101 1 5
102 3 2
103 4 10

Wir wollen eine vollständige Liste aller Produkte und Verkäufe, inklusive der Produkte, die nicht verkauft wurden, und Verkäufe mit ungültigen product_ids.

Query:

SELECT
    p.product_id,
    p.name AS product_name,
    s.quantity
FROM 
    products p
FULL OUTER JOIN 
    sales s
ON 
    p.product_id = s.product_id;

Ergebnis:

product_id product_name quantity
1 Laptop 5
2 Smartphone NULL
3 Printer 2
NULL NULL 10

Hier sehen wir, dass Smartphone nicht verkauft wurde (quantity = NULL), und der Verkauf mit product_id = 4 passt zu keinem Produkt.

Praktische Aufgabe

Versuch mal, einen Query für die Tabellen departments und employees zu schreiben:

Tabelle departments:

department_id department_name
1 HR
2 IT
3 Marketing

Tabelle employees:

employee_id department_id name
101 1 Alice
102 2 Bob
103 4 Charlie

Schreib einen FULL OUTER JOIN, um eine vollständige Liste aller Abteilungen und Mitarbeiter zu bekommen. Fehlende Daten füllst du mit NULL auf.

Wie man NULL-Werte behandelt

Das Problem mit NULL-Werten ist ein unvermeidlicher Nebeneffekt von FULL OUTER JOIN. In echten Aufgaben willst du vielleicht NULL durch sinnvollere Werte ersetzen. In PostgreSQL geht das easy mit der Funktion COALESCE().

Beispiel:

SELECT
    COALESCE(s.name, 'Kein Student') AS student_name,
    COALESCE(e.course, 'Kein Kurs') AS course_name
FROM 
    students s
FULL OUTER JOIN 
    enrollments e
ON 
    s.student_id = e.student_id;

Ergebnis:

student_name course_name
Alice Math
Bob Physics
Charlie Kein Kurs
Kein Student History

Jetzt sehen wir statt NULL verständliche Werte, die Reports viel lesbarer machen.

Wann solltest du FULL OUTER JOIN verwenden?

FULL OUTER JOIN ist praktisch, wenn du alle Daten aus beiden Tabellen sehen willst, auch wenn sie nicht komplett zusammenpassen. Beispiele:

  • Reports zu Verkäufen und Produkten – um sowohl verkaufte als auch nicht verkaufte Produkte zu sehen.
  • Analyse von Studenten und Kursen – um zu checken, ob es unberücksichtigte Daten gibt.
  • Vergleich von Listen – zum Beispiel, um Unterschiede zwischen zwei Datensätzen zu finden.

Ich hoffe, diese Vorlesung hat dir einen guten Überblick über FULL OUTER JOIN gegeben. Jetzt wartet die spannende Welt der komplexeren Joins und Datenbearbeitung auf dich!

1
Umfrage/Quiz
Daten zusammenführen, Level 11, Lektion 4
Nicht verfügbar
Daten zusammenführen
Daten zusammenführen
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION