Direkt zum Hauptinhalt springen
eLearner.app
Modul 4 · Lektion 2 von 414/57 im Kurs~10 min
Lektionen des Moduls (2/4)

Umgang mit NULLs: IS NULL und COALESCE

Im employees-Datensatz ist Andrea Costa etwas Besonderes: Er hat department_id = NULL. Sie sind bereits auf NULL gestoßen (mit LEFT JOIN), aber es ist an der Zeit, es ernst zu nehmen: NULLs in SQL verhalten sich anders als alle anderen Werte, und sie zu ignorieren ist einer davon Hauptursachen für Fehler im Produktionscode.

NULL ist nicht Null, keine leere Zeichenfolge

NULL bedeutet unbekannter/fehlender Wert. Es ist nicht 0, nicht '', nicht false. Es ist „Ich weiß nicht“. Daraus folgt eine überraschende Eigenschaft: NULL ist mit nichts gleich, nicht einmal mit sich selbst.

SQL
-- All these expressions return NULL (not true!):
SELECT NULL = NULL;       -- NULL
SELECT NULL = 0;          -- NULL
SELECT NULL <> 'qualcosa'; -- NULL

Konkrete Konsequenz: WHERE column = NULL funktioniert nie. Sie müssen verwenden die dedizierten Operatoren IS NULL / IS NOT NULL:

SQL
-- Employees without a department:
SELECT first_name, last_name
FROM   employees
WHERE  department_id IS NULL;

-- Employees WITH a department:
SELECT first_name, last_name
FROM   employees
WHERE  department_id IS NOT NULL;

COALESCE – der NULL-Fallback

Oft möchten Sie etwas anstelle von NULL anzeigen, wenn die Daten vorhanden sind Es fehlt: die Zeichenfolge '(none)', Null, ein Standarddatum. Die Funktion, die genau das tut, ist COALESCE(a, b, c, ...): Es gibt den ersten zurück Nicht-NULL-Argument in der Liste.

SQL
-- Show the department_id, or 0 if missing:
SELECT first_name, last_name, COALESCE(department_id, 0) AS dept
FROM   employees;

In Kombination mit einem LEFT JOIN wird es für Berichte unglaublich leistungsfähig:

SQL
SELECT e.first_name,
       e.last_name,
       COALESCE(d.name, '(nessun dipartimento)') AS dipartimento
FROM   employees   AS e
LEFT JOIN departments AS d ON e.department_id = d.id;

Ergebnis: Alle Mitarbeiter wurden zurückgegeben, mit dem Abteilungsnamen oder einem expliziten Namen Etikett für diejenigen, die keins haben.

NULL und Aggregate

Aggregatfunktionen ignorieren NULLs (außer COUNT(*)):

  • COUNT(department_id) zählt nur die Zeilen mit einem Wert;
  • AVG(salary)-Durchschnitte ignorieren NULLs – sie werden nicht als 0 behandelt;
  • SUM(...) summiert nur die Nicht-NULL-Werte.

Das ist fast immer das, was Sie wollen. Aber es ist gut zu wissen: Wenn ja Auf der Suche nach "der Gesamtzahl der Mitarbeiter" verwenden Sie COUNT(*), nicht COUNT(department_id).

Probieren Sie es aus

Übung#sql.m4.l2.e1
Versuche: 0Wird geladen…

Zeigen Sie für jeden Mitarbeiter den Vornamen (first_name), den Nachnamen (last_name) und eine Spalte „dipartimento_id“ an, die der Abteilungs-ID oder -1 entspricht, wenn sie nicht zugewiesen ist. Drei Spalten, eine Zeile pro Mitarbeiter.

Editor wird geladen…
Hinweis anzeigen

Verwenden Sie COALESCE(department_id, -1), um NULL-Werte durch -1 zu ersetzen.

Lösung nach 3 Versuchen verfügbar

Wiederholungsübung

Übung#sql.m4.l2.e2
Versuche: 0Wird geladen…

Gibt den Vornamen (first_name), den Nachnamen (last_name) und den Abteilungsnamen (departments.name) ALLER Mitarbeiter zurück und zeigt „(nessuno)“ an, wenn die Abteilung fehlt. Verwenden Sie LEFT JOIN + COALESCE.

Editor wird geladen…
Hinweis anzeigen

COALESCE(d.name, '(nessuno)') verarbeitet den durch den LEFT JOIN eingeführten NULL-Wert.

Lösung nach 3 Versuchen verfügbar