Trattamento dei valori NULL in SQL: Operatori e Funzioni spiegati

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.

Indice

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.

Indice