0Pricing
SQL Interview Prep · Lezione

Sottoquery con IN, ANY e ALL

Sottoquery per l'appartenenza a un insieme e la famosa trappola di NOT IN con NULL

Sottoquery con IN, ANY e ALL è una lezione SQL Interview Prep 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 Interview Prep, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso SQL Interview Prep include 4 lezioni in totale.

Sottoquery per l'appartenenza a un insieme

Quando una sottoquery restituisce un elenco di valori, se ne verifica l'appartenenza con IN, ANY o ALL. È così che SQL chiede questo valore appartiene a quell'insieme? oppure è maggiore di ogni elemento o di almeno un elemento di quell'insieme?

  • IN — corrisponde a un valore qualsiasi dell'elenco.
  • ANY/SOME — è vero se il confronto è valido per almeno un elemento.
  • ALL — è vero solo se il confronto è valido per ogni elemento.

IN con una sottoquery

Il caso più comune: trovare i dipendenti che lavorano in un reparto situato in 'NYC'. La sottoquery restituisce un insieme di id dei reparti e IN conserva le righe che corrispondono ad almeno uno di questi.

Questa forma è naturale ed è quella che gli intervistatori si aspettano per prima.

SELECT name
FROM employees
WHERE dept_id IN (
  SELECT id FROM departments WHERE city = 'NYC'
);

= ANY equivale a IN

Un'equivalenza interessante, apprezzata nei colloqui: = ANY (subquery) significa esattamente la stessa cosa di IN (subquery). Entrambe le espressioni sono vere quando il valore è uguale ad almeno un elemento dell'insieme.

La query seguente restituisce esattamente lo stesso risultato della precedente. ANY e il suo sinonimo SOME estendono questo comportamento ad altri operatori, come > e <.

SELECT name
FROM employees
WHERE dept_id = ANY (
  SELECT id FROM departments WHERE city = 'NYC'
);

ANY con un operatore di confronto

ANY diventa potente se usato con > o <. salary > ANY (set) è vero se lo stipendio supera almeno il valore più piccolo — cioè se è maggiore del minimo.

In questo modo si trovano i dipendenti che guadagnano più di almeno una persona del reparto 5.

SELECT name, salary
FROM employees
WHERE salary > ANY (
  SELECT salary FROM employees WHERE dept_id = 5
);

ALL con un operatore di confronto

salary > ALL (set) è vero solo se lo stipendio supera ogni elemento — cioè se è maggiore del massimo. In questo modo si trovano i dipendenti che guadagnano più di tutti nel reparto 5.

Memorizzi la scorciatoia: > ALL = maggiore di MAX, > ANY = maggiore di MIN. Gli intervistatori verificano continuamente questo concetto.

SELECT name, salary
FROM employees
WHERE salary > ALL (
  SELECT salary FROM employees WHERE dept_id = 5
);

NOT IN: la famosa trappola dei NULL

Ecco l'insidia delle sottoquery che viene chiesta più spesso nei colloqui. Se la sottoquery in un NOT IN restituisce anche un solo NULL, l'intero NOT IN può non restituire alcuna riga — non gli elementi orfani che ci si aspettava.

Perché? x NOT IN (1, 2, NULL) si espande in x <> 1 AND x <> 2 AND x <> NULL. Quest'ultimo confronto vale UNKNOWN, quindi l'AND non può mai risultare vero.

SELECT name
FROM customers
WHERE id NOT IN (
  SELECT customer_id FROM orders
);

Perché quella query si interrompe senza avvisare

Se orders.customer_id può contenere NULL e una qualsiasi riga contiene un NULL in quella colonna, la query precedente non restituisce alcuna riga, anche quando esistono chiaramente clienti senza ordini.

  • La presenza di NULL trasforma la logica in UNKNOWN.
  • Non si verifica alcun errore — vengono semplicemente restituiti risultati errati, in questo caso vuoti.

Esplicitare questo rischio durante un colloquio è un segnale molto positivo.

Correggere NOT IN in presenza di NULL

Tre correzioni sicure che gli intervistatori accettano:

  • Escludere i NULL nella sottoquery: aggiungere WHERE customer_id IS NOT NULL.
  • Riscrivere la query usando NOT EXISTS, che gestisce correttamente i NULL.
  • Usare un anti-join LEFT JOIN ... IS NULL.

La versione con il controllo restituisce l'elenco corretto dei clienti senza ordini.

SELECT name
FROM customers
WHERE id NOT IN (
  SELECT customer_id FROM orders
  WHERE customer_id IS NOT NULL
);

IN funziona anche con i NULL

Un'importante precisazione: un semplice IN non negato non viene compromesso dai NULL presenti nell'elenco. x IN (1, 2, NULL) è vero se x è uguale a 1 o 2; il NULL semplicemente non corrisponde mai.

Il rischio legato ai NULL è specifico di NOT IN. Conoscere la differenza tra i due casi è proprio ciò che distingue una risposta sicura da un'ipotesi.

IN su più colonne

Alcuni dialetti, tra cui Postgres e MySQL, consentono di usare IN su una tupla di colonne, confrontando più coppie contemporaneamente. In questo modo si trovano le righe degli ordini la cui combinazione (prodotto, area geografica) compare in una tabella delle promozioni.

SQL Server non supporta IN su valori di riga; in quel caso si dovrebbe riscrivere la query usando EXISTS. Menzionare questa differenza di portabilità fa una buona impressione agli intervistatori.

SELECT *
FROM order_lines
WHERE (product_id, region) IN (
  SELECT product_id, region FROM promotions
);

Frase da colloquio

Dica: "IN verifica l'appartenenza a un insieme ed equivale a = ANY. Con gli operatori di confronto, > ANY significa maggiore del minimo e > ALL significa maggiore del massimo. La trappola principale è usare NOT IN con una sottoquery che può restituire NULL: restituisce silenziosamente nessuna riga, quindi aggiungo un controllo IS NOT NULL o passo a NOT EXISTS."

Questa risposta tocca in un solo respiro l'appartenenza, la semantica di ANY/ALL e la trappola dei NULL.

Verifica rapida

La trappola delle sottoquery preferita dagli intervistatori.

Riepilogo

Sottoquery per l'appartenenza a un insieme, padroneggiate:

  • IN = = ANY: corrisponde a un elemento qualsiasi dell'insieme.
  • > ANY significa maggiore del minimo; > ALL significa maggiore del massimo.
  • NOT IN con un NULL nella sottoquery restituisce silenziosamente nessuna riga — aggiunga un controllo IS NOT NULL oppure usi NOT EXISTS.
  • Un semplice IN tollera i NULL; IN su più colonne funziona in alcuni dialetti.

Prossimo argomento: EXISTS e IN a confronto e la questione delle prestazioni, molto apprezzata nei colloqui per ruoli senior.

Domande Frequenti

La lezione «Sottoquery con IN, ANY e ALL» è gratuita?

Sì — il testo completo di «Sottoquery con IN, 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 Interview Prep, passa a CoddyKit PRO. Il corso SQL Interview Prep include 4 lezioni in totale.

Cosa imparerò in «Sottoquery con IN, ANY e ALL»?

Sottoquery per l'appartenenza a un insieme e la famosa trappola di NOT IN con NULL Eserciti SQL Interview Prep 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 Interview Prep?

Non è richiesta alcuna esperienza precedente. SQL Interview Prep 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 «Sottoquery con IN, 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 Interview Prep?

Sì. Ogni lezione SQL Interview Prep 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 scalari in SELECT e WHERE
  2. Sottoquery nella clausola FROM (tabelle derivate)
  3. Sottoquery con IN, ANY e ALL
  4. Prestazioni di EXISTS rispetto a IN
← Torna a SQL Interview Prep