Thématiques principales

jeudi 15 février 2018

SGBD-R : Jointures

A la base je pensais ne faire qu’un article sur l'algèbre relationnelle mais les jointures se sont révélées être un sujet plus qu'intéressant a traiter a elles seules donc voici la suite de l’article [10] dédié exclusivement aux jointures.
Les jointures sont les opérations avancées de l’algèbre relationnelles les plus importantes [5]. Elles pourraient être le propos d’un article à elle seule mais nous ne voulons que donner du sens à leur utilisation, nous ne rentrerons donc pas dans le détails (et le cas échéant cela sera l’occasion d’en faire un autre article) (et en fait c’est le cas mais c’était pas prévu)


Reprenons les éléments de l’article précédent [10] :

CREATE TABLE "Client"
(
 nom            varchar(40) NOT NULL,
 produit        varchar(40) NOT NULL
);
CREATE TABLE "Produit"
(
 produit        varchar(40) NOT NULL
);
INSERT INTO "Produit" VALUES ('epad');
INSERT INTO "Produit" VALUES ('asis');
INSERT INTO "Produit" VALUES ('windause');
INSERT INTO "Client" VALUES ('thomas','epad');
INSERT INTO "Client" VALUES ('thomas','asis');
INSERT INTO "Client" VALUES ('kevin','windause');
INSERT INTO "Client" VALUES ('kevin','asis');
INSERT INTO "Client" VALUES ('paul','asis');
Ajoutons un nouvel attribut disponibilité a la relation Produit et mettons a jour les donnée
alter table "Produit" add disponibilité boolean;
update "Produit" p set "disponibilité" = true where p.produit='windause';
update "Produit" p set "disponibilité" = true where p.produit='epad';
update "Produit" p set "disponibilité" = false where p.produit='asis';
Il existe différents types de jointures.

    Equi-jointure 

    L’equi-jointure est une opération construisant une nouvelle relation faisant l’union des attributs des deux relations initiales et contenant les enregistrement conforme a la condition. Attention cela va dédoublé l’attribut commun [6]
      select * from "Client" c inner join "Produit" p on p.produit=c.produit;
      client equi-jointure produit
      nom
      produit
      produit
      disponibilité

      thomas
      epad
      epad
      t

      thomas
      windause
      windause
      t

      kevin
      windause
      windause
      t

      paul
      asis
      asis
      f

      kevin
      asis
      asis
      f

      thomas
      asis
      asis
      f

      A noter que la jointure part du produit cartésien en y apposant une restriction et la formule ci dessus peut s'écrire ainsi (mais on n'évitera):
      select * from "Client" c, "Produit" p where c.produit = p.produit;

      Jointure complète


      Ou full join cette jointure est une jointure similaire à l'équi-jointure inner mais les résultats seront tendu par des attributs vide

      Par exemple en ajoutant:

      insert into "Client" values ('toto', '');
      La commande jointure complète suivante fournira (alors que l'équi-jointure fournira le même résultat):
      select * from "Client" c FULL JOIN "Produit" p on p.produit=c.produit;
      client equi-jointure produit
      nom
      produit
      produit
      disponibilité

      thomas
      epad
      epad
      t

      thomas
      windause
      windause
      t

      kevin
      windause
      windause
      t

      paul
      asis
      asis
      f

      kevin
      asis
      asis
      f

      thomas
      asis
      asis
      f

      toto




        Jointure naturelle 


        La jointure naturelle [7] retourne la fusion des deux tables et est donc équivalente à l'équi-jointure sans le doublon ni condition (celle ci étant implicite au attribut commun aux deux relations).

          client jointure naturelle produit
          nom
          produit
          disponibilité

          thomas
          epad
          t

          thomas
          windause
          t

          kevin
          windause
          t

          paul
          asis
          f

          kevin
          asis
          f

          thomas
          asis
          f

          Auto-jointure 

          L'auto Jointure est une equi jointure classique pour les tables jointes sont les même. Ce genre de jointure est utilisé lorsque des attributs références d’autres attributs de la même tables [8]
           

          La jointure cartésienne ou cross join est équivalent au produit cartésien que nous avons vu précédemment

          Theta jointure 

          La thêta jointure part du même principe que l'équi-jointure mais en ne se limitant pas à l'égalité des colonne mais en utilisant des inégalités pour construire la jointure.

          Semi-jointure

          Les semi-jointures sont des jointures sur lesquels on privilégie lors de la construction de la condition, le contenu d’une relation par rapport a une autre. Cette jointure peut être stricte ou non. C’est a dire excluant ou non les éléments partagé [9].

          Par exemple :

          select * from "Client" c LEFT join "Produit" p on c.produit = p.produit;
          client equi-jointure produit
          nom
          produit
          produit
          disponibilité

          thomas
          epad
          epad
          t

          thomas
          windause
          windause
          t

          kevin
          windause
          windause
          t

          paul
          asis
          asis
          f

          kevin
          asis
          asis
          f

          thomas
          asis
          asis
          f

          toto




          La version strict de cette requête nous produira alors:

          select * from "Client" c LEFT join "Produit" p on c.produit = p.produit where p.produit is null;
          client equi-jointure produit
          nom
          produit
          produit
          disponibilité

          toto




          Bien sur la requête a droite est équivalente à inverser dans la requête les Tables Client et Produit ainsi que les variables p et c.

          A noter que l’on peut utiliser le mot clef outer entre left et join mais que cela n'amène pas de changement sémantique particulier.
          Pour le dernier article dédié aux SGBR-R, nous terminerons sur les formes normales 4, 5 et 6.

          Références

          [2] https://www.google.fr/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&ved=0ahUKEwiaivuwvaDZAhUCSBQKHWpXDd4QFgguMAE&url=http%3A%2F%2Fwww.i3s.unice.fr%2F~edemaria%2Fcours%2Fc3.pdf&usg=AOvVaw05kk_PL5IdXIxKsT1WdRlm
          [4] http://sqlpro.developpez.com/cours/divrelationnelle/
          [5] http://sql.sh/cours/jointures
          [9] https://fr.wikipedia.org/wiki/Jointure_(informatique)
          [10] http://un-est-tout-et-tout-est-un.blogspot.com/2018/02/sgbd-r-algebre-relationnelle.html

          Aucun commentaire:

          Enregistrer un commentaire