0Pricing
Coding Interview Prep · Lezione

BETWEEN, IN e limiti inclusivi

Esaminare i casi limite e il modo in cui BETWEEN tratta gli estremi

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

Perché i limiti fanno perdere punti ai candidati

I filtri di intervallo e di insieme sembrano banali, quindi gli intervistatori sfruttano i casi limite. BETWEEN include entrambi gli estremi, IN nasconde un'insidia sottile con NULL e gli intervalli di date sono il punto in cui gli errori di un'unità corrompono silenziosamente i report.

Questa lezione spiega esattamente come BETWEEN tratta i propri estremi, quando IN è più chiaro di una catena di OR e il modello di intervallo semiaperto che i professionisti usano per le date.

BETWEEN include entrambi gli estremi

col BETWEEN a AND b è una forma abbreviata di col >= a AND col <= b. Entrambi gli estremi sono inclusi.

Quindi price BETWEEN 10 AND 20 restituisce anche le righe in cui il prezzo è esattamente 10 o esattamente 20, oltre a tutte quelle intermedie. L'errore più comune nei colloqui consiste nell'affermare che il limite superiore è escluso.

SELECT *
FROM products
WHERE price BETWEEN 10 AND 20;
-- equivalent to: price >= 10 AND price <= 20

L'ordine degli argomenti è importante

BETWEEN richiede prima il valore inferiore. col BETWEEN 20 AND 10 si espande in col >= 20 AND col <= 10, condizione che non può mai essere vera, quindi restituisce zero righe invece di un errore.

Questa è un'insidia molto comune: la query viene eseguita senza errori, non restituisce nulla e il candidato presume che i dati siano vuoti. Inserisca sempre prima il limite minore.

SELECT *
FROM products
WHERE price BETWEEN 20 AND 10;
-- returns NOTHING, not an error

Errore di un'unità nell'intervallo di date

Alla richiesta di trovare tutto gennaio, molti candidati scrivono order_date BETWEEN '2024-01-01' AND '2024-01-31'. Se order_date è un timestamp, questa condizione esclude tutto ciò che avviene dopo la mezzanotte del 31, perché 2024-01-31 significa 2024-01-31 00:00:00.

Un ordine delle 14:00 del 31 gennaio viene escluso. Con colonne di tipo DATE funziona, ma non si può dare per scontato il tipo.

SELECT *
FROM orders
WHERE order_date BETWEEN '2024-01-01' AND '2024-01-31';
-- silently excludes Jan 31 afternoon if order_date is a timestamp

La correzione con un intervallo semiaperto

Il modello professionale per le date è un intervallo semiaperto: maggiore o uguale all'inizio e strettamente minore del periodo successivo. È corretto sia per DATE sia per TIMESTAMP e non richiede di conoscere la risoluzione temporale della colonna.

Noti che il limite superiore è il primo giorno di febbraio, non l'ultimo giorno di gennaio. In questo modo viene incluso ogni istante di gennaio.

SELECT *
FROM orders
WHERE order_date >= '2024-01-01'
  AND order_date <  '2024-02-01';

NOT BETWEEN

col NOT BETWEEN a AND b si espande in col < a OR col > b. Esclude entrambi gli estremi e tutto ciò che si trova tra loro.

Attenzione: se col è NULL, NOT BETWEEN restituisce UNKNOWN, quindi le righe NULL vengono escluse proprio come con un semplice BETWEEN. I valori NULL non soddisfano mai un test di intervallo, in nessuna delle due direzioni.

SELECT *
FROM products
WHERE price NOT BETWEEN 10 AND 20;
-- price < 10 OR price > 20

IN come appartenenza a un insieme

col IN (a, b, c) è una forma abbreviata di col = a OR col = b OR col = c. È il modo più chiaro per verificare l'appartenenza a un piccolo insieme fisso.

Si legge meglio di una catena di OR ed evita completamente il problema del raggruppamento con le parentesi, perché l'intero test dell'insieme costituisce un solo predicato.

SELECT *
FROM orders
WHERE status IN ('pending', 'shipped', 'delivered');

L'insidia di NULL con NOT IN

Questa è la domanda su IN più temuta. Se l'elenco (o la sottoquery) alla base di NOT IN contiene anche un solo NULL, l'intero predicato può restituire UNKNOWN e produrre zero righe.

Il motivo è questo: x NOT IN (1, NULL) diventa x <> 1 AND x <> NULL, e x <> NULL non è mai vero, ma restituisce UNKNOWN. L'intero AND non può mai essere vero.

SELECT *
FROM employees
WHERE manager_id NOT IN (SELECT id FROM managers);
-- returns NOTHING if any managers.id is NULL

Correggere NOT IN

Due correzioni affidabili per l'insidia di NULL con NOT IN:

  • Escludere i NULL dalla sottoquery con WHERE id IS NOT NULL
  • Meglio ancora, riscrivere la condizione come NOT EXISTS, che gestisce correttamente i NULL per sua natura

Gli intervistatori considerano NOT EXISTS la risposta da senior perché evita del tutto l'insidia e spesso produce piani migliori.

SELECT e.*
FROM employees e
WHERE NOT EXISTS (
  SELECT 1 FROM managers m WHERE m.id = e.manager_id
);

IN con una sottoquery

IN accetta una sottoquery che restituisce una colonna. WHERE customer_id IN (SELECT customer_id FROM vip) mantiene le righe il cui cliente appartiene all'insieme VIP.

IN semplice (non NOT IN) è sicuro in presenza di NULL nella sottoquery: un NULL nell'elenco semplicemente non corrisponde mai, ma non contamina le righe che corrispondono. L'insidia riguarda in modo specifico NOT IN.

SELECT *
FROM orders
WHERE customer_id IN (SELECT customer_id FROM vip_customers);

IN su più colonne con costruttori di riga

Una domanda di approfondimento frequente: come si esegue il confronto su più di una colonna contemporaneamente? Passi una tupla a IN usando un costruttore di riga: confronta le colonne in base alla posizione ed è molto più pulito che concatenare OR (a = .. AND b = ..).

  • È leggibile e scalabile per liste lunghe di valori consentiti.
  • Ogni tupla deve elencare le colonne nello stesso ordine.
SELECT *
FROM orders
WHERE (customer_id, status) IN ((101, 'paid'), (102, 'shipped'));

Verifica rapida

Ricordi come BETWEEN tratta i suoi estremi.

Riepilogo

Punti chiave:

  • BETWEEN a AND b include entrambi gli estremi; il limite inferiore deve venire prima, altrimenti si ottengono zero righe
  • Per gli intervalli di timestamp usi un intervallo semiaperto: >= start AND < next_period
  • IN verifica in modo chiaro l'appartenenza a un insieme ed è sicuro con i NULL
  • NOT IN con qualsiasi NULL nell'elenco non restituisce nulla; lo riscriva come NOT EXISTS

Il tema ricorrente è questo: un filtro può essere eseguito perfettamente e restituire comunque, in modo silenzioso, le righe sbagliate.

Domande Frequenti

La lezione «BETWEEN, IN e limiti inclusivi» è gratuita?

Sì — il testo completo di «BETWEEN, IN e limiti inclusivi» è 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 Coding Interview Prep, passa a CoddyKit PRO. Il corso Coding Interview Prep include 4 lezioni in totale.

Cosa imparerò in «BETWEEN, IN e limiti inclusivi»?

Esaminare i casi limite e il modo in cui BETWEEN tratta gli estremi Eserciti Coding 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 Coding Interview Prep?

Non è richiesta alcuna esperienza precedente. Coding 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 2 di 4.

Quanto tempo richiede la lezione «BETWEEN, IN e limiti inclusivi»?

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 Coding Interview Prep?

Sì. Ogni lezione Coding 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. Precedenza di AND/OR e uso delle parentesi
  2. BETWEEN, IN e limiti inclusivi
  3. LIKE, caratteri jolly ed escaping
  4. Filtrare in base a valori calcolati
← Torna a Coding Interview Prep