• 20 heures
  • Moyenne

Ce cours est visible gratuitement en ligne.

course.header.alt.is_video

course.header.alt.is_certifying

J'ai tout compris !

Mis à jour le 20/10/2020

Écrivez une union, une différence et une intersection

Connectez-vous ou inscrivez-vous gratuitement pour bénéficier de toutes les fonctionnalités de ce cours !

Nous allons voir comment écrire une union, une différence et une intersection. Plus précisément, nous testerons ces opérateurs binaires sur les deux tables entity et intermediary.

Faisons le point sur notre investigation

Entity contient une liste de sociétés. Intermediary contient des intermédiaires. Dans certains cas, ces intermédiaires sont aussi des sociétés. Il y a peut-être donc des sociétés qui se trouvent à la fois dans les deux tables.

Testons si c'est la cas de Big Data Crunchers Ltd. ! Si c'est le cas, cela signifiera que cette société a servi d'intermédiaire.

L'union, l'intersection et la différence

Pour utiliser un opérateur binaire sur deux tables, il faut que ces deux tables aient le même schéma, ce qui n'est pas le cas de entity et intermediary.

Pour résoudre ce problème, nous allons les ramener au même schéma, grâce à une projection. Ainsi, au lieu d'utiliser les tables entity et intermediary telles quelles, nous prendrons plutôt les tables résultant de ces deux projections, qui elles sont bien de même schéma :

SELECT name, id_address FROM intermediary ;
SELECT name, id_address FROM entity ;

Les mots clés UNION, EXCEPT et INTERSECT

Pour avoir la liste de toutes les sociétés de entity ainsi que la liste de tous les intermédiaires, il faut utiliser le mot clé UNION :

 La liste des sociétés de la table entity qui ne sont pas des intermédiaires est donnée par :

SELECT name, id_address FROM entity
EXCEPT
SELECT name, id_address FROM intermediary ;

Si nous souhaitons connaître les sociétés à la fois présentes dans la table entity et dans la table intermediary :

SELECT name, id_address FROM entity
INTERSECT
SELECT name, id_address FROM intermediary ;

Oui mais...

Malheureusement, il y a un Mais:euh: Il faut que je vous avoue que la différence et l'intersection sont rarement effectuées de cette manière.

Réfléchissons

Par exemple, on veut savoir si une ligne d'une première table est présente dans une seconde table. On doit donc comparer la valeur de chacun de ses attributs un à un. S'il y a beaucoup d'attributs, ceci n'est pas optimal. En fait il y a plus simple, mais à une condition : que les deux tables soient extraites d'une table originelle contenant au moins une clé candidate.

Prenons une table personne contenant des personnes de nationalité française, décrites par 20 colonnes. La colonne numéro de sécurité sociale est l'une des clés candidates, car elle identifie chacun des individus. De cette table originelle personne, nous créons une table adulte, qui contient les personnes de plus de 18 ans, et une table marseillais contenant les personnes habitant dans la ville de Marseille.

Pour savoir si une personne est présente à la fois dans adulte et dans marseillais, pas besoin de comparer la totalité des 20 colonnes : il suffit juste de regarder si son numéro de sécurité sociale est présent dans chacune des deux tables !

L'autre méthode

Voici comment faire :

SELECT *
FROM adulte
WHERE numero_securite_sociale IN (
SELECT numero_securite_sociale FROM marseillais
) ;

Traduite en français, cette requête serait :

  • Sélectionner toutes les lignes de la table adulte pour lesquelles le numéro de sécurité sociale se trouve dans :

    • Sélectionner tous les numéros de sécurité sociale de la table marseillais

Le code précédent effectue une intersection. Pour effectuer une différence, il suffit de remplacer le mot clé  IN  par  NOT IN  .

En résumé

  • L'union s'effectue grâce à  UNION  .

  • L'intersection et la différence s'effectuent respectivement grâce à  INTERSECT  et  EXCEPT  .

  • Quand on peut utiliser des clés primaires, il y a plus efficace que  INTERSECT  et  EXCEPT  !

Exemple de certificat de réussite
Exemple de certificat de réussite