OUJOOD.COM
Définition de l'opérateur SQL IN
L'opérateur SQL IN est un opérateur de comparaison qui permet de tester si une valeur appartient à une liste de valeurs prédéfinies. Très utilisé dans les requêtes de filtrage, il simplifie l'écriture de conditions multiples reliées par OR et améliore la lisibilité du code SQL. Il s'applique dans les clauses WHERE et HAVING des instructions SELECT, UPDATE et DELETE.
En termes de performance, SQL IN est équivalent à une série de conditions OR, mais son écriture est beaucoup plus concise. Lorsqu'il est couplé à une sous-requête, il devient un outil de filtrage dynamique particulièrement puissant, exploité dans les architectures de bases de données relationnelles modernes (MySQL, PostgreSQL, SQL Server, Oracle, SQLite).
Syntaxe de l'opérateur SQL IN
La syntaxe générale de l'opérateur IN pour une liste de valeurs statiques est la suivante :
expression IN (valeur1, valeur2, ..., valeurN)
Pour une sous-requête dynamique, la syntaxe devient :
expression IN (SELECT colonne FROM table WHERE condition)
Les éléments de la syntaxe sont :
- expression : une colonne ou une expression SQL dont la valeur sera testée.
- valeur1 … valeurN : les valeurs candidates, qui peuvent être des chaînes, des entiers, des dates ou tout type compatible avec expression.
- sous-requête : une requête SELECT retournant une colonne de valeurs utilisées comme liste de comparaison dynamique.
La forme négative NOT IN exclut toutes les lignes dont la valeur figure dans la liste :
expression NOT IN (valeur1, valeur2, ..., valeurN)
Exemples pratiques commentés
Les exemples suivants illustrent les usages les plus courants de l'opérateur SQL IN dans des requêtes SELECT, UPDATE et DELETE. Chaque exemple est accompagné de commentaires pédagogiques pour en comprendre le fonctionnement.
Exemple 1 — Filtrer des produits par prix exact avec SELECT IN
Cet exemple montre comment récupérer uniquement les produits dont le prix correspond à l'une des valeurs listées, sans recourir à plusieurs conditions OR.
SELECT id, nom, prix FROM produits -- IN remplace : WHERE prix = 10 OR prix = 15 OR prix = 20 WHERE prix IN (10, 15, 20); -- Mise à jour du stock pour deux références produit spécifiques UPDATE produits SET stock = stock + 10 -- Seuls PROD1 et PROD2 seront affectés par cette mise à jour WHERE code IN ('PROD1', 'PROD2'); -- Suppression ciblée : retirer les clients âgés de 19, 20 ou 21 ans DELETE FROM clients WHERE age IN (19, 20, 21);
Exemple 2 — Filtrer des clients par pays avec SQL IN
Cas d'usage classique du filtrage multi-valeurs avec SQL IN : récupérer tous les clients situés dans une liste de pays, idéal pour des rapports régionaux ou des campagnes marketing ciblées.
-- Sélectionner tous les clients situés en France, Allemagne ou Italie SELECT id, nom, email, pays FROM clients -- La liste peut contenir autant de valeurs que nécessaire WHERE pays IN ('France', 'Allemagne', 'Italie');
Exemple 3 — Mise à jour conditionnelle avec UPDATE IN
L'opérateur IN dans une requête UPDATE permet de modifier en une seule instruction plusieurs lignes correspondant à des identifiants ou valeurs spécifiques.
-- Renommer les produits dont le prix figure dans la liste UPDATE produits SET nom = 'Produit premium' -- On cible exactement les prix 101, 102 et 103 € WHERE prix IN (101, 102, 103);
Exemple 4 — Suppression avec DELETE IN et liste de dates
Le DELETE combiné à SQL IN permet de purger des enregistrements précis sans risque de supprimer des données non ciblées, contrairement à une condition de plage avec BETWEEN.
-- Supprimer les utilisateurs nés à des dates précises DELETE FROM utilisateurs -- Les dates doivent respecter le format ISO 8601 (AAAA-MM-JJ) WHERE date_naissance IN ('1989-01-01', '1988-06-15', '1987-03-22');
Exemple 5 — SQL IN avec sous-requête (subquery)
L'une des utilisations les plus puissantes de l'opérateur SQL IN est son association avec une sous-requête corrélée. La liste de valeurs est générée dynamiquement à partir d'une autre table, ce qui évite de coder en dur les identifiants.
-- Récupérer les clients dont le nom figure aussi dans la table prospects SELECT c.id, c.nom, c.email FROM clients c -- La sous-requête génère dynamiquement la liste des noms à tester WHERE c.nom IN ( SELECT p.nom FROM prospects p -- Filtre optionnel pour affiner la sous-requête WHERE p.statut = 'qualifié' );
Exemple 6 — NOT IN : exclure des valeurs avec SQL
L'opérateur NOT IN est le pendant négatif de IN. Il retourne toutes les lignes dont la valeur n'appartient pas à la liste spécifiée. Attention : si la liste contient une valeur NULL, NOT IN retournera un ensemble vide en raison de la logique ternaire SQL (TRUE / FALSE / UNKNOWN).
-- Afficher les produits qui ne sont PAS dans ces catégories SELECT id, nom, categorie FROM produits WHERE categorie NOT IN ('Soldé', 'Archivé', 'Indisponible'); -- ATTENTION : si la liste contient NULL, aucune ligne ne sera retournée ! -- Préférer IS NOT NULL en complément pour éviter ce piège classique. SELECT id, nom FROM produits WHERE categorie NOT IN ('Soldé', 'Archivé') AND categorie IS NOT NULL;
Exemple 7 — SQL IN avec des nombres et jointure implicite
Dans les architectures relationnelles modernes, SQL IN remplace souvent une jointure pour des listes d'identifiants connues à l'avance, notamment dans les APIs et les systèmes de filtrage dynamique.
-- Récupérer les commandes correspondant à une sélection d'IDs -- Typique d'une API REST qui reçoit une liste d'identifiants SELECT commande_id, client_id, montant, statut FROM commandes WHERE commande_id IN (1042, 1087, 1103, 1215, 1340) -- Filtrer aussi sur le statut pour affiner les résultats AND statut IN ('expédié', 'livré');
Conseils d'optimisation et bonnes pratiques SQL IN
L'opérateur SQL IN est performant pour des listes de taille raisonnable, mais quelques règles permettent de l'utiliser efficacement dans un contexte de production :
- Indexation de la colonne filtrée : assurez-vous que la colonne utilisée avec IN est indexée pour éviter un full table scan, surtout sur des tables volumineuses.
- Limiter la taille de la liste : au-delà de quelques centaines de valeurs, préférez une table temporaire combinée à une jointure JOIN, plus performante que IN avec une longue liste.
- Attention à NULL avec NOT IN : si la sous-requête ou la liste peut contenir des valeurs NULL, NOT IN retourne un ensemble vide. Utilisez
NOT EXISTSou ajoutez un filtreIS NOT NULL. - IN vs EXISTS : pour les sous-requêtes volumineuses,
EXISTSpeut être plus performant car il s'arrête dès la première correspondance trouvée. - Types compatibles : les valeurs de la liste doivent être du même type (ou implicitement convertibles) que l'expression testée pour éviter des conversions implicites coûteuses.
- SQL IN avec des paramètres liés (prepared statements) : en contexte applicatif, utilisez toujours des paramètres préparés pour construire dynamiquement les listes IN et prévenir les injections SQL.
Différences entre SQL IN et OR
L'expression WHERE colonne IN (A, B, C) est strictement équivalente à WHERE colonne = A OR colonne = B OR colonne = C. Cependant, SQL IN est préférable pour la lisibilité du code, la maintenabilité des requêtes et la compatibilité avec les outils d'analyse de requêtes. La plupart des optimiseurs de bases de données modernes (MySQL, PostgreSQL, SQL Server) traitent ces deux formes de manière identique en termes de plan d'exécution.
Conclusion
L'opérateur SQL IN est un incontournable du langage SQL pour filtrer des données selon une liste de valeurs, qu'elles soient statiques ou générées dynamiquement par une sous-requête. Associé à NOT IN, il couvre la majorité des besoins de filtrage par appartenance ou exclusion. En respectant les bonnes pratiques d'indexation et en restant vigilant face aux valeurs NULL avec NOT IN, vous tirerez le meilleur parti de cet opérateur dans vos bases de données relationnelles en 2026.
Par carabde | Mis à jour le 25 février 2026