SQL Quest
Se connecter English 0 XP Niv. 1
Débutant

SQL IN et BETWEEN : listes et intervalles

4 min de lecture · 4 exemples exécutables · mis à jour le 9 octobre 2026

Quand une condition WHERE commence à aligner les OR (« Lyon ou Marseille ou Nantes… ») ou à encadrer une valeur (« entre 10 et 50 »), deux opérateurs rendent la requête plus courte et plus lisible : IN et BETWEEN.

Syntaxe

WHERE colonne IN (valeur1, valeur2, …)
WHERE colonne BETWEEN minimum AND maximum

Comment ça marche

IN : une valeur parmi une liste

ville IN ('Lyon', 'Marseille') est strictement équivalent à ville = 'Lyon' OR ville = 'Marseille'. La liste peut contenir autant de valeurs que nécessaire, et même être remplacée par une sous-requête qui renvoie une liste.

NOT IN fait l'inverse : il garde les lignes dont la valeur n'est dans aucune des valeurs listées.

BETWEEN : un intervalle

prix BETWEEN 10 AND 50 équivaut à prix >= 10 AND prix <= 50 : les deux bornes sont incluses. Il fonctionne aussi avec des dates écrites au format AAAA-MM-JJ et avec des textes (ordre alphabétique).

Schéma

clients
prenomville
LéaLyon
HugoParis
AdamNantes
ZoéLille
résultat
prenomville
LéaLyon
AdamNantes
WHERE ville IN ('Lyon', 'Nantes') : la ligne est gardée si sa valeur figure dans la liste.

Schéma simplifié pour illustrer le principe. Les exemples ci-dessous utilisent la vraie base d'exercices de SQL Quest (une boutique en ligne fictive : voir le schéma complet).

Exemples avec leurs résultats

1. IN avec une liste de villes

Les clients de Lyon ou de Marseille.

SELECT prenom, nom, ville
FROM clients
WHERE ville IN ('Lyon', 'Marseille')
LIMIT 8;
Essayer dans le bac à sable
Résultat
prenomnomville
LéaLaurentMarseille
AliceFaureLyon
ChloéFontaineLyon
YanisChevalierMarseille
ManonFontaineMarseille
SarahMichelLyon
LucasMartinMarseille
LouisMoreauMarseille

8 lignes au total

2. BETWEEN sur des prix

Les produits entre 10 et 20 €, bornes comprises.

SELECT nom, prix
FROM produits
WHERE prix BETWEEN 10 AND 20;
Essayer dans le bac à sable
Résultat
nomprix
Clavier mécanique15
Coussin10,86
Vase céramique18,35
Ballon de foot14,68
Livre de cuisine18,67

5 lignes au total

3. BETWEEN sur des dates

Les commandes passées en janvier 2025.

SELECT id, date_commande, statut
FROM commandes
WHERE date_commande BETWEEN '2025-01-01' AND '2025-01-31'
LIMIT 8;
Essayer dans le bac à sable
Résultat
iddate_commandestatut
722025-01-14en cours
1022025-01-16expédiée
1392025-01-09livrée
2252025-01-19expédiée
2482025-01-14livrée
2592025-01-01en cours
2732025-01-25expédiée
3672025-01-02livrée

8 lignes au total

4. NOT IN

Les commandes qui ne sont ni livrées ni expédiées.

SELECT statut, COUNT(*) AS nb
FROM commandes
WHERE statut NOT IN ('livrée', 'expédiée')
GROUP BY statut;
Essayer dans le bac à sable
Résultat
statutnb
annulée92
en cours109

2 lignes au total

Les erreurs fréquentes

Inverser les bornes de BETWEEN

La plus petite valeur doit venir en premier. BETWEEN 50 AND 10 ne renvoie jamais rien.

À éviter
SELECT * FROM produits WHERE prix BETWEEN 50 AND 10;
Correct
SELECT * FROM produits WHERE prix BETWEEN 10 AND 50;

Oublier les parenthèses de IN

La liste de IN doit toujours être entre parenthèses, avec des virgules.

À éviter
SELECT * FROM clients WHERE ville IN 'Lyon', 'Lille';
Correct
SELECT * FROM clients WHERE ville IN ('Lyon', 'Lille');

NOT IN avec une valeur NULL

Si la liste (ou la sous-requête) de NOT IN contient un NULL, la condition n'est jamais vraie et la requête ne renvoie rien. Préférez NOT EXISTS avec une sous-requête.

À éviter
SELECT * FROM clients WHERE age NOT IN (20, NULL);
Correct
SELECT * FROM clients WHERE age NOT IN (20) AND age IS NOT NULL;

Exercices

Essayez d'écrire la requête vous-même avant d'ouvrir la solution.

Défi 1. Affichez les produits des catégories « Livres » et « Alimentation ».

Voir une solution
SELECT nom, categorie, prix FROM produits WHERE categorie IN ('Livres', 'Alimentation');
nomcategorieprix
Roman policierLivres8,03
Guide SQLLivres25,25
BD aventureLivres9,98
Livre de cuisineLivres18,67
Manga tome 1Livres28,92
Café en grainsAlimentation21,79
Thé vertAlimentation35,83
Chocolat noirAlimentation22,31

10 lignes au total · 8 affichées

Essayer dans le bac à sable

Défi 2. Affichez les employés dont le salaire est compris entre 3 000 et 4 000 €.

Voir une solution
SELECT prenom, nom, salaire FROM employes WHERE salaire BETWEEN 3000 AND 4000;
prenomnomsalaire
NathanMartin3 400
AliceLefebvre3 800
HugoBonnet3 300
ChloéBlanc3 800
InèsFaure3 600
ChloéRoux3 600
LéaGarcia3 500
LouisLambert3 900

8 lignes au total

Essayer dans le bac à sable
Envie de vous entraîner davantage ?

Les exercices interactifs sont corrigés automatiquement, avec un prof qui explique vos erreurs. Une leçon résumée reste affichée à côté de l'éditeur.

Faire les exercices interactifs

Questions fréquentes

BETWEEN inclut-il les bornes ?

Oui. BETWEEN 10 AND 20 garde 10 et 20. Pour exclure une borne, utilisez > et < à la place.

IN est-il plus rapide qu'une suite de OR ?

Le résultat est identique et la plupart des bases l'exécutent de la même façon. IN est surtout plus lisible.

Peut-on mettre une requête dans IN ?

Oui : WHERE id IN (SELECT client_id FROM commandes) garde les clients qui ont passé au moins une commande. C'est une sous-requête.

À lire ensuite