NULL-Werte in SQL spielen eine wichtige Rolle bei der Datenbankgestaltung und der Abfrageausführung. NULL stellt einen speziellen Marker dar, der anzeigt, dass kein Wert vorhanden ist, und ermöglicht es, die Integrität und Konsistenz der Daten aufrechtzuerhalten. In diesem Artikel wird ausführlich erklärt, wie NULL-Werte in SQL behandelt werden, von den grundlegenden Konzepten bis hin zum Umgang mit NULL-Werten durch verschiedene Operatoren und Funktionen. Durch das Verständnis des richtigen Umgangs mit NULL-Werten wird es möglich, robustere und effizientere SQL-Abfragen zu erstellen.
Was sind NULL-Werte?
Ein NULL-Wert in einer SQL-Datenbank zeigt an, dass der Wert „nicht vorhanden“ ist. Dies unterscheidet sich von „null“ oder „leer“ und bedeutet, dass der Wert nicht definiert ist. Zum Beispiel wird ein Feld mit einem NULL-Wert gespeichert, wenn beim Dateneingabeverfahren kein Wert eingegeben wurde.
Die Bedeutung von NULL-Werten
NULL-Werte spielen eine wichtige Rolle bei der Gestaltung und Verwaltung von Datenbanken. Sie ermöglichen es, fehlende oder unbekannte Daten darzustellen und so die Datenintegrität aufrechtzuerhalten.
Beispiele für die Verwendung von NULL-Werten
Im Folgenden wird ein Beispiel gezeigt, wie NULL-Werte verwendet werden können.
-- Erstellen einer Tabelle
CREATE TABLE employees (
id INT PRIMARY KEY,
name VARCHAR(50),
age INT,
email VARCHAR(50)
);
-- Einfügen von Daten
INSERT INTO employees (id, name, age, email) VALUES (1, 'John Doe', 30, 'john.doe@example.com');
INSERT INTO employees (id, name, age, email) VALUES (2, 'Jane Smith', NULL, 'jane.smith@example.com');
INSERT INTO employees (id, name, age, email) VALUES (3, 'Emily Jones', 25, NULL);
In diesem Beispiel werden das Alter von Jane Smith
und die E-Mail-Adresse von Emily Jones
als NULL-Werte gespeichert.
Vergleichsoperatoren und NULL-Werte
Vergleichsoperatoren in SQL behandeln NULL-Werte auf besondere Weise. Da NULL mit keinem Wert gleichgesetzt wird, können bei Verwendung herkömmlicher Vergleichsoperatoren unerwartete Ergebnisse auftreten.
Der Gleichheitsoperator (=) und NULL-Werte
Da NULL mit keinem anderen Wert gleichgesetzt wird, gibt die folgende Abfrage FALSE zurück.
SELECT * FROM employees WHERE age = NULL;
Diese Abfrage liefert keine Ergebnisse.
Der Ungleichheitsoperator (!= oder <>) und NULL-Werte
Da NULL-Werte auch bei Ungleichheit nicht gleichgesetzt werden, gibt die folgende Abfrage ebenfalls FALSE zurück.
SELECT * FROM employees WHERE age != NULL;
Auch diese Abfrage liefert keine Ergebnisse.
IS NULL und IS NOT NULL
Um NULL-Werte korrekt zu behandeln, verwenden Sie die Operatoren IS NULL
und IS NOT NULL
.
-- Auswahl von Zeilen mit NULL-Werten
SELECT * FROM employees WHERE age IS NULL;
-- Auswahl von Zeilen ohne NULL-Werte
SELECT * FROM employees WHERE age IS NOT NULL;
Auf diese Weise können Sie Zeilen mit oder ohne NULL-Werte korrekt auswählen.
Beispiel
Die folgende Abfrage wählt die Mitarbeiter aus, deren Alter NULL ist.
SELECT * FROM employees WHERE age IS NULL;
Diese Abfrage gibt den Datensatz von Jane Smith
zurück.
Logische Operatoren und NULL-Werte
Logische Operatoren (AND, OR, NOT) in SQL wenden spezielle Regeln an, wenn Bedingungen mit NULL-Werten bewertet werden. Da NULL als unbekannt (Unknown) behandelt wird, kann dies das Ergebnis logischer Operationen beeinflussen.
Der AND-Operator und NULL-Werte
Der AND-Operator gibt nur TRUE zurück, wenn beide Bedingungen wahr sind. Hier ein Beispiel, wie NULL-Werte in diesem Fall bewertet werden.
SELECT * FROM employees WHERE age > 25 AND email IS NOT NULL;
Diese Abfrage wählt Mitarbeiter aus, die älter als 25 Jahre sind und deren E-Mail-Adresse nicht NULL ist. Wenn das Alter NULL ist, wird die Bedingung NULL, und der Datensatz wird nicht zurückgegeben.
Der OR-Operator und NULL-Werte
Der OR-Operator gibt TRUE zurück, wenn eine der beiden Bedingungen wahr ist. Hier ein Beispiel, wie NULL-Werte bewertet werden.
SELECT * FROM employees WHERE age > 25 OR email IS NULL;
Diese Abfrage wählt Mitarbeiter aus, die älter als 25 Jahre sind oder deren E-Mail-Adresse NULL ist. Selbst wenn das Alter NULL ist, wird der Datensatz ausgewählt, wenn die E-Mail-Adresse NULL ist.
Der NOT-Operator und NULL-Werte
Der NOT-Operator kehrt den logischen Wert einer Bedingung um. Wird NOT auf NULL angewendet, bleibt das Ergebnis NULL.
SELECT * FROM employees WHERE NOT (age > 25);
Diese Abfrage wählt Mitarbeiter aus, die nicht älter als 25 Jahre sind. Wenn das Alter NULL ist, wird NOT (NULL) zu NULL, und der Datensatz wird nicht ausgewählt.
Konkretbeispiele für logische Operatoren und NULL-Werte
Im Folgenden werden konkrete Beispiele für logische Operatoren mit NULL-Werten gezeigt.
-- Auswahl von Mitarbeitern, deren Alter NULL ist und deren E-Mail-Adresse nicht NULL ist
SELECT * FROM employees WHERE age IS NULL AND email IS NOT NULL;
-- Auswahl von Mitarbeitern, deren Alter nicht NULL ist oder deren E-Mail-Adresse nicht NULL ist
SELECT * FROM employees WHERE age IS NOT NULL OR email IS NOT NULL;
Mit diesen Abfragen können Sie Daten mit Berücksichtigung von NULL-Werten korrekt auswählen.
Arithmetische Operatoren und NULL-Werte
Arithmetische Operatoren in SQL (+, -, *, /) zeigen ein spezielles Verhalten, wenn NULL-Werte beteiligt sind. Das Ergebnis jeder arithmetischen Operation mit einem NULL-Wert ist immer NULL.
Addition (+) und NULL-Werte
Im Folgenden ein Beispiel für eine Addition mit einem NULL-Wert.
SELECT id, name, age + 5 AS age_plus_five FROM employees;
Diese Abfrage erstellt eine neue Spalte, in der das Alter um 5 erhöht wird. Ist age
NULL, ist das Ergebnis ebenfalls NULL.
Subtraktion (-) und NULL-Werte
Im Folgenden ein Beispiel für eine Subtraktion mit einem NULL-Wert.
SELECT id, name, age - 5 AS age_minus_five FROM employees;
Diese Abfrage erstellt eine neue Spalte, in der das Alter um 5 verringert wird. Ist age
NULL, ist das Ergebnis ebenfalls NULL.
Multiplikation (*) und NULL-Werte
Im Folgenden ein Beispiel für eine Multiplikation mit einem NULL-Wert.
SELECT id, name, age * 2 AS age_times_two FROM employees;
Diese Abfrage erstellt eine neue Spalte, in der das Alter verdoppelt wird. Ist age
NULL, ist das Ergebnis ebenfalls NULL.
Division (/) und NULL-Werte
Im Folgenden ein Beispiel für eine Division mit einem NULL-Wert.
SELECT id, name, age / 2 AS age_divided_by_two FROM employees;
Diese Abfrage erstellt eine neue Spalte, in der das Alter durch 2 geteilt wird. Ist age
NULL, ist das Ergebnis ebenfalls NULL.
Konkretbeispiele für arithmetische Operationen mit NULL-Werten
Im Folgenden werden konkrete Beispiele für arithmetische Operationen mit NULL-Werten gezeigt.
-- Auswahl von Mitarbeitern, bei denen 10 zum Alter addiert wird, und das Ergebnis nicht NULL ist
SELECT id, name, age + 10 AS new_age FROM employees WHERE age + 10 IS NOT NULL;
-- Auswahl von Mitarbeitern, bei denen das Alter verdoppelt wird, und das Ergebnis nicht NULL ist
SELECT id, name, age * 2 AS doubled_age FROM employees WHERE age * 2 IS NOT NULL;
Mit diesen Abfragen können Sie die Auswirkungen von NULL-Werten auf Berechnungsergebnisse nachvollziehen.
Funktionen und NULL-Werte
SQL stellt eine Vielzahl nützlicher Funktionen zur Verfügung, um mit NULL-Werten umzugehen. Diese Funktionen ermöglichen es Ihnen, NULL-Werte korrekt zu verarbeiten und das Abfrageergebnis wie gewünscht zu steuern.
Die COALESCE-Funktion
Die COALESCE
-Funktion gibt das erste Argument zurück, das nicht NULL ist. Sie ist nützlich, wenn mehrere Spalten NULL-Werte enthalten können.
SELECT id, name, COALESCE(age, 0) AS age FROM employees;
Diese Abfrage gibt 0 zurück, wenn age
NULL ist.
Die NULLIF-Funktion
Die NULLIF
-Funktion gibt NULL zurück, wenn die beiden Argumente gleich sind, und das erste Argument, wenn sie ungleich sind.
SELECT id, name, NULLIF(age, 0) AS age FROM employees;
Diese Abfrage gibt NULL zurück, wenn age
0 ist.
Die ISNULL-Funktion (nur für SQL Server)
Die ISNULL
-Funktion ersetzt NULL-Werte durch einen angegebenen Wert.
SELECT id, name, ISNULL(age, 0) AS age FROM employees;
Diese Abfrage gibt 0 zurück, wenn age
NULL ist.
Die IFNULL-Funktion (nur für MySQL)
Die IFNULL
-Funktion ersetzt NULL-Werte durch einen angegebenen Wert.
SELECT id, name, IFNULL(age, 0) AS age FROM employees;
Diese Abfrage gibt 0 zurück, wenn age
NULL ist.
Konkretbeispiele für den Umgang mit NULL-Werten durch Funktionen
Im Folgenden werden konkrete Beispiele gezeigt, wie NULL-Werte mithilfe von Funktionen verarbeitet werden können.
-- Setzt den Wert auf 0, wenn das Alter NULL ist
SELECT id, name, COALESCE(age, 0) AS age FROM employees;
-- Gibt NULL zurück, wenn das Alter 0 ist
SELECT id, name, NULLIF(age, 0) AS age FROM employees;
-- Nur für SQL Server: Setzt den Wert auf 0, wenn das Alter NULL ist
SELECT id, name, ISNULL(age, 0) AS age FROM employees;
-- Nur für MySQL: Setzt den Wert auf 0, wenn das Alter NULL ist
SELECT id, name, IFNULL(age, 0) AS age FROM employees;
Durch den Einsatz dieser Funktionen können Sie NULL-Werte flexibel verarbeiten.
CASE-Anweisungen und NULL-Werte
Die CASE-Anweisung dient dazu, basierend auf Bedingungen verschiedene Werte zurückzugeben. Sie ist auch nützlich im Umgang mit NULL-Werten und ermöglicht eine flexible Datenverarbeitung.
Grundstruktur der CASE-Anweisung
Im Folgenden wird die Grundstruktur einer CASE-Anweisung gezeigt.
SELECT id, name,
CASE
WHEN age IS NULL THEN 'Nicht festgelegt'
ELSE CAST(age AS VARCHAR)
END AS age_status
FROM employees;
Diese Abfrage gibt „Nicht festgelegt“ zurück, wenn age
NULL ist, und andernfalls das Alter als Zeichenfolge.
CASE-Anweisung mit mehreren Bedingungen
Mit einer CASE-Anweisung können Sie mehrere Bedingungen verarbeiten.
SELECT id, name,
CASE
WHEN age IS NULL THEN 'Unbekanntes Alter'
WHEN age < 20 THEN 'Unter 20'
WHEN age BETWEEN 20 AND 30 THEN '20-30'
ELSE 'Über 30'
END AS age_category
FROM employees;
Diese Abfrage gibt eine Kategorie basierend auf dem Alter zurück.
Konkretbeispiele für CASE-Anweisungen und NULL-Werte
Im Folgenden werden konkrete Beispiele für den Umgang mit NULL-Werten durch CASE-Anweisungen gezeigt.
-- Beispiel: NULL-Werte als „Nicht festgelegt“ behandeln
SELECT id, name,
CASE
WHEN email IS NULL THEN 'E-Mail nicht festgelegt'
ELSE email
END AS email_status
FROM employees;
-- Beispiel: Kategorie basierend auf Alter, NULL-Werte als „Unbekannt“ behandeln
SELECT id, name,
CASE
WHEN age IS NULL THEN 'Unbekanntes Alter'
WHEN age < 25 THEN 'Jung'
WHEN age BETWEEN 25 AND 35 THEN 'Mittelalterlich'
ELSE 'Älter'
END AS age_group
FROM employees;
Mit diesen Abfragen können Sie Daten flexibel je nach Bedingung und NULL-Wert anzeigen und kategorisieren.
Indizes und NULL-Werte
Indizes werden verwendet, um die Leistung von Datenbankabfragen zu verbessern. Beim Anwenden eines Indexes auf Spalten, die NULL-Werte enthalten, gibt es jedoch einige Dinge zu beachten.
Grundlagen von Indizes und NULL-Werten
In SQL-Datenbanken können auch für Spalten, die NULL-Werte enthalten, Indizes erstellt werden. Die Art und Weise, wie NULL-Werte gehandhabt werden, kann jedoch je nach Datenbanksystem variieren.
Leistungsauswirkungen von Indizes
Beim Anwenden eines Indexes auf Spalten, die viele NULL-Werte enthalten, muss die Leistung berücksichtigt werden. Das Erstellen eines Indexes auf solchen Spalten kann zu einer Vergrößerung der Indexgröße führen.
Konkretbeispiel zur Indexerstellung
Im Folgenden wird ein konkretes Beispiel zur Erstellung eines Indexes auf einer Spalte mit NULL-Werten gezeigt.
-- Erstellen eines Indexes
CREATE INDEX idx_email ON employees(email);
-- Abfrage mit Verwendung des Indexes
SELECT * FROM employees WHERE email IS NOT NULL;
Dieser Index beschleunigt die Suche nach Zeilen, deren email
nicht NULL ist.
Verwendung von Indizes und NULL-Werten
Einige Datenbanksysteme ermöglichen es, einen Index ohne NULL-Werte zu erstellen.
-- Beispiel in PostgreSQL: Erstellen eines Indexes ohne NULL-Werte
CREATE INDEX idx_email_non_null ON employees(email) WHERE email IS NOT NULL;
Dieser Index gilt nur für Zeilen, deren email
nicht NULL ist.
Effektiver Einsatz von Indizes
Im Folgenden werden einige Best Practices für den effektiven Einsatz von Indizes auf Spalten mit vielen NULL-Werten vorgestellt.
- Verwenden Sie Teilindizes, um NULL-Werte auszuschließen
- Verwenden Sie zusammengesetzte Indizes, um die Suche auf mehreren Spalten zu beschleunigen
- Berücksichtigen Sie das Gleichgewicht zwischen Indexgröße und Leistung
Konkretbeispiel für zusammengesetzte Indizes
Im Folgenden wird ein konkretes Beispiel für zusammengesetzte Indizes gezeigt.
-- Erstellen eines zusammengesetzten Indexes
CREATE INDEX idx_name_email ON employees(name, email);
-- Abfrage mit Verwendung des zusammengesetzten Indexes
SELECT * FROM employees WHERE name = 'John Doe' AND email IS NOT NULL;
Dieser zusammengesetzte Index beschleunigt die Suche nach Mitarbeitern, deren name
„John Doe“ ist und deren email
nicht NULL ist.
Übungsaufgaben
Um Ihr Verständnis von NULL-Werten in SQL zu vertiefen, haben wir einige praktische Übungsaufgaben vorbereitet. Durch diese Aufgaben können Sie das Verhalten von Operatoren und Funktionen mit NULL-Werten überprüfen.
Übungsaufgabe 1: Grundlegende Operationen mit NULL-Werten
Verwenden Sie die folgende Tabelle, um grundlegende Operationen mit NULL-Werten durchzuführen.
CREATE TABLE students (
id INT PRIMARY KEY,
name VARCHAR(50),
score INT
);
INSERT INTO students (id, name, score) VALUES (1, 'Alice', 85);
INSERT INTO students (id, name, score) VALUES (2, 'Bob', NULL);
INSERT INTO students (id, name, score) VALUES (3, 'Charlie', 78);
INSERT INTO students (id, name, score) VALUES (4, 'David', NULL);
Aufgabe 1.1
Schreiben Sie eine Abfrage, um die Studenten auszuwählen, deren Score NULL ist.
-- Beispielantwort
SELECT * FROM students WHERE score IS NULL;
Aufgabe 1.2
Schreiben Sie eine Abfrage, um die Studenten auszuwählen, deren Score nicht NULL ist.
-- Beispielantwort
SELECT * FROM students WHERE score IS NOT NULL;
Übungsaufgabe 2: Verwendung der COALESCE-Funktion
Schreiben Sie eine Abfrage unter Verwendung der COALESCE
-Funktion, um NULL-Werte bei Score durch 0 zu ersetzen.
-- Beispielantwort
SELECT id, name, COALESCE(score, 0) AS score FROM students;
Übungsaufgabe 3: Verwendung der CASE-Anweisung
Schreiben Sie eine Abfrage mit der CASE-Anweisung, um bei NULL-Werten „Nicht festgelegt“ anzuzeigen, bei Scores von 70 und darüber „Bestanden“ und in allen anderen Fällen „Nicht bestanden“.
-- Beispielantwort
SELECT id, name,
CASE
WHEN score IS NULL THEN 'Nicht festgelegt'
WHEN score >= 70 THEN 'Bestanden'
ELSE 'Nicht bestanden'
END AS result
FROM students;
Übungsaufgabe 4: Kombination von Bedingungen und NULL-Werten
Schreiben Sie eine Abfrage, um Studenten auszuwählen, die einen Score von 70 und darüber haben und deren Name ‚Charlie‘ ist. Fügen Sie auch eine Bedingung hinzu, um sicherzustellen, dass der Score nicht NULL ist.
-- Beispielantwort
SELECT * FROM students WHERE score >= 70 AND name = 'Charlie' AND score IS NOT NULL;
Diese Übungsaufgaben helfen Ihnen, ein besseres Verständnis für den Umgang mit NULL-Werten in SQL zu entwickeln.
Zusammenfassung
Der Umgang mit NULL-Werten in SQL ist für die Datenbankgestaltung und die Erstellung von Abfragen von entscheidender Bedeutung. NULL zeigt an, dass ein Wert „nicht vorhanden“ ist, und wird anders behandelt als andere Werte. In diesem Artikel haben wir das Verhalten von Operatoren und Funktionen in Bezug auf NULL-Werte, die Behandlung von Indizes sowie Beispiele für die praktische Anwendung ausführlich erläutert.
Durch das richtige Verständnis und den korrekten Umgang mit NULL-Werten können Sie die Konsistenz der Daten verbessern und die Effizienz von Abfragen steigern. Außerdem wird es möglich, flexible Abfragen zu erstellen, die NULL-Werte in realen Daten berücksichtigen.
Hier sind die wichtigsten Punkte des Artikels:
- Grundkonzept von NULL-Werten: NULL zeigt an, dass kein Wert vorhanden ist.
- Vergleichs- und logische Operatoren: NULL-Werte sind bei herkömmlichen Vergleichen nicht gleich, und Sie sollten IS NULL oder IS NOT NULL verwenden, um sie zu überprüfen.
- Arithmetische Operatoren: Das Ergebnis einer arithmetischen Operation mit NULL ist immer NULL.
- Funktionen: Verwenden Sie Funktionen wie COALESCE und NULLIF, um NULL-Werte zu verarbeiten.
- CASE-Anweisung: Verwenden Sie CASE-Anweisungen, um NULL-Werte bedingt zu verarbeiten.
- Indizes: Hinweise zur Erstellung von Indizes auf Spalten mit NULL-Werten.
Nehmen Sie dieses Wissen über NULL-Werte mit und erstellen Sie robustere und effizientere SQL-Abfragen.