logo oujood
🔍

Opérateur SQL IN : Filtrer des données avec une liste de valeurs

Apprenez à utiliser l'opérateur SQL IN pour tester l'appartenance d'une valeur à une liste, avec des exemples commentés et des conseils d'optimisation.

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.

  📋 Copier le code

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.

  📋 Copier le code

-- 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.

  📋 Copier le code

-- 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.

  📋 Copier le code

-- 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.

  📋 Copier le code

-- 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).

  📋 Copier le code

-- 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.

  📋 Copier le code

-- 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 EXISTS ou ajoutez un filtre IS NOT NULL.
  • IN vs EXISTS : pour les sous-requêtes volumineuses, EXISTS peut ê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