0Pricing
SQL Academy · Leçon

IN et NOT IN pour les ensembles

Filtrez selon des listes de valeurs avec IN et NOT IN, découvrez le piège de NULL dans NOT IN et convertissez la requête en EXISTS pour obtenir une sémantique sûre.

IN et NOT IN pour les ensembles est une leçon SQL Academy 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 Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours SQL Academy comprend 4 leçons au total.

IN : comparer à une liste

IN est une notation abrégée pour plusieurs OR :

SELECT * FROM users WHERE country IN ('US', 'CA', 'GB');

-- Equivalent to:
SELECT * FROM users
WHERE country = 'US' OR country = 'CA' OR country = 'GB';

IN avec une sous-requête

Vous pouvez utiliser une sous-requête à droite :

SELECT * FROM orders
WHERE user_id IN (
  SELECT id FROM users WHERE country = 'US'
);

NOT IN : exclure une liste

Excluez les lignes correspondantes :

SELECT * FROM users WHERE status NOT IN ('banned', 'deleted');

Le piège des NULL avec NOT IN

Si le membre de droite contient NULL, NOT IN renvoie NULL — et les lignes dont le prédicat vaut NULL sont supprimées. Résultat : aucune ligne.

-- Suppose blocked_names contains NULL:
SELECT name FROM users
WHERE name NOT IN (SELECT excluded_name FROM blocked_names);
-- → 0 rows, silently

-- Safer: filter out NULLs explicitly, or use NOT EXISTS:
SELECT name FROM users u
WHERE NOT EXISTS (
  SELECT 1 FROM blocked_names b WHERE b.excluded_name = u.name
);

Pourquoi NOT EXISTS est plus sûr

NOT EXISTS utilise la sémantique standard des sous-requêtes corrélées et gère correctement les NULL. La plupart des planificateurs l’optimisent de manière identique à un NOT IN correctement formé.

IN ou OR — lisibilité

IN est plus lisible que de longues chaînes de OR, et le planificateur l’optimise souvent de manière identique :

-- Hard to read:
WHERE country = 'US' OR country = 'CA' OR country = 'GB' OR ...

-- Clear:
WHERE country IN ('US', 'CA', 'GB', ...)

IN avec des tuples (constructeurs de lignes)

Comparez des paires de colonnes :

SELECT * FROM order_items
WHERE (order_id, product_id) IN (
  (1, 42), (2, 99), (3, 17)
);

Utilisation des index

Une liste IN sur une colonne indexée peut être exécutée sous forme de plusieurs recherches dans l’index (Bitmap Index Scan). Elle est généralement rapide.

-- Plan: Bitmap Index Scan + Bitmap Heap Scan
SELECT * FROM products WHERE id IN (1, 5, 99, 121, 4421);

Grandes listes IN

Les listes contenant des milliers de valeurs peuvent devenir lentes. Préférez :

  • JOIN avec une table réelle ou temporaire
  • = ANY(array) pour transmettre un paramètre de type tableau
SELECT * FROM products WHERE id = ANY(ARRAY[1,2,3,...]);

IN avec une liste vide

Une liste IN vide est illégale en SQL standard. Certains clients transmettent une valeur sentinelle ; il est plus sûr de générer la condition SQL de manière conditionnelle.

-- Use empty array trick in PostgreSQL:
SELECT * FROM products WHERE id = ANY($1::bigint[]);
-- Pass {} to get zero matches without rewriting the SQL.

IN ou JOIN

Un JOIN est parfois plus clair qu’une sous-requête IN :

-- With IN:
SELECT * FROM orders
WHERE user_id IN (SELECT id FROM users WHERE pro);

-- With JOIN:
SELECT o.*
FROM orders o
JOIN users  u ON u.id = o.user_id
WHERE u.pro;

Récapitulatif

IN est la forme pratique pour tester l’appartenance à un ensemble.

  • Préférez IN à OR pour la lisibilité
  • NOT IN est dangereux avec les NULL — préférez NOT EXISTS
  • Pour les grands ensembles, utilisez JOIN ou transmettez des tableaux

Vérification rapide

Quel est le remplacement le plus sûr de NOT IN (subquery) lorsque la sous-requête peut contenir des NULL ?

Questions Fréquemment Posées

La leçon « IN et NOT IN pour les ensembles » est-elle gratuite ?

Oui — le texte complet de « IN et NOT IN pour les ensembles » 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 Academy, passe à CoddyKit PRO. Le cours SQL Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « IN et NOT IN pour les ensembles » ?

Filtrez selon des listes de valeurs avec IN et NOT IN, découvrez le piège de NULL dans NOT IN et convertissez la requête en EXISTS pour obtenir une sémantique sûre. Tu pratiques SQL Academy 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 Academy ?

Aucune expérience préalable n'est requise. SQL Academy 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 « IN et NOT IN pour les ensembles » ?

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 Academy ?

Oui. Chaque leçon SQL Academy 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. Motifs LIKE et caractères génériques
  2. IN et NOT IN pour les ensembles
  3. BETWEEN pour les intervalles
  4. IS NULL, IS NOT NULL et COALESCE
← Retour à SQL Academy