Niveau 13 : Combiner des résultats : UNION, INTERSECT, EXCEPT

Niveau 13 : Combiner des résultats : UNION, INTERSECT, EXCEPT

Mis à jour le

Intermédiaire · niveau 13 sur 20. Objectif : Empiler, croiser ou soustraire les résultats de deux requêtes.

Notions : UNION UNION ALL INTERSECT EXCEPT

Leçon

Jusqu'ici, une requête renvoyait un seul résultat. Les opérateurs ensemblistes combinent les résultats de deux requêtes, comme on combine deux listes. On écrit un SELECT complet, l'opérateur, puis un second SELECT complet.

Condition : les deux SELECT doivent renvoyer le même nombre de colonnes, de même nature, dans le même ordre. SQL associe les colonnes par position, pas par nom : la première avec la première, la deuxième avec la deuxième. Le résultat prend les noms de colonnes du premier SELECT.

UNION empile les deux résultats et supprime les doublons : une personne inscrite aux deux clubs n'apparaît qu'une fois. UNION ALL empile tout, doublons compris ; il est plus rapide, puisqu'il n'a pas à chercher les doublons. Utilise UNION ALL quand les doublons sont impossibles ou voulus.

INTERSECT ne garde que les lignes présentes dans les deux résultats : les membres des deux clubs. EXCEPT garde les lignes du premier résultat absentes du second : les joueurs d'échecs qui ne font pas de musique. EXCEPT n'est pas symétrique : inverser les deux requêtes change la question.

Les lignes sont comparées en entier : ('Claire', 'Paris') et ('Claire', 'Lyon') sont deux lignes différentes, qu'UNION garde toutes les deux.

On peut ajouter une colonne constante pour savoir d'où vient chaque ligne : SELECT 'hotel' AS kind, name FROM hotels UNION ALL SELECT 'guest', name FROM guests.

Un seul ORDER BY est permis, tout à la fin : il trie le résultat combiné et utilise les noms de colonnes du premier SELECT.

Syntaxe

SELECT col
FROM a
UNION
SELECT col
FROM b; -- ou UNION ALL, INTERSECT, EXCEPT

Exemple commenté

SELECT member
FROM chess
UNION
SELECT member
FROM music;

Tous les membres d'au moins un des deux clubs. Claire et David, inscrits aux deux, n'apparaissent qu'une fois.

Table chess (4 lignes)
member
Alice
Bob
Claire
David
Table music (4 lignes)
member
Claire
David
Emma
Farid

Résultat de l’exemple

member
Alice
Bob
Claire
David
Emma
Farid

À retenir

  • Même nombre de colonnes des deux côtés.
  • UNION dédoublonne, UNION ALL garde tout.
  • INTERSECT = dans les deux ; EXCEPT = dans le premier mais pas dans le second.

Pièges fréquents

  • Un ORDER BY ne se met qu'une fois, à la toute fin, et s'applique au résultat combiné.
  • EXCEPT n'est pas symétrique : A EXCEPT B n'est pas B EXCEPT A.

Les 5 exercices du niveau

  1. Guidé · Affiche les personnes inscrites à la fois au club d'échecs et au club de musique. (Tables : chess, music)
  2. Entraînement · Affiche les personnes inscrites au club d'échecs mais pas au club de musique. (Tables : chess, music)
  3. Entraînement · Affiche, sans doublon, toutes les villes où il y a un hôtel ou un aéroport. (Tables : hotels, airports)
  4. Entraînement · Affiche dans une même liste les noms des hôtels et les noms des clients, avec une première colonne kind qui vaut 'hotel' ou 'guest'. (Tables : hotels, guests)
  5. Défi · Tous les hôtels sont en France. Affiche la ville de chaque hôtel et celle de chaque aéroport français, avec une colonne source qui vaut 'hotel' ou 'airport'. Trie le résultat par ville puis par source. Une ville apparaît une fois par hôtel ou aéroport : Paris a deux hôtels, donc deux lignes « Paris, hotel ». (Tables : hotels, airports)

Dans SpeedQL, chaque requête est corrigée tout de suite : le résultat est comparé à celui attendu, puis la requête est relancée sur une base de contrôle cachée. Chaque exercice a ses indices écrits, à afficher seulement si tu bloques.

Voir aussi : la fiche de l’aide-mémoire · les exercices SQL corrigés sur cette notion

Faire les exercices du niveau 13

Gratuit, sans inscription : la leçon et les 5 exercices s’ouvrent directement dans ton navigateur.

Ouvrir le niveau 13 dans SpeedQL

·