Sous-requêtes IN, ANY et ALL
Sous-requêtes d’appartenance à un ensemble et piège classique de NOT IN avec NULL
Sous-requêtes IN, ANY et ALL est une leçon Coding Interview Prep gratuite sur CoddyKit. Ceci est la leçon 3 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 Coding Interview Prep, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Coding Interview Prep comprend 4 leçons au total.
Sous-requêtes d'appartenance à un ensemble
Lorsqu'une sous-requête renvoie une liste de valeurs, vous en vérifiez l'appartenance avec IN, ANY ou ALL. C'est ainsi que SQL demande cette valeur appartient-elle à cet ensemble ? ou dépasse-t-elle chaque élément / au moins un élément de cet ensemble ?
IN— correspond à une valeur quelconque de la liste.ANY/SOME— vrai si la comparaison est satisfaite pour au moins un élément.ALL— vrai seulement si elle est satisfaite pour chaque élément.
IN avec une sous-requête
Le cas courant : trouver les employés qui travaillent dans un département situé à 'NYC' ou dans tout autre département situé à cet endroit. La sous-requête renvoie un ensemble d'identifiants de départements, et IN conserve les lignes qui correspondent à l'un d'entre eux.
Cette formulation est naturelle et c'est celle que les intervieweurs attendent en premier.
SELECT name
FROM employees
WHERE dept_id IN (
SELECT id FROM departments WHERE city = 'NYC'
);= ANY est équivalent à IN
Une équivalence élégante que les intervieweurs apprécient : = ANY (subquery) signifie exactement la même chose que IN (subquery). Les deux sont vrais lorsque la valeur est égale à au moins un élément de l'ensemble.
La requête ci-dessous renvoie exactement le même résultat que la précédente. ANY et son synonyme SOME généralisent ce principe à d'autres opérateurs comme > et <.
SELECT name
FROM employees
WHERE dept_id = ANY (
SELECT id FROM departments WHERE city = 'NYC'
);ANY avec un opérateur de comparaison
ANY devient puissant avec > ou <. salary > ANY (set) est vrai si le salaire dépasse au moins le plus petit élément — c'est-à-dire s'il est supérieur au minimum.
Cela permet de trouver les employés qui gagnent plus qu'au moins une personne du département 5.
SELECT name, salary
FROM employees
WHERE salary > ANY (
SELECT salary FROM employees WHERE dept_id = 5
);ALL avec un opérateur de comparaison
salary > ALL (set) est vrai uniquement si le salaire dépasse chaque élément — c'est-à-dire s'il est supérieur au maximum. Cela permet de trouver les employés qui gagnent plus que tout le monde dans le département 5.
Mémorisez ce raccourci : > ALL = supérieur à MAX, > ANY = supérieur à MIN. Les intervieweurs vérifient constamment ce point.
SELECT name, salary
FROM employees
WHERE salary > ALL (
SELECT salary FROM employees WHERE dept_id = 5
);NOT IN : le célèbre piège de NULL
Voici le piège de sous-requête le plus souvent abordé en entretien. Si la sous-requête d'un NOT IN renvoie ne serait-ce qu'un NULL, l'ensemble du NOT IN peut ne renvoyer aucune ligne — et non les éléments orphelins attendus.
Pourquoi ? x NOT IN (1, 2, NULL) se développe en x <> 1 AND x <> 2 AND x <> NULL. Cette dernière comparaison vaut UNKNOWN, donc la conjonction AND ne peut jamais être vraie.
SELECT name
FROM customers
WHERE id NOT IN (
SELECT customer_id FROM orders
);Pourquoi cette requête échoue silencieusement
Si orders.customer_id peut contenir NULL et qu'une ligne en contient un, la requête précédente ne renvoie aucune ligne, même lorsqu'il existe clairement des clients sans commandes.
- La présence de NULL transforme la logique en
UNKNOWN. - Elle ne génère pas d'erreur — elle renvoie simplement un résultat erroné (vide).
Signaler explicitement ce danger pendant un entretien est un signe très positif.
Corriger NOT IN en présence de NULL
Les intervieweurs acceptent trois corrections sûres :
- Exclure les NULL de la sous-requête : ajouter
WHERE customer_id IS NOT NULL. - Réécrire la requête avec
NOT EXISTS, qui gère correctement les NULL. - Utiliser une anti-jointure avec
LEFT JOIN ... IS NULL.
La version protégée ci-dessous renvoie la véritable liste des clients sans commandes.
SELECT name
FROM customers
WHERE id NOT IN (
SELECT customer_id FROM orders
WHERE customer_id IS NOT NULL
);IN fonctionne avec les NULL
Précision rassurante : un IN simple (non nié) n'est pas affecté par les NULL de la liste. x IN (1, 2, NULL) est vrai si x vaut 1 ou 2 ; le NULL ne correspond simplement jamais.
Le danger lié à NULL est propre à NOT IN. Connaître la différence entre ces deux cas est précisément ce qui distingue une réponse assurée d'une supposition.
IN sur plusieurs colonnes
Certains dialectes (Postgres, MySQL) permettent d'utiliser IN sur un tuple de colonnes, afin de comparer plusieurs paires simultanément. Cela permet de trouver les lignes de commande dont la combinaison (produit, région) apparaît dans une table de promotions.
SQL Server ne prend pas en charge IN sur les valeurs de ligne ; vous devez alors réécrire la requête avec EXISTS. Mentionner cette différence de portabilité impressionne les intervieweurs.
SELECT *
FROM order_lines
WHERE (product_id, region) IN (
SELECT product_id, region FROM promotions
);Phrase clé d'entretien
Dites ceci : "IN vérifie l'appartenance à un ensemble et est équivalent à = ANY. Avec des opérateurs de comparaison, > ANY signifie supérieur au minimum et > ALL signifie supérieur au maximum. Le grand piège est NOT IN avec une sous-requête qui peut renvoyer NULL — la requête ne renvoie alors silencieusement aucune ligne ; je me protège donc avec IS NOT NULL ou je passe à NOT EXISTS."
Cette réponse couvre en une seule fois l'appartenance, la sémantique de ANY/ALL et le piège de NULL.
Vérification rapide
Le piège de sous-requête préféré des intervieweurs.
Récapitulatif
Les sous-requêtes d'appartenance, maîtrisées :
IN== ANY: correspond à tout élément de l'ensemble.> ANYsignifie supérieur au minimum ;> ALLsignifie supérieur au maximum.NOT INavec un NULL dans la sous-requête ne renvoie silencieusement aucune ligne — utilisezIS NOT NULLouNOT EXISTS.- Un
INsimple tolère les NULL ;INsur plusieurs colonnes fonctionne dans certains dialectes.
Ensuite : EXISTS ou IN, et la question des performances que les entretiens avancés apprécient.
Questions Fréquemment Posées
La leçon « Sous-requêtes IN, ANY et ALL » est-elle gratuite ?
Oui — le texte complet de « Sous-requêtes IN, ANY et ALL » 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 Coding Interview Prep, passe à CoddyKit PRO. Le cours Coding Interview Prep comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Sous-requêtes IN, ANY et ALL » ?
Sous-requêtes d’appartenance à un ensemble et piège classique de NOT IN avec NULL Tu pratiques Coding Interview Prep 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 Coding Interview Prep ?
Aucune expérience préalable n'est requise. Coding Interview Prep 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 3 sur 4.
Combien de temps prend la leçon « Sous-requêtes IN, ANY et ALL » ?
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 Coding Interview Prep ?
Oui. Chaque leçon Coding Interview Prep 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
- Sous-requêtes scalaires dans SELECT et WHERE
- Sous-requêtes dans la clause FROM (tables dérivées)
- Sous-requêtes IN, ANY et ALL
- Performances de EXISTS et IN