IN e NOT IN per gli insiemi
Filtri rispetto a elenchi di valori con IN e NOT IN, impari il problema dei NULL in NOT IN e lo converta in EXISTS per ottenere una semantica sicura
IN e NOT IN per gli insiemi è una lezione SQL Academy gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento SQL Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso SQL Academy include 4 lezioni in totale.
IN: confronto con un elenco
IN è una scorciatoia per molte condizioni OR:
SELECT * FROM users WHERE country IN ('US', 'CA', 'GB');
-- Equivalent to:
SELECT * FROM users
WHERE country = 'US' OR country = 'CA' OR country = 'GB';IN con una sottoquery
È possibile utilizzare una sottoquery sul lato destro:
SELECT * FROM orders
WHERE user_id IN (
SELECT id FROM users WHERE country = 'US'
);NOT IN: escludere un elenco
Escluda le righe corrispondenti:
SELECT * FROM users WHERE status NOT IN ('banned', 'deleted');La trappola dei NULL con NOT IN
Se il lato destro contiene NULL, NOT IN restituisce NULL e le righe in cui il predicato è NULL vengono eliminate. Risultato: zero righe.
-- Suppose blocked_names contains NULL:
SELECT name FROM users
WHERE name NOT IN (SELECT excluded_name FROM blocked_names);
-- → 0 rows, silently
-- Safer: filter out NULLs explicitly, or use NOT EXISTS:
SELECT name FROM users u
WHERE NOT EXISTS (
SELECT 1 FROM blocked_names b WHERE b.excluded_name = u.name
);Perché NOT EXISTS è più sicuro
NOT EXISTS utilizza la semantica standard delle sottoquery correlate ed è sicuro rispetto ai NULL. La maggior parte dei planner lo ottimizza in modo identico a un NOT IN scritto correttamente.
IN e OR: leggibilità
IN è più chiaro delle lunghe catene di OR e spesso il planner lo ottimizza nello stesso modo:
-- Hard to read:
WHERE country = 'US' OR country = 'CA' OR country = 'GB' OR ...
-- Clear:
WHERE country IN ('US', 'CA', 'GB', ...)IN con tuple (costruttori di righe)
Confronti coppie di colonne:
SELECT * FROM order_items
WHERE (order_id, product_id) IN (
(1, 42), (2, 99), (3, 17)
);Utilizzo degli indici
Un elenco IN su una colonna indicizzata può essere eseguito come più ricerche nell'indice (Bitmap Index Scan). In genere è veloce.
-- Plan: Bitmap Index Scan + Bitmap Heap Scan
SELECT * FROM products WHERE id IN (1, 5, 99, 121, 4421);Elenchi IN di grandi dimensioni
Gli elenchi con migliaia di valori possono diventare lenti. Preferisca:
- Un JOIN con una tabella reale o temporanea
= ANY(array)per passare un parametro array
SELECT * FROM products WHERE id = ANY(ARRAY[1,2,3,...]);IN con elenco vuoto
Un elenco IN vuoto non è valido nello standard SQL. Alcuni client passano un valore sentinella; è più sicuro generare la condizione SQL in modo condizionale.
-- Use empty array trick in PostgreSQL:
SELECT * FROM products WHERE id = ANY($1::bigint[]);
-- Pass {} to get zero matches without rewriting the SQL.IN e JOIN
A volte un JOIN è più chiaro di una sottoquery IN:
-- With IN:
SELECT * FROM orders
WHERE user_id IN (SELECT id FROM users WHERE pro);
-- With JOIN:
SELECT o.*
FROM orders o
JOIN users u ON u.id = o.user_id
WHERE u.pro;Riepilogo
IN è la forma più intuitiva per verificare l'appartenenza a un insieme.
- Preferisca IN a OR per una maggiore leggibilità
- NOT IN è rischioso in presenza di NULL: preferisca NOT EXISTS
- Per gli insiemi grandi, utilizzi JOIN o passi array
Verifica rapida
Qual è la sostituzione più sicura di NOT IN (subquery) quando la sottoquery può contenere NULL?
Domande Frequenti
La lezione «IN e NOT IN per gli insiemi» è gratuita?
Sì — il testo completo di «IN e NOT IN per gli insiemi» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso SQL Academy, passa a CoddyKit PRO. Il corso SQL Academy include 4 lezioni in totale.
Cosa imparerò in «IN e NOT IN per gli insiemi»?
Filtri rispetto a elenchi di valori con IN e NOT IN, impari il problema dei NULL in NOT IN e lo converta in EXISTS per ottenere una semantica sicura Eserciti SQL Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare SQL Academy?
Non è richiesta alcuna esperienza precedente. SQL Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.
Quanto tempo richiede la lezione «IN e NOT IN per gli insiemi»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione SQL Academy?
Sì. Ogni lezione SQL Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Pattern LIKE e caratteri jolly
- IN e NOT IN per gli insiemi
- BETWEEN per gli intervalli
- IS NULL, IS NOT NULL e COALESCE