SQL BETWEEN : plages inclusives nombres et dates

SQL BETWEEN filtre les lignes dont la valeur d’une colonne tombe dans une plage donnée, en incluant les deux bornes. Il remplace une paire de comparaisons >= et <= par un seul prédicat, ce qui raccourcit les clauses WHERE quand la plage est inclusive. BETWEEN fonctionne avec les nombres, les dates et le texte, mais les plages de dates demandent plus d’attention sur la composante horaire.

Exemple SQL BETWEEN pour filtrer une plage

Sortie :

La sortie apparaîtra ici...

Sortie :

+--------+-------+---------------+
| client | total | date_commande |
+--------+-------+---------------+
| Ben    | 120.5 | 2026-02-15    |
| Cara   | 89.99 | 2026-02-20    |
+--------+-------+---------------+
2 row(s)

Comment cet exemple fonctionne

  1. CREATE TABLE et INSERT préparent une table commandes avec quatre lignes couvrant différents montants et différentes dates.
  2. WHERE total BETWEEN 50 AND 150 conserve seulement les lignes où total >= 50 AND total <= 150. Les deux bornes sont incluses, donc une ligne avec exactement 50 ou 150 correspondrait.
  3. Les lignes avec des montants de 45.00 et 200.00 sont hors de la plage et sont exclues.

x BETWEEN y AND z est équivalent à x >= y AND x <= z. Si l’une des bornes est NULL, le prédicat est évalué comme inconnu et la ligne est filtrée.

Qu’est-ce que SQL BETWEEN ?

SQL BETWEEN vérifie si une valeur appartient à une plage inclusive : column >= low AND column <= high. Pour les plages numériques, la lecture est claire et le comportement prévisible. Certaines bases de données prennent aussi en charge BETWEEN SYMMETRIC, qui inverse les bornes lorsqu’elles sont saisies dans le mauvais ordre.

Erreurs courantes avec SQL BETWEEN

Erreur : utiliser BETWEEN pour des plages de timestamps.

Faux :

WHERE date_commande BETWEEN '2026-02-01' AND '2026-02-28'

Correct :

WHERE date_commande >= '2026-02-01' AND date_commande < '2026-03-01'

Pourquoi : si la colonne inclut l’heure, une date de fin comme '2026-02-28' correspond généralement seulement au début de cette journée. Utilisez un intervalle semi-ouvert pour couvrir toute la journée.

Erreur : inverser les bornes en s’attendant à obtenir des résultats.

Faux :

WHERE total BETWEEN 150 AND 50

Correct :

WHERE total BETWEEN 50 AND 150

Pourquoi : avec BETWEEN standard, la première borne doit être la plus petite valeur. Si les bornes sont inversées, la condition ne peut pas être vraie.

BETWEEN vs IN vs opérateurs de comparaison

ApprocheUtilisez-la quand…
BETWEEN low AND highLa plage est continue et les deux bornes sont incluses
>= low AND < highVous avez besoin d’une borne supérieure exclusive (timestamps, pagination)
IN (a, b, c)Les valeurs sont discrètes, pas une plage continue
> low AND < highLes deux bornes doivent être exclusives

Règle : privilégiez BETWEEN pour les plages numériques inclusives. Passez à des comparaisons explicites lorsqu’une borne doit être exclusive, surtout avec les dates. Utilisez IN pour un ensemble fixe de valeurs ; BETWEEN ferait correspondre des valeurs non voulues dans les intervalles.

Notes de performance

BETWEEN est sargable : l’optimiseur le traite comme >= AND <= et peut utiliser un index B-tree sur la colonne filtrée. Envelopper la colonne dans une fonction (DATE(col), LOWER(col)) empêche l’utilisation de l’index ; normalisez plutôt les bornes. Des plages larges parcourent tout de même beaucoup de lignes, même avec un index, donc la sélectivité compte plus que le choix de l’opérateur.

FAQ

SQL BETWEEN est-il inclusif ou exclusif ?

BETWEEN est inclusif sur les deux bornes. WHERE x BETWEEN 5 AND 10 renvoie les lignes où x vaut 5, 6, 7, 8, 9 ou 10. Il n’existe pas de variante exclusive intégrée ; utilisez > et < pour des bornes exclusives.

Peut-on utiliser BETWEEN avec des valeurs texte ?

Oui. WHERE nom BETWEEN 'A' AND 'M' renvoie les noms qui se trient dans cette plage selon la collation active. Les résultats dépendent des règles de collation et de la sensibilité à la casse de votre base, donc testez votre configuration avant d’utiliser des plages texte en production.

Pourquoi BETWEEN manque des enregistrements à la date de fin ?

Quand la colonne stocke un datetime (date + heure), une borne supérieure comme '2026-02-28' est souvent traitée comme le début de cette journée. Toute ligne plus tard le 28 février sort de la plage. Utilisez un intervalle semi-ouvert (>= debut AND < lendemain) pour couvrir toute la journée.