0Pricing
Coding Interview Prep · Leçon

Émuler les opérations ensemblistes avec des jointures

Réécrire EXCEPT et INTERSECT dans les dialectes qui ne les proposent pas

Émuler les opérations ensemblistes avec des jointures est une leçon Coding Interview Prep gratuite sur CoddyKit. Ceci est la leçon 4 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.

Pourquoi reproduire les opérations ensemblistes

Toutes les bases de données ne prennent pas en charge INTERSECT et EXCEPT. Les anciennes versions de MySQL, par exemple, ne les proposaient pas du tout. Les recruteurs vérifient si vous savez reproduire la logique ensembliste avec des jointures et des sous-requêtes lorsque l'opérateur n'est pas disponible.

Connaître à la fois l'opérateur ensembliste et son équivalent avec une jointure prouve que vous comprenez réellement ce que calcule l'opérateur.

INTERSECT avec une jointure INNER JOIN

INTERSECT trouve les lignes communes aux deux ensembles. L'équivalent avec une jointure consiste à utiliser une INNER JOIN sur toutes les colonnes comparées, avec en plus DISTINCT pour reproduire le comportement de déduplication.

Chaque colonne de la comparaison devient une partie du prédicat de jointure.

-- A INTERSECT B emulated:
SELECT DISTINCT a.customer_id
FROM orders_2023 a
JOIN orders_2024 b
  ON a.customer_id = b.customer_id;

Pourquoi DISTINCT est nécessaire pour INTERSECT

Une INNER JOIN simple peut multiplier les lignes : si une valeur apparaît plusieurs fois dans l'une ou l'autre source, la jointure duplique les lignes. INTERSECT standard renvoie chaque ligne commune une seule fois ; vous devez donc ajouter DISTINCT pour éliminer les doublons créés par la jointure.

Oublier DISTINCT est une erreur fréquente en entretien.

-- without DISTINCT, a customer with 3 orders in each year
-- would appear 9 times from the join

EXCEPT comme LEFT JOIN / IS NULL

EXCEPT (A mais pas B) est l’anti-jointure. La forme portable consiste à effectuer un LEFT JOIN de A vers B sur toutes les colonnes, à ne conserver que les lignes où le côté B vaut NULL (aucune correspondance), puis à appliquer DISTINCT.

Ce motif LEFT JOIN / IS NULL est l’une des astuces les plus réutilisées lors des entretiens SQL.

SELECT DISTINCT a.customer_id
FROM orders_2023 a
LEFT JOIN orders_2024 b
  ON a.customer_id = b.customer_id
WHERE b.customer_id IS NULL;

EXCEPT avec NOT EXISTS

Une autre forme portable de EXCEPT utilise NOT EXISTS. Elle se lit ainsi : « conserver chaque ligne de A pour laquelle aucune ligne correspondante de B n’existe », et gère les valeurs NULL de manière fiable.

De nombreux ingénieurs préfèrent NOT EXISTS, car son intention est explicite et il évite le piège de NOT IN + NULL.

SELECT DISTINCT a.customer_id
FROM orders_2023 a
WHERE NOT EXISTS (
  SELECT 1 FROM orders_2024 b
  WHERE b.customer_id = a.customer_id
);

INTERSECT avec EXISTS

De manière symétrique, INTERSECT peut s’écrire avec EXISTS : conserver chaque ligne distincte de A pour laquelle une ligne correspondante de B existe.

EXISTS s’arrête dès la première correspondance, ce qui peut le rendre efficace et évite la multiplication des lignes due à la jointure, supprimant parfois la nécessité d’utiliser DISTINCT du côté de la jointure.

SELECT DISTINCT a.customer_id
FROM orders_2023 a
WHERE EXISTS (
  SELECT 1 FROM orders_2024 b
  WHERE b.customer_id = a.customer_id
);

Le piège de NOT IN et de NULL

Une émulation tentante de EXCEPT consiste à utiliser NOT IN, mais elle est dangereuse : si la sous-requête renvoie la moindre valeur NULL, NOT IN ne renvoie aucune ligne, car la comparaison devient UNKNOWN.

Il s’agit d’un piège très fréquemment évalué. Préférez NOT EXISTS ou LEFT JOIN / IS NULL, qui gèrent correctement les valeurs NULL.

-- RISKY if orders_2024.customer_id can be NULL:
SELECT DISTINCT customer_id FROM orders_2023
WHERE customer_id NOT IN (
  SELECT customer_id FROM orders_2024
);

Effectuer une correspondance sur plusieurs colonnes

Lorsque la comparaison d’ensembles porte sur plusieurs colonnes, chaque colonne intervient dans le prédicat de jointure. Pour une anti-jointure, vous devez également gérer la possibilité de valeurs NULL dans ces colonnes, et c’est là que NOT EXISTS se montre particulièrement utile.

Écrivez explicitement chaque colonne dans la clause ON ; en oublier une modifie discrètement la définition d’une « ligne égale ».

SELECT DISTINCT a.id, a.city
FROM a
LEFT JOIN b
  ON a.id = b.id AND a.city = b.city
WHERE b.id IS NULL;

Émuler UNION sans l’opérateur

UNION ALL n’est qu’une concaténation, que tous les dialectes prennent directement en charge. Pour émuler UNION avec déduplication lorsque c’est nécessaire, concaténez les résultats avec UNION ALL dans une sous-requête, puis entourez-la de SELECT DISTINCT ou de GROUP BY sur toutes les colonnes.

Cela montre que UNION est simplement UNION ALL auquel on ajoute une étape de déduplication.

SELECT DISTINCT * FROM (
  SELECT city FROM a
  UNION ALL
  SELECT city FROM b
) combined;

Choisir la bonne émulation

Guide de décision :

  • INTERSECT → EXISTS ou INNER JOIN + DISTINCT.
  • EXCEPT → NOT EXISTS ou LEFT JOIN / IS NULL.
  • Évitez NOT IN lorsque des valeurs NULL sont possibles.
  • UNION → UNION ALL entouré de DISTINCT.

EXISTS / NOT EXISTS sont les plus portables et les plus sûrs vis-à-vis de NULL, ce qui en fait les réponses les plus fiables en entretien.

Relier les concepts

Savoir traduire les opérateurs d’ensembles en jointures montre que vous les comprenez comme une logique d’ensembles, et pas seulement comme de la syntaxe. L’anti-jointure (LEFT JOIN / IS NULL ou NOT EXISTS) est le motif le plus utile : il intervient dans l’émulation de EXCEPT, la recherche de lignes orphelines et les questions portant sur les enregistrements manquants.

Commencez par NOT EXISTS pour garantir la correction, puis mentionnez la forme avec jointure pour discuter des performances.

Vérification rapide

Votre base de données ne prend pas en charge EXCEPT. Vous devez obtenir les customer_ids présents dans orders_2023 mais absents de orders_2024, et la colonne peut contenir des valeurs NULL.

Récapitulatif

Points essentiels :

  • INTERSECT → INNER JOIN + DISTINCT, ou EXISTS.
  • EXCEPT → LEFT JOIN / IS NULL, ou NOT EXISTS (anti-jointure).
  • Ajoutez DISTINCT pour reproduire le comportement de déduplication des opérateurs d’ensembles et limiter la multiplication des lignes due aux jointures.
  • Évitez NOT IN en présence possible de valeurs NULL ; préférez NOT EXISTS.
  • UNION = UNION ALL entouré de DISTINCT.

Questions Fréquemment Posées

La leçon « Émuler les opérations ensemblistes avec des jointures » est-elle gratuite ?

Oui — le texte complet de « Émuler les opérations ensemblistes avec des jointures » 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 « Émuler les opérations ensemblistes avec des jointures » ?

Réécrire EXCEPT et INTERSECT dans les dialectes qui ne les proposent pas 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 4 sur 4.

Combien de temps prend la leçon « Émuler les opérations ensemblistes avec des jointures » ?

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

  1. UNION ou UNION ALL
  2. Nombre de colonnes et compatibilité des types
  3. INTERSECT et EXCEPT pour comparer
  4. Émuler les opérations ensemblistes avec des jointures
← Retour à Coding Interview Prep