Der NULL-Wert in MySQL
Der Typ des Nullwertes
Metazahlen
Die ganzen Zahlen werden durch Hinzunahme eines weiteren Wertes NULL zu den ganzen Metazahlen erweitert.
Die ganzen Zahlen sind also beispielsweise die Werte 0, +1, -1, +2, -2, +3, … .
Die ganzen Metazahlen sind NULL, 0, +1, -1, +2, -2, +3, … . Wir nennen solche Werte, die um NULL erweitert sind, auch Metawerte. Die Zahl 1 gilt demnach als Wert und auch als Metawert, während NULL nur ein Metawert, aber kein Wert ist.
Metawert
|
.-----------'-----------.
| |
NULL Wert
|
.-----.-----.--'--.-----.-----.-- ...
| | | | | |
0 +1 -1 +2 -2 +3 ...
Dieser Wert NULL ist nicht mit der Zahl 0 gleichzusetzen, sondern ein anderer Wert.
Metatypen
In SQL sind als Werte einer Spalte mit dem Datentyp »INTEGER« alle ganzen Metazahlen zulässig, also neben den Werten 0, 1, 2, … auch der Wert NULL.
Auch mit anderen Datentypen als »INTEGER« kann der Wert NULL verwendet werden, der Typ »INTEGER« diente hier nur als ein einführendes Beispiel.
Das NULL-Literal
Das NULL-Literal lautet »NULL«. Der Wert des Ausdrucks »NULL« ist in SQL der Wert NULL.
Der NULL-Wert (Operatoren)
Jeder normale Vergleich mit NULL ergibt NULL, da das Ergebnis als unbekannt gilt, weil NULL einen unbekannten Wert kennzeichnet.
mysql> SELECT NULL=NULL;
+-----------+
| NULL=NULL |
+-----------+
| NULL |
+-----------+
1 row in set (0.08 sec)
Soll geprüft werden, ob ein Wert NULL oder nicht NULL ist, so wird »IS NULL« /ˈɪzˈnəl/ beziehungsweise »IS NOT NULL« /ˈɪzˈnɑtˈnəl/ verwendet.
mysql> SELECT NULL IS NULL;
+--------------+
| NULL IS NULL |
+--------------+
| 1 |
+--------------+
1 row in set (0.00 sec)mysql> SELECT NULL IS NOT NULL;
+------------------+
| NULL IS NOT NULL |
+------------------+
| 0 |
+------------------+
1 row in set (0.00 sec)
Der Nullwert (Funktionen)
Mit »string ISNULL( variant x, string s )« kann unter MySQL ein Text »s« für den Wert »NULL« festgelegt werden. Das bedeutet: Der Wert dieses Funktionsaufrufs ist im allgemeinen der Wert des ersten Arguments »x«, nur wenn dieses »NULL« ist, dann ist der Wert dieses Funktionsaufrufs der Wert des zweiten Arguments. Eine solche Funktion heißt bei manchen Datenbanken und im SQL-Standard »COALESCE« (Aussprache: /ˌko ə ˈles/ (n), /ˌkoʊəˈlɛs/ (c)).
mysql> SELECT ISNULL( NULL );
+----------------+
| ISNULL( NULL ) |
+----------------+
| 1 |
+----------------+
1 row in set (0.12 sec)mysql> SELECT ISNULL( ISNULL( NULL ));
+-------------------------+
| ISNULL( ISNULL( NULL )) |
+-------------------------+
| 0 |
+-------------------------+
1 row in set (0.00 sec)mysql> SELECT IFNULL( NULL, 7 );
PS Auch in MySQL gibt es COALESCE: COALESCE(value[, ...]) erstes Argument, das nicht NULL ist oder NULL. SELECT COALESCE(NULL, 'abc', NULL);
Weitere Aspekte des Metawerts NULL
- Bei INSERT unbestimmte Spalten erhalten NULL, falls nicht durch andere Regelungen (automatisches Hochzählen oder Fehlwerte) ein anderer Wert festgelegt wurde
- Schlüsselintegrität: Ein Primärschlüssel darf nie NULL sein
- NULL als Wert von Berechnungen: 1/0, sqrt(-1), -null, 1+null
- NULL in Vergleichen: null < 2, NULL == 'NULL', 'NULL' IS NULL, '' IS NULL, NULL == 0, 0 IS NULL
- Ob Nullwerte beim Sortieren vor oder nach allen anderen Werten einsortiert werden unterscheiden sich zwischen verschiedenen Datenbanksystemen und kann bei einigen Datenbanksystemen auch eingestellt werden.
- Die Ausgabe der Zeichenfolge »'NULL'« kann im MySQL-Monitor nicht von der Ausgabe von »NULL« unterschieden werden.
- Aus der Sicht der Theorie ist eine Relation mit NULL-Werte nach Ansicht einiger Autoren gar keine Relation, so daß einige Autoren NULL ablehnen und sich dafür aussprechen, NULL nie zu verwenden.
- FALSE AND NULL, TRUE AND NULL, …
- Bei Statistikfunktionen wird NULL speziell behandelt
- Fallstudie: Ende der Beschäftigung eines Mitarbeiters
Nullverbote
Einem Felde können Einschränkungen zugeordnet werden, welche bestimmte Möglichkeiten für dieses Feld ausschließen. Hier wird zunächst nur eine Auswahl der wichtigsten Feldeinschränkungen in vereinfachter Form vorgestellt.
NOT NULL Der Feldeinschränkung »NOT NULL« schließt den Nullwert für ein Feld aus.
- MySQL column_definition (vereinfacht)
data_type [NOT NULL | NULL] [AUTO_INCREMENT] [PRIMARY KEY]
CREATE TABLE ABTEILUNG
( ABTEILUNG INTEGER NOT NULL,
NAME VARCHAR( 255 ),
ORT VARCHAR( 255 ),
LEITER INTEGER );
Ein Primärschlüsselfeld darf keine Nullwerte enthalten (dies wird von MySQL unter Umständen stillschweigend ergänzt, so daß es nicht unbedingt ausdrücklich hingeschrieben werden muß).
CREATE TABLE ABTEILUNG
( ABTEILUNG INTEGER NOT NULL AUTO_INCREMENT,
NAME VARCHAR( 255 ),
ORT VARCHAR( 255 ),
LEITER INTEGER
PRIMARY KEY ( ABTEILUNG ));
Fehlwerte
- MySQL column_definition (vereinfacht)
data_type [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT] [PRIMARY KEY]
IFNULL
IFNULL( expression, value )
IF
IFNULL( expression, value, value1 )