0Pricing
SQL Academy · Lezione

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 EXISTS quando 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:

  • IN verifica l'appartenenza: è vero se il valore corrisponde a un elemento qualsiasi dell'elenco o della sottoquery.
  • = ANY equivale a IN; usare altri operatori come > ANY significa che la condizione è vera per almeno una corrispondenza.
  • ALL significa che la condizione deve essere valida per ogni valore restituito dalla sottoquery.
  • NOT IN restituisce silenziosamente zero righe quando la sottoquery contiene NULL: verificate sempre questo caso.
  • Usate NOT EXISTS come alternativa più sicura a NOT IN quando 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

  1. Sottoquery correlate
  2. EXISTS e NOT EXISTS
  3. IN a confronto con ANY e ALL
  4. Prestazioni di EXISTS e JOIN
← Torna a SQL Academy