SQL Interview Prep · Leçon

BETWEEN, IN et limites inclusives

Les cas particuliers aux limites et la façon dont BETWEEN traite les bornes

Leçon 2 sur 413 étapes

BETWEEN, IN et limites inclusives est une leçon SQL Interview Prep gratuite sur CoddyKit. Ceci est la leçon 2 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage SQL Interview Prep, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours SQL Interview Prep comprend 4 leçons au total.

Pourquoi les bornes font perdre des points aux candidats

Les filtres de plage et d'ensemble semblent élémentaires, alors les recruteurs exploitent les cas limites. BETWEEN inclut les deux bornes, IN dissimule un piège subtil lié à NULL, et les plages de dates sont à l'origine d'erreurs de décalage d'une unité qui faussent silencieusement les rapports.

Cette leçon explique précisément comment BETWEEN traite ses bornes, quand IN est plus clair qu'une chaîne de OR, ainsi que le modèle d'intervalle semi-ouvert que les professionnels utilisent pour les dates.

BETWEEN est inclusif aux deux extrémités

col BETWEEN a AND b est un raccourci pour col >= a AND col <= b. Les deux bornes sont incluses.

Ainsi, price BETWEEN 10 AND 20 renvoie aussi les lignes où le prix vaut exactement 10 ou exactement 20, ainsi que toutes celles comprises entre ces deux valeurs. La réponse incorrecte la plus fréquente en entretien consiste à affirmer que la borne supérieure est exclue.

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

L'ordre des arguments est important

BETWEEN exige de placer la valeur inférieure en premier. col BETWEEN 20 AND 10 se développe en col >= 20 AND col <= 10, ce qui ne peut jamais être vrai : la requête renvoie donc zéro ligne plutôt qu'une erreur.

C'est un piège très apprécié : la requête s'exécute correctement, ne renvoie rien, et le candidat suppose que les données sont vides. Placez toujours la borne la plus petite en premier.

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

L'erreur de décalage d'une unité dans les plages de dates

Si l'on vous demande tout le mois de janvier, beaucoup de candidats écrivent order_date BETWEEN '2024-01-01' AND '2024-01-31'. Si order_date est un horodatage, cela exclut tout ce qui se passe après minuit le 31, car 2024-01-31 signifie 2024-01-31 00:00:00.

Une commande passée à 14 h le 31 janvier est exclue. Avec des colonnes DATE pures, cela fonctionne, mais vous ne pouvez pas supposer le type.

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 correction avec un intervalle semi-ouvert

Pour les dates, le modèle professionnel est un intervalle semi-ouvert : supérieur ou égal au début, et strictement inférieur à la période suivante. Il est correct pour DATE comme pour TIMESTAMP et ne nécessite aucune connaissance de la résolution temporelle de la colonne.

Remarquez que la borne supérieure est le premier jour de février, et non le dernier jour de janvier. Cela couvre chaque instant du mois de janvier.

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

NOT BETWEEN

col NOT BETWEEN a AND b se développe en col < a OR col > b. Il exclut les deux bornes ainsi que toutes les valeurs comprises entre elles.

Attention : si col vaut NULL, NOT BETWEEN s'évalue à UNKNOWN, et les lignes NULL sont donc exclues, comme avec un BETWEEN simple. Les valeurs NULL ne satisfont jamais une vérification de plage, quel que soit le sens.

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

IN comme appartenance à un ensemble

col IN (a, b, c) est un raccourci pour col = a OR col = b OR col = c. C'est la manière claire de vérifier l'appartenance à un petit ensemble fixe.

La lecture est meilleure qu'avec une chaîne de OR, et le problème de parenthésage lié à la priorité disparaît entièrement, puisque toute la vérification d'appartenance forme un seul prédicat.

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

Le piège de NOT IN avec NULL

C'est la question sur IN qui inquiète le plus. Si la liste (ou la sous-requête) utilisée par NOT IN contient une seule valeur NULL, le prédicat entier peut s'évaluer à UNKNOWN et renvoyer zéro ligne.

La raison : x NOT IN (1, NULL) devient x <> 1 AND x <> NULL, et x <> NULL n'est jamais vrai : sa valeur est UNKNOWN. L'ensemble du AND ne peut donc jamais être vrai.

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

Corriger NOT IN

Deux corrections robustes au piège de NOT IN avec NULL :

  • Excluez les valeurs NULL de la sous-requête avec WHERE id IS NOT NULL
  • Mieux encore, réécrivez la requête avec NOT EXISTS, qui gère correctement les valeurs NULL par conception

Les recruteurs considèrent NOT EXISTS comme la réponse d'un candidat confirmé, car cette solution évite entièrement le piège et produit souvent un meilleur plan d'exécution.

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

IN avec une sous-requête

IN accepte une sous-requête qui renvoie une colonne. WHERE customer_id IN (SELECT customer_id FROM vip) conserve les lignes dont le client appartient à l'ensemble VIP.

IN simple, contrairement à NOT IN, est sûr lorsque la sous-requête contient des valeurs NULL : une valeur NULL dans la liste ne correspond simplement à aucune ligne, mais elle n'invalide pas les lignes qui correspondent. Le piège est propre à NOT IN.

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

IN multicolonne avec constructeurs de lignes

Une question complémentaire courante : comment comparer plusieurs colonnes à la fois ? Passez un tuple à IN au moyen d’un constructeur de ligne : la comparaison se fait par position et est bien plus claire que d’enchaîner OR (a = .. AND b = ..).

  • Cette écriture est claire et s’adapte aux longues listes d’autorisation.
  • Chaque tuple doit énumérer les colonnes dans le même ordre.
SELECT *
FROM orders
WHERE (customer_id, status) IN ((101, 'paid'), (102, 'shipped'));

Vérification rapide

Rappelez-vous comment BETWEEN traite ses bornes.

Récapitulatif

Points essentiels :

  • BETWEEN a AND b inclut les deux bornes ; la borne inférieure doit venir en premier, sinon vous obtenez zéro ligne
  • Pour les plages d'horodatages, utilisez un intervalle semi-ouvert : >= start AND < next_period
  • IN vérifie clairement l'appartenance à un ensemble et gère correctement les valeurs NULL
  • NOT IN avec une valeur NULL dans la liste ne renvoie rien ; réécrivez la requête avec NOT EXISTS

Le thème récurrent est le suivant : un filtre peut s'exécuter parfaitement tout en renvoyant discrètement les mauvaises lignes.

Gratuit pour commencer

Apprends SQL avec un tuteur IA — gratuit

Écris et exécute du vrai code dans ton navigateur, obtiens de l'aide instantanée d'un tuteur IA disponible 24h/24, et reprends là où tu t'es arrêté sur le web ou dans l'app.

Cours
30
Leçons
120

Questions Fréquemment Posées

La leçon « BETWEEN, IN et limites inclusives » est-elle gratuite ?

Oui — le texte complet de « BETWEEN, IN et limites inclusives » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours SQL Interview Prep, passe à CoddyKit PRO. Le cours SQL Interview Prep comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « BETWEEN, IN et limites inclusives » ?

Les cas particuliers aux limites et la façon dont BETWEEN traite les bornes Tu pratiques SQL Interview Prep avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer SQL Interview Prep ?

Aucune expérience préalable n'est requise. SQL Interview Prep sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 2 sur 4.

Combien de temps prend la leçon « BETWEEN, IN et limites inclusives » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon SQL Interview Prep ?

Oui. Chaque leçon SQL Interview Prep inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Priorité de AND et OR et usage des parenthèses
  2. BETWEEN, IN et limites inclusives
  3. LIKE, caractères génériques et échappement
  4. Filtrer sur des valeurs calculées
← Retour à SQL Interview Prep