I valori NULL in SQL giocano un ruolo importante nella progettazione del database e nell’esecuzione delle query. Un valore NULL è un marcatore speciale che indica “assenza di valore”, permettendo di mantenere l’integrità e la coerenza dei dati. In questo articolo, spiegheremo in dettaglio il concetto di valori NULL in SQL, e come gestirli con diversi operatori e funzioni. Comprendere il corretto trattamento dei valori NULL permette di creare query SQL più robuste ed efficienti.
Cos’è un valore NULL
Un valore NULL è un valore speciale in SQL che indica “assenza di dati”. Non è uguale a “zero” o a “stringa vuota”, ma significa che il dato non è stato definito. Ad esempio, se un campo viene lasciato vuoto al momento dell’inserimento dei dati, quel campo avrà un valore NULL.
L’importanza dei valori NULL
I valori NULL giocano un ruolo cruciale nella progettazione e gestione dei database. Consentono di rappresentare dati mancanti o sconosciuti, mantenendo l’integrità dei dati.
Esempi di utilizzo dei valori NULL
Ecco un esempio di come vengono utilizzati i valori NULL.
-- Creazione di una tabella
CREATE TABLE employees (
id INT PRIMARY KEY,
name VARCHAR(50),
age INT,
email VARCHAR(50)
);
-- Inserimento di dati
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);
Nell’esempio sopra, l’età di Jane Smith
e l’indirizzo email di Emily Jones
sono stati salvati come valori NULL.
Operatori di confronto e valori NULL
Gli operatori di confronto in SQL trattano i valori NULL in modo particolare. Poiché un valore NULL non è uguale a nessun altro valore, l’uso degli operatori di confronto standard può dare risultati inattesi.
Operatore di confronto per uguaglianza (=) e valori NULL
Poiché i valori NULL non sono uguali a nessun altro valore, la seguente query restituirà FALSE.
SELECT * FROM employees WHERE age = NULL;
Questa query non restituirà alcun risultato.
Operatore di confronto per disuguaglianza (!= o <>) e valori NULL
Nemmeno con l’operatore di confronto per disuguaglianza, i valori NULL saranno considerati non uguali, quindi la seguente query restituirà FALSE.
SELECT * FROM employees WHERE age != NULL;
Questa query non restituirà alcun risultato.
IS NULL e IS NOT NULL
Per gestire correttamente i valori NULL, è necessario utilizzare gli operatori IS NULL
e IS NOT NULL
.
-- Selezionare le righe che contengono valori NULL
SELECT * FROM employees WHERE age IS NULL;
-- Selezionare le righe che non contengono valori NULL
SELECT * FROM employees WHERE age IS NOT NULL;
In questo modo, è possibile selezionare esattamente le righe che contengono o non contengono valori NULL.
Esempio
La query seguente seleziona i dipendenti la cui età è NULL.
SELECT * FROM employees WHERE age IS NULL;
Questa query restituirà il record di Jane Smith
.
Operatori logici e valori NULL
Gli operatori logici (AND, OR, NOT) in SQL applicano regole speciali quando valutano condizioni che coinvolgono valori NULL. Poiché un valore NULL è considerato “sconosciuto”, può influire sul risultato delle operazioni logiche.
Operatore AND e valori NULL
L’operatore AND restituisce TRUE solo se entrambe le condizioni sono vere. Ecco un esempio di valutazione con un valore NULL.
SELECT * FROM employees WHERE age > 25 AND email IS NOT NULL;
Questa query seleziona i dipendenti la cui età è superiore a 25 e il cui indirizzo email non è NULL. Se l’età è NULL, la condizione diventa NULL e la riga non verrà restituita.
Operatore OR e valori NULL
L’operatore OR restituisce TRUE se almeno una delle condizioni è vera. Ecco un esempio di valutazione con un valore NULL.
SELECT * FROM employees WHERE age > 25 OR email IS NULL;
Questa query seleziona i dipendenti la cui età è superiore a 25 o il cui indirizzo email è NULL. Anche se l’età è NULL, se l’indirizzo email è NULL, la riga sarà selezionata.
Operatore NOT e valori NULL
L’operatore NOT inverte il valore logico di una condizione. Se applicato a un valore NULL, il risultato resta NULL.
SELECT * FROM employees WHERE NOT (age > 25);
Questa query seleziona i dipendenti la cui età non è superiore a 25. Se l’età è NULL, NOT (NULL) restituisce NULL e la riga non verrà selezionata.
Esempi concreti di operazioni logiche con valori NULL
Di seguito sono riportati esempi concreti di operazioni logiche con valori NULL.
-- Selezionare dipendenti la cui età è NULL e l'indirizzo email non è NULL
SELECT * FROM employees WHERE age IS NULL AND email IS NOT NULL;
-- Selezionare dipendenti la cui età non è NULL o l'indirizzo email non è NULL
SELECT * FROM employees WHERE age IS NOT NULL OR email IS NOT NULL;
Utilizzando queste query, è possibile eseguire selezioni di dati che tengono conto dei valori NULL in modo appropriato.
Operatori aritmetici e valori NULL
Gli operatori aritmetici in SQL (+, -, *, /) hanno un comportamento speciale quando incontrano valori NULL. Il risultato di un’operazione aritmetica che coinvolge un valore NULL è sempre NULL.
Addizione (+) e valori NULL
Ecco un esempio di addizione con un valore NULL.
SELECT id, name, age + 5 AS age_plus_five FROM employees;
Questa query aggiunge 5 all’età e crea una nuova colonna. Se age
è NULL, il risultato sarà NULL.
Sottrazione (-) e valori NULL
Ecco un esempio di sottrazione con un valore NULL.
SELECT id, name, age - 5 AS age_minus_five FROM employees;
Questa query sottrae 5 dall’età e crea una nuova colonna. Se age
è NULL, il risultato sarà NULL.
Moltiplicazione (*) e valori NULL
Ecco un esempio di moltiplicazione con un valore NULL.
SELECT id, name, age * 2 AS age_times_two FROM employees;
Questa query moltiplica per 2 l’età e crea una nuova colonna. Se age
è NULL, il risultato sarà NULL.
Divisione (/) e valori NULL
Ecco un esempio di divisione con un valore NULL.
SELECT id, name, age / 2 AS age_divided_by_two FROM employees;
Questa query divide per 2 l’età e crea una nuova colonna. Se age
è NULL, il risultato sarà NULL.
Esempi concreti di operazioni aritmetiche con valori NULL
Di seguito sono riportati esempi concreti di operazioni aritmetiche con valori NULL.
-- Aggiungere 10 all'età e selezionare i dipendenti per i quali il risultato non è NULL
SELECT id, name, age + 10 AS new_age FROM employees WHERE age + 10 IS NOT NULL;
-- Raddoppiare l'età e selezionare i dipendenti per i quali il risultato non è NULL
SELECT id, name, age * 2 AS doubled_age FROM employees WHERE age * 2 IS NOT NULL;
Utilizzando queste query, è possibile osservare l’impatto dei valori NULL sui risultati delle operazioni aritmetiche.
Funzioni e valori NULL
SQL fornisce diverse funzioni utili per gestire i valori NULL. Utilizzando queste funzioni, è possibile trattare correttamente i valori NULL e controllare il risultato delle query in modo prevedibile.
Funzione COALESCE
La funzione COALESCE
restituisce il primo argomento che non è NULL. È utile quando più colonne potrebbero contenere valori NULL.
SELECT id, name, COALESCE(age, 0) AS age FROM employees;
Questa query restituisce 0 se age
è NULL.
Funzione NULLIF
La funzione NULLIF
restituisce NULL se i due argomenti sono uguali, altrimenti restituisce il primo argomento.
SELECT id, name, NULLIF(age, 0) AS age FROM employees;
Questa query restituisce NULL se age
è 0.
Funzione ISNULL (solo SQL Server)
La funzione ISNULL
sostituisce un valore NULL con un valore specificato.
SELECT id, name, ISNULL(age, 0) AS age FROM employees;
Questa query restituisce 0 se age
è NULL.
Funzione IFNULL (solo MySQL)
La funzione IFNULL
sostituisce un valore NULL con un valore specificato.
SELECT id, name, IFNULL(age, 0) AS age FROM employees;
Questa query restituisce 0 se age
è NULL.
Esempi concreti di gestione dei valori NULL con le funzioni
Di seguito sono riportati esempi concreti di gestione dei valori NULL utilizzando diverse funzioni.
-- Impostare a 0 i valori NULL dell'età
SELECT id, name, COALESCE(age, 0) AS age FROM employees;
-- Restituire NULL se l'età è 0
SELECT id, name, NULLIF(age, 0) AS age FROM employees;
-- Solo SQL Server: Impostare a 0 i valori NULL dell'età
SELECT id, name, ISNULL(age, 0) AS age FROM employees;
-- Solo MySQL: Impostare a 0 i valori NULL dell'età
SELECT id, name, IFNULL(age, 0) AS age FROM employees;
Utilizzando queste funzioni, è possibile gestire i valori NULL in modo flessibile.
Istruzioni CASE e valori NULL
L’istruzione CASE è una struttura che restituisce valori diversi in base a determinate condizioni. È utile per gestire i valori NULL, consentendo un trattamento flessibile dei dati.
Struttura di base di un’istruzione CASE
Di seguito è mostrata la struttura di base di un’istruzione CASE.
SELECT id, name,
CASE
WHEN age IS NULL THEN 'Non impostato'
ELSE CAST(age AS VARCHAR)
END AS age_status
FROM employees;
Questa query restituisce la stringa “Non impostato” se age
è NULL, altrimenti restituisce l’età come stringa.
Istruzione CASE con più condizioni
Un’istruzione CASE può gestire più condizioni.
SELECT id, name,
CASE
WHEN age IS NULL THEN 'Età sconosciuta'
WHEN age < 20 THEN 'Meno di 20 anni'
WHEN age BETWEEN 20 AND 30 THEN 'Tra 20 e 30 anni'
ELSE 'Più di 30 anni'
END AS age_category
FROM employees;
Questa query restituisce una diversa categoria in base all’età.
Esempi concreti di istruzioni CASE e valori NULL
Di seguito sono riportati esempi concreti di gestione dei valori NULL con le istruzioni CASE.
-- Gestire i valori NULL come "Non impostato"
SELECT id, name,
CASE
WHEN email IS NULL THEN 'Email non impostata'
ELSE email
END AS email_status
FROM employees;
-- Categorizzare in base all'età e gestire i valori NULL con una stringa specifica
SELECT id, name,
CASE
WHEN age IS NULL THEN 'Età sconosciuta'
WHEN age < 25 THEN 'Giovane'
WHEN age BETWEEN 25 AND 35 THEN 'Adulto'
ELSE 'Senior'
END AS age_group
FROM employees;
Utilizzando queste query, è possibile classificare e visualizzare in modo flessibile i dati contenenti valori NULL in base a determinate condizioni.
Indici e valori NULL
Gli indici vengono utilizzati per migliorare le prestazioni delle query nel database, ma ci sono alcuni aspetti da considerare quando si applica un indice a una colonna che contiene valori NULL.
Indici e valori NULL: le basi
In SQL, è possibile creare indici su colonne che contengono valori NULL. Tuttavia, il modo in cui i valori NULL vengono gestiti può variare a seconda del sistema di gestione del database.
Impatto delle prestazioni sugli indici
Quando si applica un indice a una colonna contenente valori NULL, è necessario considerare l’impatto sulle prestazioni. Creare un indice su una colonna con molti valori NULL può aumentare la dimensione dell’indice.
Esempi concreti di creazione di indici
Di seguito è riportato un esempio concreto di creazione di un indice su una colonna contenente valori NULL.
-- Creazione di un indice
CREATE INDEX idx_email ON employees(email);
-- Query che utilizza l'indice
SELECT * FROM employees WHERE email IS NOT NULL;
Questo indice velocizza la ricerca delle righe in cui email
non è NULL.
Gestione degli indici e dei valori NULL
In alcuni sistemi di gestione dei database, è possibile escludere i valori NULL dall’indice.
-- Esempio di PostgreSQL: Creare un indice che esclude i valori NULL
CREATE INDEX idx_email_non_null ON employees(email) WHERE email IS NOT NULL;
Questo indice include solo le righe in cui email
non è NULL.
Utilizzo efficace degli indici
Ecco alcune best practice per l’utilizzo efficace degli indici su colonne contenenti molti valori NULL.
- Utilizzare indici parziali per escludere i valori NULL
- Utilizzare indici composti per accelerare le ricerche basate su più colonne
- Bilanciare le dimensioni dell’indice con le prestazioni
Esempi concreti di indici composti
Di seguito è riportato un esempio concreto di creazione di un indice composto.
-- Creazione di un indice composto
CREATE INDEX idx_name_email ON employees(name, email);
-- Query che utilizza l'indice composto
SELECT * FROM employees WHERE name = 'John Doe' AND email IS NOT NULL;
Questo indice composto velocizza la ricerca basata su entrambi i campi name
ed email
.
Esercizi pratici
Per approfondire la comprensione dei valori NULL in SQL, abbiamo preparato alcuni esercizi pratici. Questi esercizi permettono di verificare il comportamento degli operatori e delle funzioni con i valori NULL.
Esercizio 1: Operazioni di base sui valori NULL
Utilizzare la seguente tabella per eseguire operazioni di base con i valori NULL.
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);
Esercizio 1.1
Creare una query per selezionare gli studenti il cui punteggio è NULL.
-- Esempio di risposta
SELECT * FROM students WHERE score IS NULL;
Esercizio 1.2
Creare una query per selezionare gli studenti il cui punteggio non è NULL.
-- Esempio di risposta
SELECT * FROM students WHERE score IS NOT NULL;
Esercizio 2: Utilizzo della funzione COALESCE
Utilizzare la funzione COALESCE
per creare una query che restituisca 0 se il punteggio è NULL.
-- Esempio di risposta
SELECT id, name, COALESCE(score, 0) AS score FROM students;
Esercizio 3: Utilizzo dell’istruzione CASE
Utilizzare l’istruzione CASE per creare una query che restituisca “Non impostato” se il punteggio è NULL, “Passato” se il punteggio è 70 o superiore, e “Non passato” altrimenti.
-- Esempio di risposta
SELECT id, name,
CASE
WHEN score IS NULL THEN 'Non impostato'
WHEN score >= 70 THEN 'Passato'
ELSE 'Non passato'
END AS result
FROM students;
Esercizio 4: Condizioni complesse e valori NULL
Creare una query per selezionare gli studenti il cui punteggio è 70 o superiore e il cui nome è ‘Charlie’, assicurandosi che il punteggio non sia NULL.
-- Esempio di risposta
SELECT * FROM students WHERE score >= 70 AND name = 'Charlie' AND score IS NOT NULL;
Questi esercizi ti aiuteranno a rafforzare la comprensione delle operazioni SQL con i valori NULL.
Conclusioni
La gestione dei valori NULL in SQL è di fondamentale importanza nella progettazione del database e nella creazione di query. I valori NULL indicano “assenza di valore” e richiedono un trattamento speciale rispetto agli altri valori. In questo articolo, abbiamo esplorato il comportamento degli operatori e delle funzioni con i valori NULL, la gestione degli indici e fornito esempi pratici di utilizzo.
Comprendere e gestire correttamente i valori NULL migliorerà l’integrità dei dati e l’efficienza delle query. Sarai anche in grado di creare query più flessibili che tengano conto dei valori NULL nei tuoi dati reali.
Ecco i punti chiave dell’articolo:
- Concetto base dei valori NULL: I valori NULL indicano “assenza di valore”.
- Operatori di confronto e logici: I valori NULL non sono uguali agli altri valori; utilizzare IS NULL o IS NOT NULL per verificarli.
- Operatori aritmetici: Il risultato di un’operazione aritmetica con un valore NULL è sempre NULL.
- Funzioni: Utilizzare funzioni come COALESCE e NULLIF per gestire i valori NULL.
- Istruzioni CASE: Utilizzare le istruzioni CASE per gestire i valori NULL con condizioni flessibili.
- Indici: Considerare gli aspetti degli indici sulle colonne che contengono valori NULL.
Utilizzando queste conoscenze, sarai in grado di creare query SQL più robuste ed efficienti.