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?
NULLdurch verständliche Werte ersetzen mitCOALESCE()
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?
- 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.
- Zählen mit
NULLim Hinterkopf: Beispiel mitCOUNT
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;
- 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.
- Nutze
INNER JOIN, wenn du sicher bist, dass es keineNULLgibt
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.
GO TO FULL VERSION