Free Trial

Safari Books Online is a digital library providing on-demand subscription access to thousands of learning resources.


  • Create BookmarkCreate Bookmark
  • Create Note or TagCreate Note or Tag
  • DownloadDownload
  • PrintPrint
Share this Page URL
Help

4. Filtern > NULL: Ein böses Wort

NULL: Ein böses Wort

Ich habe mich darum gedrückt, solange ich konnte, aber jetzt lässt es sich nicht mehr umgehen, dieses Thema, das Unsicherheit, Angst und Entsetzen hervorruft: der null-Wert. null ist die Abwesenheit eines Werts. Bevor ein Angestellter gefeuert wird, wird seine end_date-Spalte in der employee-Tabelle auf null gesetzt. Es gibt einfach keinen Wert, den man der Spalte end_date in dieser Situation vernünftigerweise zuweisen könnte. null ist jedoch eine wackelige Angelegenheit, da es mehrere Varianten davon gibt:

Nicht zutreffend

Zum Beispiel die Employee ID-Spalte für ein am Geldautomaten getätigtes Bankgeschäft.

Wert noch nicht bekannt

Zum Beispiel, wenn zu dem Zeitpunkt, da die Daten eines Kunden angelegt werden, dessen Federal ID noch unbekannt ist.

Wert nicht definiert

Zum Beispiel, wenn ein Konto für ein Produkt angelegt wird, das noch nicht in die Datenbank eingetragen wurde.

Tipp

Manche Theoretiker sind der Ansicht, es müsse für alle diese (und andere) Situationen jeweils unterschiedliche Ausdrücke geben, aber die meisten Praktiker sind sich einig, dass dies viel zu verwirrend wäre.

Bei der Arbeit mit null müssen Sie an Folgendes denken:

  • Ein Ausdruck kann null sein, aber nicht gleich null.

  • null und null sind nie gleich.

Ob ein Ausdruck null ist, kann man mit dem Operator is null testen:

mysql> SELECT emp_id, fname, lname, superior_emp_id
    -> FROM employee
    -> WHERE superior_emp_id IS NULL;
+--------+---------+-------+-----------------+
| emp_id | fname   | lname | superior_emp_id |
+--------+---------+-------+-----------------+
|      1 | Michael | Smith |            NULL |
+--------+---------+-------+-----------------+
1 row in set (0.00 sec)

Diese Abfrage gibt alle Firmenangehörigen zurück, die keinen Chef haben (wäre das nicht angenehm?). Hier sehen Sie die gleiche Abfrage mit = null an Stelle von is null:

mysql> SELECT emp_id, fname, lname, superior_emp_id
    -> FROM employee
    -> WHERE superior_emp_id = NULL;
Empty set (0.01 sec)

Die Abfrage wird korrekt geparst und ausgeführt, gibt aber keine Zeilen zurück. Unerfahrene SQL-Programmierer begehen häufig diese Sünde, und der Datenbankserver meldet keinen Fehler. Seien Sie also vorsichtig bei der Formulierung von Bedingungen, die null testen sollen.

Wenn Sie sehen möchten, ob einer Spalte ein Wert zugewiesen wurde, verwenden Sie den Operator is not null:

mysql> SELECT emp_id, fname, lname, superior_emp_id
    -> FROM employee
    -> WHERE superior_emp_id IS NOT NULL;
+--------+----------+-----------+-----------------+
| emp_id | fname    | lname     | superior_emp_id |
+--------+----------+-----------+-----------------+
|      2 | Susan    | Barker    |               1 |
|      3 | Robert   | Tyler     |               1 |
|      4 | Susan    | Hawthorne |               3 |
|      5 | John     | Gooding   |               4 |
|      6 | Helen    | Fleming   |               4 |
|      7 | Chris    | Tucker    |               6 |
|      8 | Sarah    | Parker    |               6 |
|      9 | Jane     | Grossman  |               6 |
|     10 | Paula    | Roberts   |               4 |
|     11 | Thomas   | Ziegler   |              10 |
|     12 | Samantha | Jameson   |              10 |
|     13 | John     | Blake     |               4 |
|     14 | Cindy    | Mason     |              13 |
|     15 | Frank    | Portman   |              13 |
|     16 | Theresa  | Markham   |               4 |
|     17 | Beth     | Fowler    |              16 |
|     18 | Rick     | Tulman    |              16 |
+--------+----------+-----------+-----------------+
17 rows in set (0.00 sec)

Diese Version der Abfrage gibt die anderen 17 Mitarbeiter zurück, die im Gegensatz zu Michael Smith einen Chef haben.

Bevor wir das Thema null wieder verlassen, möchte ich eine weitere mögliche Falle aufzeigen. Angenommen, Sie müssen alle Mitarbeiter finden, die nicht für Helen Fleming arbeiten, deren Employee ID die 6 ist. Instinktiv tun Sie zunächst Folgendes:

mysql> SELECT emp_id, fname, lname, superior_emp_id
    -> FROM employee
    -> WHERE superior_emp_id != 6;
+--------+----------+-----------+-----------------+
| emp_id | fname    | lname     | superior_emp_id |
+--------+----------+-----------+-----------------+
|      2 | Susan    | Barker    |               1 |
|      3 | Robert   | Tyler     |               1 |
|      4 | Susan    | Hawthorne |               3 |
|      5 | John     | Gooding   |               4 |
|      6 | Helen    | Fleming   |               4 |
|     10 | Paula    | Roberts   |               4 |
|     11 | Thomas   | Ziegler   |              10 |
|     12 | Samantha | Jameson   |              10 |
|     13 | John     | Blake     |               4 |
|     14 | Cindy    | Mason     |              13 |
|     15 | Frank    | Portman   |              13 |
|     16 | Theresa  | Markham   |               4 |
|     17 | Beth     | Fowler    |              16 |
|     18 | Rick     | Tulman    |              16 |
+--------+----------+-----------+-----------------+
14 rows in set (0.00 sec)

Es stimmt zwar, dass diese 14 Mitarbeiter nicht für Helen Fleming arbeiten, aber wenn Sie die Daten genau anschauen, erkennen Sie, dass es noch jemanden gibt, der nicht für Helen arbeitet, aber hier nicht aufgeführt wird: Michael Smith. Seine Spalte superior_emp_id hat den Wert null (weil er hier das hohe Tier ist). Um also die korrekte Antwort zu finden, müssen Sie auch die Möglichkeit einbeziehen, dass manche Zeilen in der Spalte superior_emp_id den Wert null aufweisen:

mysql> SELECT emp_id, fname, lname, superior_emp_id
    -> FROM employee
    -> WHERE superior_emp_id != 6 OR superior_emp_id IS NULL;
+--------+----------+-----------+-----------------+
| emp_id | fname    | lname     | superior_emp_id |
+--------+----------+-----------+-----------------+
|      1 | Michael  | Smith     |            NULL |
|      2 | Susan    | Barker    |               1 |
|      3 | Robert   | Tyler     |               1 |
|      4 | Susan    | Hawthorne |               3 |
|      5 | John     | Gooding   |               4 |
|      6 | Helen    | Fleming   |               4 |
|     10 | Paula    | Roberts   |               4 |
|     11 | Thomas   | Ziegler   |              10 |
|     12 | Samantha | Jameson   |              10 |
|     13 | John     | Blake     |               4 |
|     14 | Cindy    | Mason     |              13 |
|     15 | Frank    | Portman   |              13 |
|     16 | Theresa  | Markham   |               4 |
|     17 | Beth     | Fowler    |              16 |
|     18 | Rick     | Tulman    |              16 |
+--------+----------+-----------+-----------------+
15 rows in set (0.00 sec)

Nun enthält die Ergebnismenge alle 15 Mitarbeiter, die nicht für Helen arbeiten. Wenn Sie mit unbekannten Datenbanken arbeiten, sollten Sie immer zuerst herausfinden, welche Spalten einer Tabelle null-Werte erlauben. So können Sie in Ihren Filterbedingungen Vorkehrungen treffen, damit Ihnen keine Daten durchrutschen.

  • Safari Books Online
  • Create BookmarkCreate Bookmark
  • Create Note or TagCreate Note or Tag
  • DownloadDownload
  • PrintPrint