Torna all'elenco degli articoli Articoli
Tempo di lettura: 8 minuti

Operatore SQL IN

Perché è necessario conoscere l'operatore SQL IN? Scoprite cosa potete fare con questo piccolo ma potente operatore.

L'operatore IN è uno strumento fondamentale di SQL, che consente agli analisti e agli sviluppatori di filtrare e recuperare sottoinsiemi specifici di dati dai database. Anche se il suo utilizzo di base può sembrare semplice, la padronanza delle sfumature e delle applicazioni avanzate dell'operatore SQL IN può migliorare notevolmente le vostre competenze in SQL e portare a query più potenti e ottimizzate.

In questa guida completa, ci addentreremo in profondità nell'operatore SQL IN, esaminandone la sintassi, i casi d'uso, le considerazioni sulle prestazioni e le best practice.

Introduzione all'operatore SQL IN

L'operatore SQL IN viene utilizzato per verificare se un valore corrisponde a un qualsiasi valore di un elenco o di una sottoquery specificati. Fornisce un modo conciso per combinare più condizioni utilizzando la logica OR senza dover scrivere esplicitamente ogni condizione separatamente. Ciò può semplificare notevolmente le query SQL e migliorarne la leggibilità, soprattutto quando si ha a che fare con un gran numero di condizioni.

Se state cercando un punto di partenza per costruire solide basi di SQL, vi consiglio il nostro corso SQL per principianti . Contiene 129 esercizi pratici che vi permetteranno di padroneggiare l'SQL fondamentale e di acquisire sicurezza. Se conoscete già le basi dell'SQL, date un'occhiata al nostro corso Pratica su SQL : contiene oltre 1.000 esercizi che vi aiuteranno ad affinare le vostre capacità.

Utilizzo dell'operatore SQL IN

Uno dei casi più comuni di utilizzo di SQL IN è quello di verificare se un valore corrisponde a uno qualsiasi di un elenco. Ecco un esempio:

SELECT *
FROM employees
WHERE department_id IN (10, 20, 30);

In questa query, l'operatore SQL IN viene utilizzato per recuperare tutte le righe dalla tabella employees in cui il valore department_id è 10, 20 o 30.

Sintassi dell'operatore IN

L'operatore SQL IN funge da abbreviazione per più condizioni OR sullo stesso campo, rendendo la query più concisa e leggibile. Ecco la sintassi di base:

SELECT column1, column2, ...
FROM table_name
WHERE column_name IN (value1, value2, ...);

Uso dell'operatore SQL NOT IN

L'operatore SQL NOT IN è il contrario dell'operatore SQL IN. Viene utilizzato per recuperare i record il cui valore non corrisponde ad alcun valore dell'elenco specificato. Ecco un esempio:

SELECT *
FROM products
WHERE product_category NOT IN ('Electronics', 'Clothing');

Questa query recupera tutte le righe della tabella products in cui product_category non è "Elettronica" o "Abbigliamento".

Uso di IN con SELECT

L'operatore SQL IN può essere utilizzato anche in combinazione con una sottoquery, ovvero una query annidata all'interno di un'altra query. Questa potente combinazione consente di filtrare i dati in base ai risultati di un'altra query. Ecco un esempio:

SELECT product_name, product_price
FROM products
WHERE product_id IN (
SELECT product_id FROM orders WHERE order_date >= '2023-01-01'
);

In questa query, la sottoquery SELECT product_id FROM orders WHERE order_date >= '2023-01-01' recupera un elenco di valori product_id per gli ordini effettuati a partire dal 1° gennaio 2023. La query principale utilizza quindi l'operatore IN per recuperare i valori product_name e product_price per tutti i prodotti il cui product_id è presente nell'elenco restituito dalla sottoquery.

Questo è solo un esempio di come si possa utilizzare una sottoquery in un operatore IN. Esistono numerosi tipi di subquery che si possono scrivere in SQL, ma per una migliore comprensione si consiglia di dare un'occhiata ad altri esempi di utilizzo di una subquery.

Uso di NOT IN con SELECT

Come nell'esempio precedente, è possibile utilizzare l'operatore NOT IN con una sottoquery per recuperare i record che non corrispondono ai risultati della sottoquery. Ecco un esempio:

SELECT employee_name, department_name
FROM employees
WHERE department_id NOT IN (SELECT department_id
 FROM departments
 WHERE location = 'New York');

Questa query recupera il nome_dipendente e il nome_reparto per tutti i dipendenti che non fanno parte di reparti situati a New York. La sottoquery SELECT department_id FROM departments WHERE location = 'New York' recupera un elenco di valori department_id per i reparti situati a New York. La query principale utilizza quindi l'operatore SQL NOT IN per escludere i dipendenti il cui department_id è presente nell'elenco restituito dalla sottoquery.

Esercizio: Sfida all'operatore IN

Dopo aver letto i diversi modi in cui l'operatore IN può essere utilizzato per risolvere problemi SQL complessi, è il momento di mettere in pratica quanto appreso.

Immaginate di lavorare con un database che contiene informazioni sui libri. Il database ha una tabella chiamata Books con le seguenti colonne: BookID, Title, AuthorID, e GenreID. C'è un'altra tabella, chiamata Generi, con le colonne GenreID e GenreName. Ecco un esempio di alcune righe contenute in queste tabelle.

La Books tabella:

BookIDTitleAuthorIDGenreID
1The Hitchhiker's Guide to the Galaxy11
2Dune21
3The Lord of the Rings32
4The Da Vinci Code43
5Harry Potter and the Sorcerer’s Stone52
6The Girl on the Train63
7Pride and Prejudice74

La tabella Genres tabella:

GenreIDGenreName
1Science Fiction
2Fantasy
3Mystery
4Romance
5Non-Fiction

La sfida è scrivere una query SQL che selezioni tutti i titoli di libri che appartengono ai generi "Fantascienza", "Fantasy" o "Mistero". (Si supponga di non conoscere già i valori di GenreID per questi generi).

Soluzione:

SELECT Title
FROM Books
WHERE GenreID IN (SELECT GenreID 
  FROM Genres 
  WHERE GenreName = 'Science Fiction' 
    OR GenreName = 'Fantasy' 
    OR GenreName = 'Mystery');

Spiegazione:

Selezionare i titoli dei libri dalla tabella Books dalla tabella. Filtrare i risultati utilizzando una clausola WHERE con l'operatore IN per includere solo le righe in cui GenreID è uguale a GenreID nella tabella per "Fantascienza", "Fantasy" o "Mistero". Genres per "Fantascienza", "Fantasy" o "Mistero".

In alternativa, si può scrivere una query che utilizzi due operatori IN:

SELECT Title
FROM Books
WHERE GenreID IN (SELECT GenreID 
  FROM Genres 
  WHERE GenreName 
  IN ('Science Fiction','Fantasy','Mystery'));

Risultato:

Title
The Hitchhiker's Guide to the Galaxy
Dune
The Lord of the Rings
Harry Potter and the Sorcerer's Stone
The Da Vinci Code
The Girl on the Train

Esempi di IN avanzato e casi d'uso

Sebbene l'uso di base dell'operatore SQL IN sia relativamente semplice, la sua vera potenza risiede nella capacità di gestire scenari complessi e casi d'uso avanzati. Esploriamo alcuni di questi:

Subquery correlate

Le subquery correlate sono subquery che fanno riferimento a colonne della query esterna. Ciò consente di filtrare i dati in base a criteri complessi che coinvolgono più tabelle e condizioni. Ecco un esempio:

SELECT product_name, category_name
FROM products p
JOIN categories c ON p.category_id = c.category_id
WHERE p.product_id IN (SELECT product_id
  FROM order_items oi
  WHERE oi.order_id IN (SELECT order_id
FROM orders
WHERE customer_id = 1001));

In questa query, la sottoquery più interna recupera i valori di order_id per un cliente specifico. La sottoquery centrale utilizza quindi i valori di order_id per recuperare i valori corrispondenti di product_id dalla tabella order_items tabella. Infine, la query principale utilizza l'operatore SQL IN per recuperare i valori product_name e category_name per quei prodotti.

Le sottoquery correlate sono solo uno dei modi avanzati in cui è possibile utilizzare l'operatore IN. Per comprendere a fondo tutti i tipi di subquery, vi consigliamo questi 15 esercizi pratici sulle subquery.

Gestione di grandi elenchi di valori

Quando si lavora con elenchi di valori di grandi dimensioni, l'uso di una subquery o di una tabella temporanea può essere più efficiente rispetto all'elencazione di tutti i valori nella clausola SQL IN. Ciò può migliorare le prestazioni della query e ridurre il rischio di incorrere in limiti di lunghezza imposti dal sistema di gestione dei database. Ecco un esempio:

-- Create a temporary table with the desired values
CREATE TEMPORARY TABLE temp_values (value INT);
INSERT INTO temp_values (value) VALUES (10), (20), (30), ...;
-- Use the temporary table with the SQL IN operator
SELECT *
FROM employees
WHERE department_id IN (SELECT value FROM temp_values);

In questo esempio, viene creata una tabella temporanea temp_values viene creata e popolata con i valori desiderati. La query principale utilizza quindi una sottoquery per recuperare i valori dalla tabella temporanea e filtrare la tabella di conseguenza. employees tabella.

Combinazione di IN con altri operatori

L'operatore IN può essere combinato con altri operatori SQL, come AND e OR, per creare condizioni di filtraggio più complesse. Ciò consente di gestire scenari in cui è necessario filtrare i dati in base a più criteri che coinvolgono operatori diversi. Ecco un esempio:

SELECT *
FROM orders
WHERE order_date >= '2023-01-01'
  AND customer_id IN (SELECT customer_id
 FROM customers
 WHERE country = 'USA')
  AND total_amount > 1000;

In questa query, IN viene utilizzato in combinazione con AND per filtrare gli ordini in base alla data dell'ordine, al paese del cliente e all'importo totale.

Ora è il momento di esercitarsi con l'uso di SQL IN

L'operatore IN è uno strumento potente e versatile che può semplificare notevolmente l'analisi dei dati SQL e le attività di reporting. Comprendendone la sintassi, l'utilizzo avanzato, le considerazioni sulle prestazioni e le best practice, è possibile sfruttare IN per filtrare e recuperare efficacemente i dati rilevanti dai database, garantendo al contempo prestazioni ottimali delle query e la loro manutenibilità.

Grazie per aver letto il nostro articolo; speriamo che vi sia piaciuto conoscere le potenti funzioni dell'operatore SQL IN. Se siete alle prime armi con SQL, date un'occhiata al nostro corso interattivo SQL per principianti. Se invece siete utenti esperti di SQL e volete fare pratica, date un'occhiata al nostro corso Pratica su SQL . Buon apprendimento!