CodeGym /Kurse /SQL SELF /Typische Fehler im Umgang mit NULL

Typische Fehler im Umgang mit NULL

SQL SELF
Level 10 , Lektion 4
Verfügbar

In dieser Vorlesung lernen wir unseren mysteriösen Bekannten NULL noch besser kennen. Klar, deine eigenen Fehler im Umgang damit kommen noch, aber... vorbereitet ist halb gewonnen. Lass uns ein paar typische Fehler anschauen, die mit NULL zusammenhängen.

Fehler 1: Den normalen Operator = für den Vergleich mit NULL benutzen

Wahrscheinlich der beliebteste Fehler unter SQL-Anfängern: Der Versuch, mit dem Operator = zu prüfen, ob ein Wert NULL ist.

Was passiert?

SELECT *
FROM students
WHERE age = NULL;

Wenn du naiv denkst, dass das alle Studenten mit unbekanntem Alter zeigt, wirst du enttäuscht: Diese Abfrage gibt gar nichts zurück. Warum? Weil NULL kein Wert ist und normale Vergleichsoperatoren damit nicht funktionieren. Wie es im magischen SQL-Buch steht: "NULL kann man nicht direkt vergleichen".

Wie sollte es sein?

Um zu prüfen, ob ein Wert NULL ist, benutze IS NULL:

SELECT *
FROM students
WHERE age IS NULL;

Jetzt bekommst du alle Studenten, deren Alter nicht angegeben ist.

Fehler 2: Aggregatfunktionen ignorieren NULL (außer COUNT(*))

Wenn du Abfragen mit Aggregatfunktionen machst, wird NULL automatisch aus den Berechnungen rausgeschmissen. Das kann zu unerwarteten Ergebnissen führen.

Was passiert?

SELECT AVG(salary) AS avg_salary
FROM employees;

Wenn es in der Spalte salary NULL gibt, werden diese Zeilen einfach ignoriert und das Durchschnittsgehalt wird ohne diese Einträge berechnet. Das kann ein falsches Bild vom Durchschnittsgehalt geben.

Wie kann man das vermeiden?

Bevor du aggregierst, stell sicher, dass du NULL korrekt durch einen Standardwert ersetzt. Zum Beispiel mit COALESCE():

SELECT AVG(COALESCE(salary, 0)) AS avg_salary
FROM employees;

Jetzt werden NULL-Werte vor der Berechnung durch 0 ersetzt.

Fehler 3: NULL miteinander vergleichen

In der Datenbank ist NULL wirklich nichts gleich, nicht mal einem anderen NULL. Das kann überraschen.

Was passiert?

SELECT *
FROM students
WHERE NULL = NULL;

Auch diese Abfrage gibt ein leeres Ergebnis zurück. Warum? Weil SQL meint, dass das Fehlen eines Wertes nicht "gleich" dem Fehlen eines anderen sein kann. Ja, SQL ist schon ein philosophischer Brocken.

Wie sollte es sein?

Wenn du zwei NULL auf "Gleichheit" prüfen willst, benutze spezielle Konstrukte wie IS NULL. Zum Beispiel:

SELECT *
FROM students
WHERE first_name IS NULL AND last_name IS NULL;

Fehler 4: Division durch NULL

Division durch NULL ist nicht nur ein Fehler, sondern schon fast ein mathematisches Verbrechen, das SQL mit einem sinnlosen Ergebnis bestraft – NULL.

Was passiert?

SELECT 10 / NULL AS result;

Das Ergebnis? NULL. SQL weigert sich überhaupt zu verstehen, was du willst.

Wie kann man das vermeiden?

Um deine Abfragen vor solchen Missverständnissen zu schützen, benutze COALESCE() oder NULLIF():

SELECT 10 / COALESCE(divisor, 1) AS result
FROM calculations;

In dieser Abfrage wird, falls divisor NULL ist, statt durch NULL durch 1 geteilt.

Fehler 5: Nicht funktionierende logische Operatoren mit NULL

NULL zerschießt die Logik, sobald es in Ausdrücken auftaucht. Zum Beispiel gibt die Bedingung TRUE AND NULL NULL zurück, nicht TRUE oder FALSE.

Was passiert?

SELECT *
FROM students
WHERE age > 18 OR age = NULL;

Auch wenn age > 18 für manche Zeilen wahr ist, können Zeilen mit NULL in der Spalte age aus dem Ergebnis rausfliegen. Warum? Weil der Teil age = NULL NULL zurückgibt, nicht TRUE.

Wie sollte es sein?

Behandle NULL-Werte immer explizit in logischen Bedingungen:

SELECT *
FROM students
WHERE age > 18 OR age IS NULL;

Fehler 6: Unerwartetes Verhalten beim Sortieren von NULL (der "schwerste" Fehler)

Wenn du ORDER BY in einer Abfrage benutzt, kann dich das Verhalten von NULL überraschen. Standardmäßig sortiert PostgreSQL Zeilen mit NULL-Werten am Ende bei aufsteigender Sortierung und am Anfang bei absteigender Sortierung.

Was passiert?

SELECT product_name, price
FROM products
ORDER BY price;

Wenn price NULL ist, tauchen diese Zeilen am Ende der Liste auf.

Wie kann man Überraschungen vermeiden?

Du kannst die Sortierung für NULL explizit mit NULLS FIRST oder NULLS LAST angeben:

SELECT product_name, price
FROM products
ORDER BY price NULLS FIRST;

Fehler 7: Falscher Umgang mit Fremdschlüsseln und NULL

NULL-Werte in Spalten mit Fremdschlüsseln können manchmal zu unerwartetem Verhalten führen.

Was passiert?

Wenn du Fremdschlüssel zu einer Tabelle hinzugefügt hast und versuchst, eine Zeile einzufügen, wobei das Fremdschlüsselfeld leer bleibt, gibt PostgreSQL keinen Mucks von sich. Das liegt daran, dass NULL-Werte nicht auf Übereinstimmung mit der verknüpften Tabelle geprüft werden.

Wie macht man es richtig?

Benutze NOT NULL-Constraints, wenn du verhindern willst, dass NULL in solchen Feldern auftaucht. Oder merke dir einfach, dass NULL-Werte "Waisen" bleiben, die zu keiner der verknüpften Tabellen gehören.

Mehr zu verknüpften Tabellen und Fremdschlüsseln gibt's in der nächsten Vorlesung :P

1
Umfrage/Quiz
Bedingte Ausdrücke, Level 10, Lektion 4
Nicht verfügbar
Bedingte Ausdrücke
Bedingte Ausdrücke
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION