CodeGym /Kurse /SQL SELF /Arbeiten mit NULL-Werten beim Joinen von Da...

Arbeiten mit NULL-Werten beim Joinen von Daten

SQL SELF
Level 12 , Lektion 0
Verfügbar

Stell dir vor, du verbindest zwei Tabellen: students (Studenten) und enrollments (Kursanmeldungen). Wenn es in der Tabelle enrollments keine Infos zu einem bestimmten Studenten gibt, aber du z.B. einen LEFT JOIN verwendest, tauchen die Zeilen aus students trotzdem auf, aber die Infos aus enrollments fehlen. In solchen Fällen erscheinen dann NULL-Werte statt konkreter Daten.

So sieht das ungefähr aus:

Tabelle students:

id name
1 Eva
2 Peter
3 Anna

Tabelle enrollments:

student_id course_name
1 Mathematik
1 Informatik
2 Physik

Query mit LEFT JOIN:

SELECT students.id, students.name, enrollments.course_name
FROM students
LEFT JOIN enrollments ON students.id = enrollments.student_id;

Ergebnis:

id name course_name
1 Eva Mathematik
1 Eva Informatik
2 Peter Physik
3 Anna NULL

Na, hallo NULL! Wie du siehst, für Anna, die bei keinem Kurs angemeldet ist, fehlt die Kursinfo und es wird einfach NULL angezeigt.

Wie beeinflusst NULL deine Queries?

NULL ist nicht "Null" und auch nicht der leere String, sondern kein Wert. Dieses Verhalten hat ein paar interessante (und manchmal nervige) Folgen:

Vergleiche mit NULL:

Wenn du sowas schreibst wie WHERE course_name = NULL, bekommst du keine Zeilen mit NULL zurück. Warum? Weil du mit NULL nicht direkt vergleichen kannst.

Um zu prüfen, ob etwas NULL ist, musst du spezielle Operatoren verwenden:

WHERE course_name IS NULL

Mathematische Operationen:

Jede Operation mit NULL ergibt wieder NULL. Zum Beispiel:

SELECT 5 + NULL; -- Ergebnis: NULL

Aggregatfunktionen:

Die meisten Aggregatfunktionen wie SUM(), AVG() ignorieren NULL, aber COUNT(*) zählt sie als "existierende Zeilen".

Wie gehst du mit NULL um?

  1. NULL durch verständliche Werte ersetzen mit COALESCE()

Mit der Funktion COALESCE() kannst du NULL durch einen anderen Wert ersetzen. Zum Beispiel, wenn ein Kurs fehlt, kannst du "Kein Kurs" angeben:

SELECT
    students.id, 
    students.name, 
    COALESCE(enrollments.course_name, 'Kein Kurs') AS course_name
FROM 
    students LEFT JOIN enrollments 
    ON students.id = enrollments.student_id;

Ergebnis:

id name course_name
1 Eva Mathematik
1 Eva Informatik
2 Peter Physik
3 Anna Kein Kurs

Sieht jetzt schon viel besser aus, oder?

  1. Filtern von NULL-Werten

Wenn du keine Zeilen mit NULL sehen willst, kannst du die Bedingung WHERE ... IS NOT NULL verwenden. Zum Beispiel:

SELECT
    students.id, 
    students.name, 
    enrollments.course_name
FROM 
    students LEFT JOIN enrollments 
    ON students.id = enrollments.student_id
WHERE 
    enrollments.course_name IS NOT NULL;

Ergebnis:

id name course_name
1 Eva Mathematik
1 Eva Informatik
2 Peter Physik

Anna verschwindet aus dem Ergebnis, weil sie keine Kursanmeldungen hat.

  1. Zählen mit NULL im Hinterkopf: Beispiel mit COUNT

Wie schon erwähnt, ignorieren manche Funktionen NULL, andere nicht. Zum Beispiel:

Um alle Zeilen zu zählen, auch die mit NULL:

SELECT COUNT(*) FROM students; -- Zählt ALLE Zeilen (auch die, wo `course_name` = NULL)

Um nur die Zeilen zu zählen, wo kein NULL ist:

SELECT COUNT(course_name) FROM enrollments;
  1. Bedingte Ausdrücke mit CASE

Wenn dir COALESCE() nicht gefällt oder du mehr Flexibilität willst, probier mal CASE aus. Zum Beispiel:

SELECT
    students.id, 
    students.name,
    CASE
        WHEN enrollments.course_name IS NULL THEN 'Kein Kurs'
        ELSE enrollments.course_name
    END AS course_name
FROM 
    students LEFT JOIN enrollments 
    ON students.id = enrollments.student_id;

Das Ergebnis ist das gleiche wie bei COALESCE(), aber mit CASE kannst du noch komplexere Regeln bauen.

  1. Nutze INNER JOIN, wenn du sicher bist, dass es keine NULL gibt

Der radikalste Weg, NULL zu vermeiden: Lass sie gar nicht erst entstehen, indem du INNER JOIN verwendest. Dieser Join-Typ gibt nur Zeilen zurück, die in beiden Tabellen ein Match haben:

SELECT
    students.id, 
    students.name, 
    enrollments.course_name
FROM 
    students INNER JOIN enrollments 
    ON students.id = enrollments.student_id;

Keine Überraschungen – nur Studenten, die auch wirklich bei Kursen angemeldet sind.

Ergebnis:

id name course_name
1 Eva Mathematik
1 Eva Informatik
2 Peter Physik

Wenn du alle Daten brauchst, auch die mit NULL, ist INNER JOIN nichts für dich – aber manchmal reicht das völlig aus.

Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION