SQL: jointures
Serge Abiteboul, Directeur de Recherche INRIA
Philippe Rigaux, Professeur des Universités au Cnam
1 Philippe Rigaux - SQL: jointures
Jointures
Jointure = produit cartésien composé avec une sélection.
select expressions
from table1 cross join table2
[where condition_jointure]
Interprétation : comme avant, l’espace de recherche (from) est
maintenant la table résultat de table1 × table2
Remarque: autres syntaxes
SQL propose plusieurs syntaxes équivalentes pour la jointure.
Nous donnons les autres options plus tard.
2 Philippe Rigaux - SQL: jointures
Cas extrême : le produit cartésien
Sans clause where, on effectue un produit cartésien.
select * from Logement cross join Activité
code nom capacité type codeLog. codeActivité
ca Causses 45 Auberge ca Randonnée
ge Génépi 134 Hôtel ca Randonnée
pi U Pinzutu 10 Gîte ca Randonnée
ta Tabriz 34 Hôtel ca Randonnée
ca Causses 45 Auberge ge Piscine
ge Génépi 134 Hôtel ge Piscine
pi U Pinzutu 10 Gîte ge Piscine
... ... ... ... ... ...
Quels nuplets nous intéressent particulièrement ?
3 Philippe Rigaux - SQL: jointures
En ajoutant la sélection
Le plus souvent, la jointure est “naturelle” : la clé primaire
d’une table doit être égale à la clé étrangère d’une autre.
select * from Logement cross join Activité
where code = codeLogement
code nom capacité type codeLog. codeActivité
ca Causses 45 Auberge ca Randonnée
ge Génépi 134 Hôtel ge Piscine
ge Génépi 134 Hôtel ge Ski
pi U Pinzutu 10 Gîte pi Plongée
pi U Pinzutu 10 Gîte pi Voile
4 Philippe Rigaux - SQL: jointures
Plus de deux tables ?
Aucun problème : on les énumère dans le from.
Exemple : les voyageurs et les logements qu’ils ont visités.
select [Link] as nomVoyageur, [Link] as nomLogement
from Logement as L, Séjour as S, Voyageur as V
where code = [Link]
and [Link] = [Link]
Remarque 1 : dans la clause from, on utilise le plus souvent la
virgule à la place de cross join.
Remarque 2 : le renommage as sert, notamment, à gérer les
ambiguités soulevées par les noms d’attributs.
5 Philippe Rigaux - SQL: jointures
D’autres syntaxes ?
SQL connaît la jointure naturelle.
select *
from Séjour natural join Voyageur
idV. idS. codeL. début fin nom prénom ville
10 1 pi 20 20 Fogg Phileas Ajaccio
10 6 pi 10 12 Fogg Phileas Ajaccio
20 2 ta 21 22 Bouvier Nicolas Aurillac
20 4 pi 19 23 Bouvier Nicolas Aurillac
... ... ... ... ... ... ... ...
NB : l’attribut codeLogement apparaît une seule fois
6 Philippe Rigaux - SQL: jointures
D’autres syntaxes ?
SQL connaît aussi la jointure “non naturelle” (les attributs de
jointure n’ont pas le même nom).
select *
from Logement join Activité on (code=codeLogement)
Intérêt ? Aucun. Connaître une syntaxe suffit. Celle que nous
avons présenté au début est la plus lisible et la plus neutre.
Remarque: La syntaxe ne compte pas !
Il existe 100 façons d’écrire une même requête : aucune n’est
meilleure qu’une autre : le système décide seul de l’évaluation !
7 Philippe Rigaux - SQL: jointures
À retenir
La jointure est obtenue en effectuant un produit cartésien dans
le from.
• Tout se passe comme si on interrogeait une seule table,
celle définie par table1 × table2
• Le critère de jointure est exprimé dans le where, avec les
critères (éventuels) de sélection
• Les synonymes (attributs ou tables) entrainent des
ambiguités, et nécessitent des renommages
Beaucoup de syntaxes alternatives (dues aux deux paradigmes
fondant SQL). En connaître une suffit.
8 Philippe Rigaux - SQL: jointures