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.
-- All these expressions return NULL (not true!):
SELECT NULL = NULL; -- NULL
SELECT NULL = 0; -- NULL
SELECT NULL <> 'qualcosa'; -- NULLKonkrete Konsequenz: WHERE column = NULL funktioniert nie. Sie müssen verwenden
die dedizierten Operatoren IS NULL / IS NOT NULL:
-- 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.
-- 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:
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 ignorierenNULLs – 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
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.
Hinweis anzeigen
Verwenden Sie COALESCE(department_id, -1), um NULL-Werte durch -1 zu ersetzen.
Lösung nach 3 Versuchen verfügbar
Wiederholungsübung
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.
Hinweis anzeigen
COALESCE(d.name, '(nessuno)') verarbeitet den durch den LEFT JOIN eingeführten NULL-Wert.
Lösung nach 3 Versuchen verfügbar