Cours CPTIC 157
Bases de données sur Internet
16 et 17 avril 2002

Les jointures

Toutes les opérations que nous avons fait jusqu'à maintenant n'ont porté que sur une seule table à la fois. Nous allons donc maintenant introduire la notion de jointure, qui a été le plus apporté par les systèmes de bases de données relationnels.

Une jointure permet de mettre en relation deux tables ou plus, dans une seule requête de sélection.

Une jointure peut être reconnue dans une requête SQL par le fait que la clause FROM comporte plusieurs tables.

SELECT colonne1, colonne2, colonne3, etc
FROM Table1, Table2
WHERE conditions

La jointure peut être expliquée plus facilement en montrant ce qui pourrait se passer avec un système mono table, sans avoir la possibilité de joindre des tables. Un système tel que celui-ci est souvent décrit comme une table plate. Supposons que nous ayons une base de données mono table qui serait utilisée pour assurer le suivi de tous nos clients et de tous ce qu'ils ont acheté dans notre magasin:

id prenom nom adresse no postal ville canton date article prix

Pour chaque nouvel enregistrement inséré dans cette table, toutes les colonnes vont être mises à jour, ce qui résultera en une quantité inutile de données redondantes. Par exemple, chaque fois que Marie Navoile achète quelque chose, les lignes suivantes seront insérée dans la table:

no_client
prenom
nom
adresse
no postal
ville
canton
date
article
prix
12673 Marie Navoile 5, ch. du Vieux Port
1290
Versoix GE 2002-01-12 snowboard
845
12673 Marie Navoile 5, ch. du Vieux Port
1290
Versoix GE 2002-01-12 pelle à neige
37
12673 Marie Navoile 5, ch. du Vieux Port
1290
Versoix GE 2002-01-12 gants
45
12673 Marie Navoile 5, ch. du Vieux Port
1290
Versoix GE 2002-01-12 lampe de poche
12
12673 Marie Navoile 5, ch. du Vieux Port
1290
Versoix GE 2002-01-12 tente
257

L'idéal serait d'avoir deux tables, une pour les clients, et une pour ce qu'ils ont acheté dans notre magasin.

Client

no_client
prenom
nom
adresse
no postal ville canton

Achat

no_client
date
article
prix

Maintenant, chaque fois qu'un achat est effectué par un même client, seule la table Achat doit être mise à jour. Nous venons juste d'éliminer l'information qui était rendondante, nous venons de normaliser la base de donnée.

Notez le fait que les deux tables ont une colonne en commun, no_client. Cette colonne, qui contient un numéro de client unique va servir à joindre les deux tables. En utilisant ces deux nouvelles tables, créons une requête qui nous retourne le nom, le prénom des clients, ainsi que tous les articles qu'ils ont acheté:

SELECT Client.nom, Client.prenom, Achat.article
FROM Client, Achat
WHERE Client.noclient = Achat.noclient

Cette jointure est la plus commune, et porte le nom d'équi-jointure (inner join en anglais). Il existe d'autre types de jointures, qui seront peut-être vu dans d'autres pages de ce tutoriel.

Exercices

Soit les tables Client et Achat:

  1. Ecrire une requête utilisant une jointure pour déterminer quels articles ont été acheté par chacun des clients. Sélectionner le numéro de client, le prénom, le nom, la date de commande, l'article et le prix pour chacun des articles figurant dans la table achat.
  2. Même requête que pour l'exercice précédent, en présentant maintenant les données par canton, dans l'ordre alphabétique inverse.