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] :
Ajoutons un nouvel attribut disponibilité a la relation Produit et mettons a jour les donnéeCREATE 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');
Il existe différents types de jointures.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';
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:
La commande jointure complète suivante fournira (alors que l'équi-jointure fournira le même résultat):insert into "Client" values ('toto', '');
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