Vai al contenuto principale

Operatore SQL NOT IN: una guida completa per principianti

Padroneggia l'operatore NOT IN di SQL con questa guida per principianti. Impara a filtrare i dati in modo efficace, evitare gli errori più comuni ed esplorare alternative efficienti
· 5 min leggi

Scopri con l'IA

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’operatore NOT IN per chi è alle prime armi e per i professionisti dei dati, garantendo chiarezza nell’applicazione e comprendendone le potenziali insidie.

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 NULL nell’elenco: assicurati che l’elenco usato in NOT IN non contenga valori NULL per evitare risultati imprevisti.
  • Considera la dimensione del dataset: per dataset di grandi dimensioni o sottoquery, valuta se alternative come NOT EXISTS possano offrire prestazioni migliori.
  • Indicizzazione: assicurati che le colonne usate nella clausola NOT IN siano 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.

image4.png

Tabella Inventory

image3.png

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
);

image1.png

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')
);

image2.png

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.

Abid Ali Awan

Autore

Abid Ali Awan

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.

Argomenti

Correlato