Gestione corretta dei record che includono NULL in SQL: Come utilizzare le funzioni MAX/MIN

Nella gestione dei database con SQL, la presenza di valori NULL è un problema inevitabile. In particolare, quando si utilizzano funzioni di aggregazione come MAX o MIN, il trattamento dei valori NULL è di fondamentale importanza. In questo articolo, spiegheremo in dettaglio il concetto base di NULL, come trattare i valori NULL in SQL e come utilizzare le funzioni MAX e MIN su dataset contenenti NULL. Questo ti permetterà di migliorare la precisione nelle analisi dei dati e nella gestione del database.

Indice

Che cos’è NULL?

NULL è un marcatore speciale nei database che indica l’assenza di un valore. NULL è diverso da uno zero numerico o da una stringa vuota, poiché significa “sconosciuto” o “non applicabile”. La presenza di NULL segnala una mancanza di dati o un valore non inserito in alcune colonne o record nel database.

Gestione di NULL in SQL

In SQL, NULL è trattato come un valore speciale, richiedendo particolare attenzione. NULL non può essere confrontato con operatori di uguaglianza come = o <>; al suo posto si devono usare condizioni speciali. Inoltre, quando NULL è presente nelle funzioni di aggregazione o nelle operazioni aritmetiche, occorre trattarlo in modo appropriato. Di seguito, illustreremo i punti chiave su come gestire NULL in SQL.

Confronto di NULL

NULL non può essere confrontato direttamente con gli operatori di uguaglianza. Per confrontare NULL si usano IS NULL o IS NOT NULL. Ad esempio, per ottenere i record che contengono NULL in una specifica colonna, si utilizza la seguente query:

SELECT * FROM NomeTabella WHERE NomeColonna IS NULL;

NULL nelle operazioni aritmetiche

Le operazioni aritmetiche che coinvolgono NULL restituiscono NULL come risultato. Ad esempio, se si somma un numero a NULL, il risultato sarà NULL. È importante comprendere questa proprietà per garantire che i calcoli che coinvolgono NULL producano i risultati attesi.

NULL nelle funzioni di aggregazione

Le funzioni di aggregazione (SUM, AVG, MAX, MIN, ecc.) ignorano i valori NULL durante i calcoli. Tuttavia, se il risultato deve considerare NULL, è necessario applicare un trattamento adeguato.

Utilizzo base delle funzioni MAX/MIN

Le funzioni MAX e MIN sono funzioni di aggregazione SQL utilizzate per ottenere il valore massimo e minimo di una colonna specifica. Queste funzioni sono utili per trovare il valore massimo o minimo all’interno di una colonna.

Sintassi di base della funzione MAX

La funzione MAX restituisce il valore massimo della colonna specificata. La sintassi di base è la seguente:

SELECT MAX(NomeColonna) FROM NomeTabella;

Esempio:

SELECT MAX(Prezzo) FROM Prodotti;

Questa query restituisce il valore massimo della colonna “Prezzo” nella tabella “Prodotti”.

Sintassi di base della funzione MIN

La funzione MIN restituisce il valore minimo della colonna specificata. La sintassi di base è la seguente:

SELECT MIN(NomeColonna) FROM NomeTabella;

Esempio:

SELECT MIN(Prezzo) FROM Prodotti;

Questa query restituisce il valore minimo della colonna “Prezzo” nella tabella “Prodotti”.

Raggruppamento con MAX/MIN

Le funzioni MAX/MIN vengono spesso utilizzate insieme alla clausola GROUP BY per calcolare il valore massimo o minimo all’interno di un gruppo specifico.

SELECT Categoria, MAX(Prezzo) FROM Prodotti GROUP BY Categoria;

Questa query raggruppa la tabella “Prodotti” per “Categoria” e restituisce il prezzo massimo all’interno di ogni categoria.

Comportamento di MAX/MIN con dataset che includono NULL

È importante comprendere come funzionano le funzioni MAX e MIN quando sono presenti valori NULL. Queste funzioni ignorano i valori NULL durante il calcolo.

Comportamento della funzione MAX con NULL

La funzione MAX ignora i valori NULL durante il calcolo del valore massimo. Ad esempio, consideriamo il seguente dataset:

SELECT * FROM Prodotti;
ID ProdottoPrezzo
1100
2NULL
3200
4150

Eseguendo la query seguente:

SELECT MAX(Prezzo) FROM Prodotti;

Il risultato sarà 200. NULL viene ignorato e trattato come un valore inesistente.

Comportamento della funzione MIN con NULL

La funzione MIN funziona in modo simile a MAX, ignorando i valori NULL durante il calcolo. Usando lo stesso dataset, eseguendo la seguente query:

SELECT MIN(Prezzo) FROM Prodotti;

Il risultato sarà 100. Anche in questo caso, NULL viene ignorato.

Esempio concreto

Per vedere come funziona in pratica, creiamo una tabella di esempio con i seguenti dati:

CREATE TABLE DatiEsempio (  
    ID INT,  
    Valore INT  
);  

INSERT INTO DatiEsempio (ID, Valore) VALUES (1, 10), (2, NULL), (3, 30), (4, 20);

Eseguendo la query seguente:

SELECT MAX(Valore), MIN(Valore) FROM DatiEsempio;

I risultati saranno i seguenti:

MAX(Valore)MIN(Valore)
3010

Come si può vedere da questo esempio, le funzioni MAX e MIN ignorano i valori NULL durante i calcoli.

Come ignorare NULL

Esistono diversi modi per ignorare i valori NULL durante l’utilizzo delle funzioni MAX e MIN in SQL. Questo permette di garantire che i valori NULL non influenzino il risultato.

Uso della clausola WHERE per filtrare i NULL

Prima di eseguire la query, puoi usare la clausola WHERE per escludere i record che contengono NULL. Ad esempio, puoi escludere i record con valori NULL in questo modo:

SELECT MAX(Valore) FROM DatiEsempio WHERE Valore IS NOT NULL;

Questa query ignora i valori NULL e calcola solo il valore massimo per i record che non contengono NULL.

Uso della condizione IS NOT NULL

Allo stesso modo, puoi usare la clausola WHERE per escludere i valori NULL con la funzione MIN:

SELECT MIN(Valore) FROM DatiEsempio WHERE Valore IS NOT NULL;

Questa query calcola il valore minimo ignorando i record con NULL.

Altri modi per escludere NULL

In alcuni casi, puoi usare una sottoquery per escludere i valori NULL. Ad esempio, puoi creare una sottoquery per rimuovere i NULL:

SELECT MAX(Valore) FROM (SELECT Valore FROM DatiEsempio WHERE Valore IS NOT NULL) AS DatiFiltrati;

Questa query crea una sottoquery che esclude i valori NULL, quindi calcola il valore massimo solo sui dati senza NULL.

Come sostituire NULL con un valore specifico

In SQL, puoi usare la funzione COALESCE per sostituire i valori NULL con un valore specifico. Questo permette di eseguire calcoli anche quando sono presenti valori NULL.

Sintassi di base della funzione COALESCE

La funzione COALESCE restituisce il primo valore non NULL tra quelli specificati. La sintassi di base è la seguente:

COALESCE(Espressione1, Espressione2, ..., EspressioneN)

In questa sintassi, la funzione restituirà il primo valore non NULL tra quelli elencati da Espressione1 a EspressioneN.

Esempio concreto

Ad esempio, se vuoi sostituire i valori NULL con 0, puoi usare la funzione COALESCE in questo modo:

SELECT COALESCE(Valore, 0) FROM DatiEsempio;

Questa query restituisce 0 al posto dei valori NULL.

Ottenere il valore massimo sostituendo NULL con 0

SELECT MAX(COALESCE(Valore, 0)) FROM DatiEsempio;

Questa query restituisce il valore massimo dopo aver sostituito i valori NULL con 0.

Sostituire NULL con una stringa specifica

Puoi anche sostituire i valori NULL in una colonna stringa con una stringa specifica:

SELECT COALESCE(Nome, 'Sconosciuto') FROM Utenti;

Questa query restituisce la stringa ‘Sconosciuto’ se il valore di “Nome” è NULL.

Sostituire NULL con più valori

La funzione COALESCE permette di specificare più valori da verificare, restituendo il primo valore non NULL:

SELECT COALESCE(Valore1, Valore2, 0) FROM DatiEsempio;

Questa query restituisce Valore2 se Valore1 è NULL e restituisce 0 se entrambi sono NULL.

Esempio pratico: gestione dei dati di vendita con NULL

In questo esempio, mostreremo come utilizzare le funzioni MAX e MIN per gestire i dati di vendita che contengono valori NULL.

Creazione di un dataset di esempio

Iniziamo creando una tabella di vendite e inserendo alcuni record:

CREATE TABLE Vendite (  
    IDProdotto INT,  
    ImportoVendita INT  
);  

INSERT INTO Vendite (IDProdotto, ImportoVendita) VALUES  
(1, 1000),  
(2, 1500),  
(3, NULL),  
(4, 2000),  
(5, NULL),  
(6, 2500);

Questa tabella contiene alcuni record in cui l’importo delle vendite è NULL.

Ottenere il valore massimo e minimo ignorando i NULL

Ora, calcoliamo il valore massimo e minimo ignorando i record con NULL nell’importo delle vendite.

SELECT MAX(ImportoVendita) AS MassimoVendita, MIN(ImportoVendita) AS MinimoVendita  
FROM Vendite  
WHERE ImportoVendita IS NOT NULL;

Questa query calcola il valore massimo e minimo ignorando i NULL nell’importo delle vendite.

Risultato

MassimoVendita MinimoVendita
2500 1000

Sostituire i NULL con 0 per ottenere il valore massimo e minimo

Per calcolare il valore massimo e minimo considerando i NULL come 0, usiamo la funzione COALESCE:

SELECT MAX(COALESCE(ImportoVendita, 0)) AS MassimoVendita, MIN(COALESCE(ImportoVendita, 0)) AS MinimoVendita  
FROM Vendite;

Questa query sostituisce i NULL con 0 e calcola il valore massimo e minimo.

Risultato

MassimoVendita MinimoVendita
2500 0

Sostituire NULL con un valore specifico per il calcolo

Ad esempio, se si desidera sostituire i valori NULL con il valore medio delle vendite, si utilizza la seguente query:

WITH MediaVendite AS (  
    SELECT AVG(ImportoVendita) AS MediaImporto  
    FROM Vendite  
    WHERE ImportoVendita IS NOT NULL  
)  
SELECT MAX(COALESCE(ImportoVendita, (SELECT MediaImporto FROM MediaVendite))) AS MassimoVendita,  
       MIN(COALESCE(ImportoVendita, (SELECT MediaImporto FROM MediaVendite))) AS MinimoVendita  
FROM Vendite;

Questa query sostituisce i NULL con l’importo medio delle vendite per calcolare il massimo e il minimo.

Esempi avanzati ed esercizi

Di seguito alcuni esempi avanzati e esercizi per approfondire la comprensione di come gestire i valori NULL nei dati SQL.

Esempio avanzato 1: Aggregazione mensile delle vendite

Aggrega i dati di vendita mensili che includono NULL e calcola il valore massimo e minimo per ogni mese:

CREATE TABLE VenditeMensili (  
    Mese INT,  
    ImportoVendita INT  
);  

INSERT INTO VenditeMensili (Mese, ImportoVendita) VALUES  
(1, 1000),  
(1, 1500),  
(1, NULL),  
(2, 2000),  
(2, NULL),  
(2, 2500);  

SELECT Mese, MAX(COALESCE(ImportoVendita, 0)) AS MassimoVendita, MIN(COALESCE(ImportoVendita, 0)) AS MinimoVendita  
FROM VenditeMensili  
GROUP BY Mese;

Questa query calcola il valore massimo e minimo per ogni mese, trattando i NULL come 0.

Esempio avanzato 2: Calcolo della spesa media per cliente

Calcola la spesa media per ogni cliente, sostituendo i NULL con un valore specifico:

CREATE TABLE StoricoAcquisti (  
    IDCliente INT,  
    ImportoAcquisto INT  
);  

INSERT INTO StoricoAcquisti (IDCliente, ImportoAcquisto) VALUES  
(1, 1000),  
(1, NULL),  
(2, 1500),  
(2, 2000),  
(3, NULL);  

WITH MediaClienti AS (  
    SELECT IDCliente, AVG(COALESCE(ImportoAcquisto, 0)) AS MediaAcquisti  
    FROM StoricoAcquisti  
    GROUP BY IDCliente  
)  
SELECT IDCliente, MediaAcquisti  
FROM MediaClienti;

Questa query calcola la spesa media per ogni cliente, considerando i NULL come 0.

Esercizi

    1. Nel seguente esempio di tabella “Ordini”, calcola il valore massimo e minimo dell’importo degli ordini, considerando 100 come valore minimo per i NULL.

CREATE TABLE Ordini (  
    IDOrdine INT,  
    ImportoOrdine INT  
);  

INSERT INTO Ordini (IDOrdine, ImportoOrdine) VALUES  
(1, 500),  
(2, NULL),  
(3, 1500),  
(4, 2000),  
(5, NULL);  

-- Scrivi qui la query dell'esercizio.

    1. Nella seguente tabella “Prodotti”, calcola il valore massimo e minimo delle scorte, considerando -1 per i valori NULL, raggruppati per categoria di prodotto.

CREATE TABLE Prodotti (  
    IDProdotto INT,  
    Categoria VARCHAR(50),  
    Scorte INT  
);  

INSERT INTO Prodotti (IDProdotto, Categoria, Scorte) VALUES  
(1, 'A', 100),  
(2, 'A', NULL),  
(3, 'B', 200),  
(4, 'B', NULL),  
(5, 'C', 300);  

-- Scrivi qui la query dell'esercizio.

Conclusione

Gestire correttamente i dati che includono NULL in SQL è una delle competenze fondamentali nella gestione di database. In particolare, quando si utilizzano le funzioni MAX e MIN, è importante prestare attenzione al trattamento dei valori NULL. Capire come ignorare i NULL o sostituirli con un valore specifico ti permette di ottenere risultati accurati nelle operazioni di aggregazione. Usando gli esempi pratici e gli esercizi presentati, sarai in grado di applicare queste tecniche per migliorare la precisione nella gestione e nell’analisi dei dati del tuo database.

Indice