Level 12: Fehlende Werte (NULL) behandeln
Aktualisiert am
Mittelstufe · Level 12 von 20. Ziel: Das Verhalten von NULL verstehen und fehlende Werte ersetzen.
Themen: NULL COALESCE NULLIF COUNT und NULL
Lektion
NULL bedeutet „unbekannter Wert“. Es ist weder null noch ein leerer Text: Es ist das Fehlen einer Information. Ein Kontakt ohne Telefon hat nicht die Nummer 0, er hat eine unbekannte Nummer.
Da der Wert unbekannt ist, ergibt fast jede Berechnung, die ihn berührt, ein unbekanntes Ergebnis: 5 + NULL ist NULL, 'a' || NULL ebenfalls. Ein Vergleich mit NULL ergibt weder wahr noch falsch, sondern unbekannt: phone = NULL ist unbekannt, und sogar NULL = NULL, denn zwei unbekannte Werte sind nicht unbedingt gleich.
SQL denkt also mit drei Werten: wahr, falsch und unbekannt. Entscheidende Regel: WHERE behält nur die Zeilen, in denen die Bedingung wahr ist, und verwirft die „unbekannten“ Zeilen wie die „falschen“. Deshalb verwirft WHERE phone <> '0612345678' auch die Kontakte ohne Telefon: Für sie ist der Test unbekannt.
Mit AND und OR verknüpft sich das Unbekannte logisch: falsch AND unbekannt ist falsch, wahr OR unbekannt ist wahr, aber wahr AND unbekannt bleibt unbekannt. Daher kommt die Falle von NOT IN: x NOT IN (1, NULL) bedeutet x <> 1 AND x <> NULL; die zweite Hälfte ist immer unbekannt, also ist die Bedingung nie wahr.
Um auf NULL zu prüfen, verwendet man IS NULL und IS NOT NULL, die immer wahr oder falsch liefern.
Um einen fehlenden Wert zu ersetzen, liefert COALESCE(a, b, c) den ersten Wert der Liste, der nicht NULL ist: COALESCE(phone, 'unknown') zeigt 'unknown', wenn das Telefon fehlt.
NULLIF(a, b) macht das Gegenteil: Es liefert NULL, wenn a = b, sonst a. Es dient vor allem dazu, eine Division abzusichern: x / NULLIF(y, 0) ergibt in den meisten Engines NULL statt eines Fehlers wegen Division durch null (SQLite liefert ohnehin schon NULL).
Schließlich ignorieren Aggregate NULL: COUNT(*) - COUNT(phone) liefert die Zahl der fehlenden Telefonnummern.
Syntax
SELECT COALESCE(col1, col2, 'standard'), x / NULLIF(y, 0)
FROM meine_tabelle
WHERE col IS NOT NULL;Kommentiertes Beispiel
SELECT name, COALESCE(email, 'no email') AS email
FROM contacts;Kontakte ohne Adresse zeigen 'no email' statt einer leeren Zelle.
| id | name | phone | city | |
|---|---|---|---|---|
| 1 | Alice Martin | alice@mail.com | 0612345678 | Paris |
| 2 | bob durand | NULL | 0698765432 | Lyon |
| 3 | CLAIRE ROUX | claire@work.org | NULL | NULL |
| 4 | David Lefevre | NULL | NULL | Nantes |
| 5 | Emma Petit | emma@mail.com | 0611223344 | NULL |
Ergebnis des Beispiels
| name | |
|---|---|
| Alice Martin | alice@mail.com |
| bob durand | no email |
| CLAIRE ROUX | claire@work.org |
| David Lefevre | no email |
| Emma Petit | emma@mail.com |
Das Wichtigste
- NULL = unbekannt: Man prüft es mit IS NULL.
- COALESCE ersetzt NULL durch den ersten bekannten Wert.
- NULLIF(y, 0) schützt eine Division.
Häufige Fallen
- WHERE phone <> '0612345678' schließt auch die Telefonnummern mit NULL aus.
- COALESCE braucht Werte derselben Art: Text mit Text, Zahl mit Zahl.
Die 5 Übungen des Levels
- Zeige den Namen jedes Kontakts und seine Telefonnummer, mit 'unknown', wenn sie fehlt.
- Zeige den Namen jedes Kontakts und seinen besten Kontaktweg: die E-Mail, wenn es eine gibt, sonst die Telefonnummer, sonst 'no contact'.
- Zeige für jedes Spiel die ID, die Tore beider Mannschaften und das Verhältnis Heimtore / Auswärtstore, auf 2 Nachkommastellen gerundet (goal_ratio). Wenn die Gastmannschaft kein Tor erzielt hat, muss das Verhältnis leer sein (NULL).
- Zeige in einer einzigen Zeile die Anzahl der Rechnungen (nb_invoices), die Anzahl der unbezahlten Rechnungen (unpaid) und den noch offenen Gesamtbetrag (amount_due). Eine unbezahlte Rechnung hat kein Zahlungsdatum.
- Zeige den Titel jedes Films und den Namen seines Regisseurs, mit 'Unknown', wenn er nicht bekannt ist. Alle Filme müssen erscheinen.
In SpeedQL wird jede Abfrage sofort geprüft: Ihr Ergebnis wird mit dem erwarteten verglichen, dann läuft die Abfrage noch einmal auf einer versteckten Kontrolldatenbank. Zu jeder Übung gibt es schriftliche Hinweise, die du nur bei Bedarf aufrufst.
Die Übungen von Level 12 machen
Kostenlos und ohne Anmeldung: Die Lektion und die 5 Übungen öffnen sich direkt in deinem Browser.
← Vorheriges Level: Bedingungen im Ergebnis: CASE · Nächstes Level: Ergebnisse kombinieren: UNION, INTERSECT, EXCEPT →