• 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

Liez des relations grâce aux jointures

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

Nous voici arrivés à un concept fondamental de l'algèbre relationnelle, que vous utiliserez très régulièrement : la jointure.

Réfléchissons...

Remettons-nous en tête le concept des clés étrangères, qui servent à lier des relations. Nous savons qu'elles sont liées, oui, mais nous ne savons pas encore comment exploiter ces liaisons. C'est donc ce que nous allons voir ! :D

Reprenons l'exemple de nos deux relations variété et pomme.

pomme
pomme
variété
variété

Dans le chapitre Créez du lien entre vos relations grâce aux clés étrangères, nous voulions connaître le prix au kilo d'une pomme donnée, et nous avions écrit la phrase suivante :

Si je prends une pomme, et que je veux connaître son prix au kilo, il faudra d'abord que je connaisse sa variété. Ensuite, il faudra que je retrouve dans la table variété la ligne correspondante, pour connaître le prix.

La jointure interne

Plus formellement, on dit que l'on effectue une jointure interne de la relation pomme et de la relation variété selon la condition pomme.nom_variete = variete.libelle.

Et oui, il ne faut pas oublier de spécifier la condition de la jointure. Ici, cette condition dit que c'est la colonne nom_variété de pomme qui référence la colonne libellé de variété.

Voilà le résultat :

Le résultat de la jointure
Le résultat de la jointure

Nous avons atteint notre objectif. En connaissant l'identifiant de ma pomme, j'ai accès directement à son prix au kilo : il est sur la même ligne !

Faire une jointure sur plusieurs colonnes

Vous vous souvenez qu'une clé primaire peut être composée de plusieurs colonnes. Sachez que nous pouvons effectuer une jointure sur plusieurs colonnes (allez, disons 2 colonnes).

Si c'est le cas, alors une clé étrangère qui référence cette clé primaire sera forcément composée de 2 colonnes. La condition de jointure sera de cette forme :

relation1.attribut1 = relation2.attribut3 AND relation1.attribut2 = relation2.attribut4

 

Les jointures externes

Que se passe-t-il si nous ne connaissons pas la variété de la pomme 3 ? Dans ce cas, la clé étrangère aura une valeur nulle, elle n'aura donc pas de correspondance dans la table variété

Pomme
Pomme

La condition de jointure que nous avons vu précédemment ne sera pas satisfaite :pomme.nom_variete = variete.libelle  car pomme.nom_variete est nul.

Conséquence ? Comme la condition de jointure n'est pas satisfaite, la pomme 3 ne sera plus présente dans la table finale !

Si nous souhaitons quand même garder les pommes dont on ne connaît pas la variété, il faut faire une jointure externe. Si on considère que la table pomme est à gauche, et que la table variété est à droite, on effectue une jointure externe à gauche, car on garde toutes les lignes de la table de gauche :

Résultat d'une jointure externe à gauche
Résultat d'une jointure externe à gauche

De même, s'il n'y avait aucune pomme de la variété Gala, mais que nous souhaitions quand même garder les informations sur cette variété après la jointure, il aurait fallu faire une jointure externe à droite. On aurait donc gardé toutes les lignes de la table de droite (variété) même si certaines variétés n'ont pas de correspondance dans la table pomme :

Résultat d'une jointure externe à droite
Résultat d'une jointure externe à droite

 Et si nous voulons garder à la fois toutes les informations de pomme et de variété, j'ai en stock un troisième type de jointure externe : la jointure totale ! Voici à quoi elle ressemblerait :

Résultat d'une jointure externe totale
Résultat d'une jointure externe totale

Notations

Voici la notation que je vous propose pour la jointure interne :

 Jointure (pomme, variété, pomme.nom_variete = variete.libelle )

Pour les jointures externes droite, gauche et totale :

JointureGauche (pomme, variété, pomme.nom_variete = variete.libelle )

JointureDroite (pomme, variété, pomme.nom_variete = variete.libelle )

JointureEntière (pomme, variété, pomme.nom_variete = variete.libelle )

Aller plus loin : voir la jointure autrement

Grâce à ce paragraphe facultatif, vous allez encore mieux comprendre pourquoi il faut une condition dans une jointure !

Je vais vous dévoiler un secret : la jointure est en fait l'enchaînement d'un produit cartésien et d'une restriction !

Effectivement, si nous voulons joindre 2 tables, il suffit d'effectuer le produit cartésien de celles-ci, puis de restreindre le résultat selon la condition de jointure.

Voici le produit cartésien de pomme par variété :

Produit cartésien des relations pomme et variété
Produit cartésien des relations pomme et variété

Pour le moment, cela n'a pas vraiment de sens, car on a associé chacune des pommes avec chacune des variétés. C'est totalement inutile car des pommes sont associées à des variétés auxquelles elles n’appartiennent pas. Il y a donc des lignes inutiles car incohérentes.

Cependant, si ensuite nous appliquons une restriction selon la condition pomme.nom_variete = variete.libelle, nous éliminons les lignes incohérentes :

Lignes ne satisfaisant pas la condition
Lignes ne satisfaisant pas la condition

:magicien: Nous obtenons ici le même résultat que précédemment. C'est magique !

Résultat de la jointure
Résultat de la jointure

Aller plus loin : la jointure naturelle

Maintenant, un petit "truc" assez pratique : la jointure naturelle.

C'est une jointure classique. Mais si elle intervient sur deux relations dont les colonnes à lier ont exactement le même nom d'une table à l'autre, alors la jointure peut être implicite.

Ainsi, si je renommais la colonne libellé de la table variété en nom_variété, alors les deux tables auraient ce nom en commun. Comme nous souhaitons effectuer une jointure sur l'ensemble des colonnes ayant le même nom sur les deux relations (ici il n'y en a qu'une seule), nous aurions pu utiliser la jointure naturelle.

Avec la jointure naturelle, plus besoin d'indiquer une condition, car elle est implicite, vu que les colonnes ont le même nom !

Donc

Jointure (pomme, variété, pomme.nom_variété = variété.nom_variété)

est équivalent à

JointureNaturelle (pomme, variété).

En résumé

  • Une jointure "colle" deux tables selon une certaine condition.

  • Une jointure interne ne garde pas forcément toutes les informations des deux tables jointes.

  • Pour garder toutes les informations de l'une des tables (ou des 2 tables), il faut utiliser une jointure externe.

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