IN a confronto con ANY e ALL
Confronti i dati con insiemi di valori
IN a confronto con ANY e ALL è una lezione SQL Academy gratuita su CoddyKit. Questa è la lezione 3 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.
Che cosa sono IN, ANY e ALL?
Quando scrivete query SQL, spesso dovete confrontare un valore con un insieme di valori. SQL mette a disposizione tre potenti operatori per farlo: IN, ANY e ALL.
Tutti e tre possono funzionare con sottoquery che restituiscono un elenco di valori. Sembrano simili, ma si comportano in modo diverso: scegliere quello giusto può rendere la query più espressiva ed efficiente.
L'operatore IN
L'operatore IN verifica se un valore corrisponde a uno qualsiasi dei valori di un elenco o del risultato di una sottoquery. È il più semplice dei tre.
L'esempio seguente recupera i dipendenti che lavorano nei reparti Sales, HR o Engineering.
SELECT name, department
FROM employees
WHERE department IN ('Sales', 'HR', 'Engineering');IN con una sottoquery
IN diventa particolarmente potente quando viene usato insieme a una sottoquery. Invece di un elenco definito direttamente nella query, potete recuperare i valori da confrontare direttamente da un'altra tabella.
In questo caso, troviamo tutti i dipendenti che appartengono a un reparto con un budget superiore a 100.000.
SELECT name, department
FROM employees
WHERE department IN (
SELECT dept_name
FROM departments
WHERE budget > 100000
);L'operatore ANY
ANY (scritto anche come SOME) confronta un valore con ciascun valore restituito da una sottoquery usando un operatore di confronto come =, >, <, >= o <=.
La condizione è vera se il confronto è vero per almeno un valore del risultato della sottoquery.
SELECT name, salary
FROM employees
WHERE salary > ANY (
SELECT salary
FROM employees
WHERE department = 'HR'
);= ANY equivale a IN
È importante conoscere questa equivalenza: = ANY (subquery) è logicamente identico a IN (subquery). Entrambi restituiscono true quando il valore corrisponde ad almeno un risultato della sottoquery.
Queste due query producono lo stesso risultato:
-- Using IN
SELECT name FROM employees
WHERE department_id IN (SELECT id FROM departments WHERE location = 'NYC');
-- Using = ANY
SELECT name FROM employees
WHERE department_id = ANY (SELECT id FROM departments WHERE location = 'NYC');L'operatore ALL
ALL confronta un valore con ogni valore restituito da una sottoquery. La condizione è vera solo se il confronto è valido per tutti i valori restituiti.
Questo esempio trova i dipendenti il cui stipendio è superiore a ogni stipendio del livello Intern, ovvero che guadagnano più dello stagista più pagato.
SELECT name, salary
FROM employees
WHERE salary > ALL (
SELECT salary
FROM employees
WHERE job_grade = 'Intern'
);ANY e ALL a confronto
La differenza fondamentale è questa: ANY richiede che la condizione sia vera per almeno un valore, mentre ALL richiede che sia vera per ogni valore.
Pensatela in questo modo: ANY equivale a un OR tra tutti i confronti, mentre ALL equivale a un AND tra tutti i confronti.
-- Returns rows where salary > at least one value in the subquery
SELECT name, salary FROM employees
WHERE salary > ANY (SELECT salary FROM employees WHERE department = 'Support');
-- Returns rows where salary > every value in the subquery
SELECT name, salary FROM employees
WHERE salary > ALL (SELECT salary FROM employees WHERE department = 'Support');NOT IN e <> ALL
Così come = ANY corrisponde a IN, l'operatore <> ALL è equivalente a NOT IN. Entrambi restituiscono true solo quando il valore non corrisponde ad alcun valore della sottoquery.
Fate però attenzione: se la sottoquery restituisce anche un solo NULL, NOT IN non restituirà alcuna riga a causa della logica a tre valori di SQL.
-- Using NOT IN
SELECT name FROM employees
WHERE department_id NOT IN (SELECT id FROM departments WHERE location = 'Remote');
-- Using <> ALL (equivalent)
SELECT name FROM employees
WHERE department_id <> ALL (SELECT id FROM departments WHERE location = 'Remote');Il problema dei NULL con NOT IN
Un problema importante da conoscere è il seguente: se la sottoquery usata con NOT IN restituisce un NULL, l'intera condizione NOT IN viene valutata come UNKNOWN per ogni riga e il risultato sarà un insieme vuoto.
Per evitarlo, filtrate i NULL dalla sottoquery oppure usate NOT EXISTS, che gestisce i NULL in modo sicuro.
-- Dangerous: if manager_id has any NULL, no rows are returned
SELECT name FROM employees
WHERE id NOT IN (SELECT manager_id FROM employees);
-- Safe: filter NULLs explicitly
SELECT name FROM employees
WHERE id NOT IN (
SELECT manager_id FROM employees
WHERE manager_id IS NOT NULL
);Esempio pratico: trovare i dipendenti con gli stipendi più alti
Vediamo tutti e tre gli operatori applicati a uno scenario realistico. Abbiamo una tabella employees con le colonne name, department e salary.
Vogliamo trovare i dipendenti che guadagnano più dello stipendio medio di almeno un reparto, cioè più della media di un qualsiasi reparto.
SELECT name, salary
FROM employees
WHERE salary > ANY (
SELECT AVG(salary)
FROM employees
GROUP BY department
)
ORDER BY salary DESC;Quando usare ciascun operatore?
Ecco una guida rapida per scegliere tra i tre operatori:
- IN: quando avete un elenco statico o vi serve un semplice confronto di uguaglianza con il risultato di una sottoquery.
- = ANY: equivale a IN, ma vi permette di usare altri operatori di confronto come
>e<. - ALL: quando la condizione deve essere valida per ogni valore, ad esempio maggiore del massimo senza usare MAX.
- NOT IN: comodo, ma fate attenzione ai NULL; preferite
NOT EXISTSquando la sottoquery potrebbe contenerne.
Verifica rapida
Verificate la vostra comprensione di IN, ANY e ALL.
Riepilogo della lezione
In questa lezione avete imparato a confrontare i valori con un insieme usando IN, ANY e ALL.
Punti chiave:
INverifica l'appartenenza: è vero se il valore corrisponde a un elemento qualsiasi dell'elenco o della sottoquery.= ANYequivale aIN; usare altri operatori come> ANYsignifica che la condizione è vera per almeno una corrispondenza.ALLsignifica che la condizione deve essere valida per ogni valore restituito dalla sottoquery.NOT INrestituisce silenziosamente zero righe quando la sottoquery contiene NULL: verificate sempre questo caso.- Usate
NOT EXISTScome alternativa più sicura aNOT INquando potrebbero essere presenti valori NULL.
Domande Frequenti
La lezione «IN a confronto con ANY e ALL» è gratuita?
Sì — il testo completo di «IN a confronto con ANY e ALL» è 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 a confronto con ANY e ALL»?
Confronti i dati con insiemi di valori 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 3 di 4.
Quanto tempo richiede la lezione «IN a confronto con ANY e ALL»?
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
- Sottoquery correlate
- EXISTS e NOT EXISTS
- IN a confronto con ANY e ALL
- Prestazioni di EXISTS e JOIN