Perché NOT IN?
La scelta di concentrarsi sull’operatore NOT IN nasce dalla sua utilità negli scenari di esclusione dei dati. Che tu stia ripulendo i dati, preparando report o conducendo analisi complesse, capire come escludere in modo efficace specifici punti dati è prezioso. Questo operatore offre una sintassi semplice, ma presenta sfumature che possono influenzare prestazioni e accuratezza.
La nostra decisione di esplorare a fondo NOT IN punta a fornirti una comprensione completa che ti metta in grado di usarlo con efficacia nelle tue query SQL.
Comprendere SQL NOT IN
Le basi di NOT IN
L’operatore NOT IN si usa all’interno della clausola WHERE per escludere le righe in cui il valore di una colonna specificata corrisponde a uno qualsiasi in un dato elenco di valori. La sua sintassi di base è la seguente:
SELECT column_names
FROM table_name
WHERE column_name NOT IN (value1, value2, ...);
Questa sintassi evidenzia il ruolo dell’operatore nel filtrare i dati, un passaggio fondamentale nell’analisi dei dati e nella gestione dei database.
Applicazioni pratiche di NOT IN
Considera un database che contiene una tabella con le informazioni sui clienti. Se vuoi selezionare i clienti che non provengono da specifiche città, NOT IN diventa uno strumento prezioso, permettendoti di escludere facilmente quelle città dal risultato.
Esempi di NOT IN passo dopo passo
Esempio 1: Escludere valori specifici
Supponiamo di avere una tabella chiamata Customers con le colonne CustomerID, CustomerName e City. Per trovare i clienti che non si trovano a "New York" o "Los Angeles", la query sarà:
|
CustomerlD |
CustomerName |
City |
|
1 |
John Doe |
New York |
|
2 |
Jane Smith |
Los Angeles |
|
3 |
Emily Jones |
Chicago |
|
4 |
Chris Brown |
Miami |
|
5 |
Alex Johnson |
San Francisco |
|
6 |
Jessica White |
New York |
Tabella Customers
SELECT CustomerName, City
FROM Customers
WHERE City NOT IN ('New York', 'Los Angeles');
|
CustomerName |
City |
|
Emily Jones |
Chicago |
|
Chris Brown |
Miami |
|
Alex Johnson |
San Francisco |
Esempio 2: Usare NOT IN con sottoquery
NOT IN può funzionare anche con sottoquery. Ad esempio, per trovare i prodotti che non sono mai stati ordinati:
|
ProductID |
ProductName |
|
1 |
Apple |
|
2 |
Banana |
|
3 |
Orange |
|
4 |
Pear |
|
5 |
Grape |
Tabella Products
|
OrderID |
ProductID |
|
101 |
2 |
|
102 |
4 |
|
103 |
2 |
|
104 |
3 |
Tabella Orders
SELECT ProductName
FROM Products
WHERE ProductID NOT IN (
SELECT ProductID
FROM Orders
);
|
ProductName |
|
Apple |
|
Grape |
Errori comuni e come evitarli
Gestione dei valori NULL
Un problema frequente con NOT IN si presenta quando l’elenco di valori contiene NULL. Poiché NULL rappresenta un valore sconosciuto, qualsiasi confronto con NULL usando NOT IN non restituirà alcuna riga, anche se ci sono righe che logicamente dovrebbero essere escluse dall’elenco.
Per aggirare questo problema, assicurati che l’elenco di valori non contenga NULL oppure usa un approccio alternativo come NOT EXISTS.
Esempio:
Supponiamo di avere una tabella Orders con una colonna CustomerID, alcuni dei quali sono NULL per rappresentare ordini ospite. Se esegui una query per trovare gli ordini non effettuati da determinati clienti, includere NULL nell’elenco farà sì che non venga restituito alcun risultato.
|
OrderID |
CustomerID |
|
101 |
3 |
|
102 |
4 |
|
103 |
2 |
|
104 | |
|
106 |
1 |
Tabella Orders
-- Assume we want to exclude CustomerID 1, 2, and unknown (NULL) customers
SELECT OrderID
FROM Orders
WHERE CustomerID NOT IN (1, 2, NULL);
Questa query non restituirebbe alcuna riga, probabilmente non il risultato desiderato.
Soluzione: Per garantire risultati accurati, evita di includere NULL nell’elenco per NOT IN. In alternativa, usa una combinazione di NOT IN per i valori noti e IS NOT NULL per gestire efficacemente i NULL.
SELECT OrderID
FROM Orders
WHERE CustomerID NOT IN (1, 2) AND CustomerID IS NOT NULL;
|
OrderID |
|
101 |
|
102 |
Considerazioni sulle prestazioni
Per dataset di grandi dimensioni o sottoquery, NOT IN può essere meno efficiente rispetto ad alternative come NOT EXISTS o LEFT JOIN /IS NULL. L’inefficienza deriva dal modo in cui NOT IN confronta ogni riga della tabella con ciascun valore dell’elenco, il che può portare a prestazioni lente su dataset ampi.
Alternative a SQL NOT IN
Usare NOT EXISTS
NOT EXISTS è spesso consigliato rispetto a NOT IN quando si lavora con sottoquery che potrebbero restituire valori NULL. In genere è più efficiente perché si interrompe non appena trova una corrispondenza.
Esempio:
Per trovare i prodotti che non sono mai stati ordinati, usando NOT EXISTS:
SELECT ProductName
FROM Products p
WHERE NOT EXISTS (
SELECT 1
FROM Orders o
WHERE o.ProductID = p.ProductID
);
|
ProductName |
|
Apple |
|
Grape |
Questa query verifica la non esistenza di un prodotto nella tabella degli ordini, il che può essere più efficiente rispetto al confronto con un elenco potenzialmente ampio di ID tramite NOT IN.
LEFT JOIN / IS NULL
Un’altra alternativa efficiente per escludere righe è usare un LEFT JOIN combinato con una clausola WHERE ... IS NULL. Questo metodo è particolarmente efficace per dataset di grandi dimensioni.
Esempio:
Per raggiungere lo stesso obiettivo di trovare i prodotti che non sono stati ordinati:
SELECT p.ProductName
FROM Products p
LEFT JOIN Orders o ON p.ProductID = o.ProductID
WHERE o.ProductID IS NULL;
|
ProductName |
|
Apple |
|
Grape |
Questo metodo sfrutta il LEFT JOIN per includere tutti i prodotti e gli eventuali ordini corrispondenti, quindi filtra i prodotti che hanno ordini usando WHERE o.ProductID IS NULL, escludendoli di fatto.
Best practice per usare NOT IN
- Verifica la presenza di valori
NULLnell’elenco: assicurati che l’elenco usato inNOT INnon contenga valori NULL per evitare risultati imprevisti. - Considera la dimensione del dataset: per dataset di grandi dimensioni o sottoquery, valuta se alternative come
NOT EXISTSpossano offrire prestazioni migliori. - Indicizzazione: assicurati che le colonne usate nella clausola
NOT INsiano indicizzate, quando possibile, per migliorare le prestazioni delle query.
Usare NOT IN in un progetto dati reale
Nell’analisi dei dati, il comando SQL "NOT IN" è comunemente usato per recuperare dati specifici. In questa sezione, lavoreremo con un database di una libreria che tiene traccia del suo inventario (libri disponibili in negozio) e delle vendite (libri venduti). Il nostro obiettivo è identificare quali libri non sono mai stati venduti.
Abbiamo due tabelle:
- Inventory: per memorizzare le informazioni sui libri presenti in libreria.
- Sales: per memorizzare i record dei libri che sono stati venduti.

Tabella Inventory

Tabella Sales
Ora vogliamo scoprire quali libri non sono mai stati venduti.
SELECT Title, Author
FROM Inventory
WHERE BookID NOT IN (
SELECT BookID
FROM Sales
);

Successivamente, vogliamo identificare i libri nel nostro inventario che non sono stati venduti nell’ultimo mese, assumendo che oggi sia il 7 febbraio 2024. Questo comporta il controllo della SaleDate nella tabella Sales rispetto alla nostra data corrente.
SELECT Title, Author
FROM Inventory
WHERE BookID NOT IN (
SELECT BookID
FROM Sales
WHERE SaleDate >= date('now', '-1 month')
);

Conclusione
L’operatore NOT IN è uno strumento versatile in SQL per escludere valori specifici dai risultati delle query. Comprendendone la sintassi, le applicazioni pratiche e le potenziali insidie, potrai usarlo efficacemente nelle tue attività di manipolazione dei dati.
Ricorda di considerare i valori NULL e la dimensione del dataset per ottimizzare prestazioni e accuratezza delle query. Man mano che prendi dimestichezza con NOT IN, lo troverai un’aggiunta preziosa al tuo toolkit SQL, che abilita analisi e gestione dei dati più precise ed efficienti.
Puoi approfondire NOT IN e NOT EXISTS nel nostro corso Improving Query Performance in SQL Server ed esplorare gli operatori SQL e molto altro nel nostro SQL Basics Cheat Sheet e nel percorso di competenze SQL Fundamentals.
In quanto data scientist certificato, sono appassionato di sfruttare tecnologie all’avanguardia per creare applicazioni di machine learning innovative. Con una solida esperienza in riconoscimento vocale, analisi e reportistica dei dati, MLOps, AI conversazionale e NLP, ho affinato le mie competenze nello sviluppo di sistemi intelligenti in grado di avere un impatto concreto. Oltre alla mia expertise tecnica, sono anche un comunicatore efficace, con il talento di rendere chiari e sintetici concetti complessi. Di conseguenza, sono diventato un blogger molto seguito in ambito data science, condividendo idee ed esperienze con una community in crescita di professionisti dei dati. Attualmente mi concentro sulla creazione e sull’editing di contenuti, lavorando con large language model per sviluppare contenuti potenti e coinvolgenti che possano aiutare aziende e singoli a valorizzare al meglio i propri dati.



Nel campo dell’analisi e della gestione dei dati, SQL (Structured Query Language) è uno strumento fondamentale per accedere ai sistemi di database e manipolarli. Tra le sue molte funzioni, l’operatore
NOT INè un mezzo potente per filtrare i dataset, permettendoti di escludere le righe che corrispondono a un determinato elenco di valori. Questo tutorial ha l’obiettivo di demistificare l’operatoreNOT INper chi è alle prime armi e per i professionisti dei dati, garantendo chiarezza nell’applicazione e comprendendone le potenziali insidie.