IV.5.3. Les jointures
On appelle jointure une opération permettant de
combiner des informations issues de plusieurs tables. Elle se formule
simplement en spécifiant, dans la clause FROM , le nom des tables
concernées et, dans la clause WHERE, les conditions qui vont permettre
de réaliser la jointure (en effet, si l'on ne précise pas de
condition de sélection, on obtient le produit cartésien des
tables présentes derrière le FROM, ce qui n'est en
général pas souhaité).
Or, structurellement, il existe plusieurs types de jointures
(cfr. figure IV.1) :
Equi-jointure (ou jointure naturelle, ou jointure
interne) : permet de relier deux colonnes appartenant à
deux tables différentes mais ayant le même "sens" et venant
vraisemblablement d'une relation 1-N lors de la conception. Les tables sont
reliées par une relation d'égalité entre leur attribut
commun ou, à partir de SQL2, avec la clause INNER JOIN.
Cas pratique : Donner le nom de chaque
employé et la ville où il/elle travaille
SELECT employes.nom, Ville FROM employes, departements WHERE
employes._num_dep=departements.num_dep;
ou
SELECT employes.nom, departements.ville FROM employes
79
INNER JOIN departements ON employes._num_dep =
departements.num_dep;
Auto-jointure: cette jointure d'une
table à elle-même permet derelier des informations venant d'une
ligne d'une table avec des informations venant d'une autre ligne de la
même table. Dans ce cas, il faut renommer au moins l'une des deux
occurrences de la table pour pouvoir préfixer sans ambiguïté
chaque nom de colonne.
Cas pratique : Donner pour chaque
employé le nom de son supérieur hiérarchique
SELECT employes.nom, superieurs.nom FROM employes, employes AS
superieurs WHERE employes._superieur=superieurs.num_emp;
ou
SELECT employes.nom, superieurs.nom FROM employes INNER JOIN
employes AS superieurs
ON employes._superieur=superieurs.num_emp;
O-jointure: si le critère
d'égalité correspond à la jointure la plus naturelle, les
autres opérateurs de comparaison sont également utilisables dans
le prédicat de jointure. Néanmoins, cette possibilité doit
être utilisée avec précaution car elle peut entraîner
une explosion combinatoire (on rappelle qu'une jointure ne constitue qu'une
restriction du produit cartésien de deux relations ou plus).
Cas pratique : Quels sont les
employés gagnant plus que Victor ?
SELECT e1.nom, e1.salaire, e1.fonction FROM employes AS e1,
employes AS e2 WHERE e1.salaire>e2.salaire AND e2.nom='Victor';
Jointure externe: lorsqu'une ligne
d'une table figurant dans une jointure n'a pas de correspondant dans les autres
tables, elle ne satisfait pas au critère d'équi-jointure et ne
figure donc pas dans le résultat de la requête. Une jointure
externe est une jointure qui favorise l'une des tables en affichant toutes ses
lignes, qu'il y ait ou non correspondance avec l'autre table de jointure. Les
colonnes pour lesquelles il n'y a pas de correspondance sont remplies avec la
valeur NULL. Pour définir une telle jointure, on utilise les clauses
LEFT OUTER JOIN (jointure externe gauche) et RIGHT OUTER JOIN (jointure externe
droite).
Cas pratique : Le département
de Cambridge n'apparaissait pas dans l'exemple de l'équi-jointure, mais
figurera ici :
SELECT employes.nom, departements.ville FROM employes
RIGHT JOIN departements ON employes._num_dep =
departements.num_dep;
Cas pratique : Le Président
Patton, sans supérieur hiérarchique, n'apparaissait pas dans
l'exemple de l'autojointure, mais figurera ici (avec NULL comme nom
desupérieur) :
80
SELECT employes.nom, superieurs.nom FROM employes
LEFT JOIN employes AS superieurs ON
employes._superieur=superieurs.num_emp;
Cas pratique : Retrouver les
départements n'ayant aucun employé :
SELECT departements.num_dep, employes.nom FROM employes
RIGHT JOIN departements ON employes._num_dep =
departements.num_dep WHERE employes.nom IS NULL;
Equi-jointure Auto-jointure Jointure externe
Figure IV.1. Les différents types de
jointures
|