Tableau 2. Lieux de naissance
Nom | Prénom | Lieu de naissance |
---|---|---|
Auguin | Christophe | Granville |
Bart | Jean | Dunkerque |
Cartier | Jacques | Saint Malo |
Dumont d'Urville | Jules | Condé |
Dupleix | Joseph | Landrecies |
Moitessier | Bernard | Saïgon |
Montcalm | Louis | Nîmes |
Surcouf | Robert | Saint Malo |
Tabarly | Eric | Nantes |
varchar
, et à renseigner cette colonne avec ces nouvelles données. Cette approche pourrait certainement fonctionner, mais elle poserait d'emblée un problème. Dans notre exemple très simple, sur 9 marins, nous en avons déjà 2 qui sont nés au même endroit : Saint Malo. On peut supposer que si l'on avait des milliers de marins dans notre table, le nombre de doublons dans cette colonne serait assez important.
Le traitement d'une requête du type "je veux extraire tous les marins nés à Saint Malo" fonctionnerait de façon triviale, en sélectionnant toutes les valeurs "Saint Malo" dans la colonne "lieu de naissance". Il vaut mieux que la saisie des valeurs de cette colonne se passe sans erreur, car si la valeur "Saint Malau" a été saisie à la place de "Saint Malo", le marin associé ne sera jamais sélectionné par une telle requête ! Pire que cela, détecter ce genre d'erreurs sur de très grands volumes de données peut devenir un réel problème : il se peut que notre marin soit perdu à jamais dans l'immensité océanique des bases de donneés mal rangées.
De plus, enregistrer une commune dans une table
Marins
n'est pas une façon naturelle de traiter un tel problème. Après tout, une commune existe indépendamment du fait qu'un marin y est né.
Une bonne façon de traiter ce problème, est de reconnaître l'indépendance de ces communes, et de leur offrir leur propre table. Afin de pouvoir référencer ces communes, on ajoute à cette table une colonne
ID
, qui portera un numéro, unique dans cette table, et qui nous servira de clé de référence.
Créons donc la table
Communes
suivante.
Tableau 3. Lieux de naissance
ID | Nom de commune |
---|---|
1 | Condé |
2 | Dunkerque |
3 | Landrecies |
4 | Nantes |
5 | Nîmes |
6 | Saïgon |
7 | Saint Malo |
8 | Granville |
Marins
.
Marins
avec les valeurs suivantes.
Tableau 4. Table
Marins
avec les lieux de naissance
Nom | Prénom | Lieu de naissance |
---|---|---|
Auguin | Christophe | 8 |
Bart | Jean | 2 |
Cartier | Jacques | 7 |
Dumont d'Urville | Jules | 1 |
Dupleix | Joseph | 3 |
Moitessier | Bernard | 6 |
Montcalm | Louis | 5 |
Surcouf | Robert | 7 |
Tabarly | Eric | 4 |
Marins
et la table
Communes
, qui nous affiche le nom de chaque marin et sa commune de naissance.
Exemple 16. Requête jointe sur Marins et Communes
select Marins.nom, Marins.prenom, Communes.nom from Marins join Communes on Marins.id_commune = Communes.id order by Marins.nom ;
NOM PRENOM NOM ----------------------- --------------------------- --------------- Auguin Christophe Granville Bart Jean Dunkerque Cartier Jacques St Malo Dumont d'Urville Jules Condé Dupleix Joseph Landrecies Moitessier Bernard Saïgon Montcalm Louis Nîmes Surcouf Robert Saint Malo Tabarly Eric NantesDétaillons ici les nouveautés de cette requête.
Marins.prenom
, puisqu’il n’y a qu’un seul champ
prenom
dans les deux tables.
from
est suivi du nom de la table principale de la requête :
Marins
.
Communes
est jointe à la table
Marin
par le mot-clé
on
. La jointure est réglée par l’égalité entre les champs
id
et
id_commune
des tables
Communes
et
Marins
respectivement
Exemple 17. Requête jointe sur Marins et Communes - 2
select Marins.nom, Marins.prenom, Communes.nom from Marins, Communes where Marins.id_commune = Communes.id order by Marins.nom ;
ID
n'est pas renseignée pour une commune donnée ?
ID
?
id_commune
?
id_commune
?
ID
de la table
Communes
comme étant une
clé primaire
répond aux deux premières interrogations. Cette notion est centrale en SQL, et nous la reverrons en détails. Indiquons ici simplement qu'une colonne déclarée comme étant une clé primaire d'une table ne peut pas prendre de valeurs nulles, et ne peut pas porter de doublons.
Notons toutefois, qu'il est possible en SQL d'empêcher la présence de doublons dans une colonne, de même que la présence de valeurs nulles, sans utiliser le mécanisme des clés primaires.
Les deux dernières interrogations sont un peu plus subtiles : on souhaite établir une double contrainte entre une colonne d'une table, et une colonne d'une autre table. Effectivement, lors de l'insertion d'un nouveau marin, on souhaite que
id_commune
, s'il est non nul, référence obligatoirement une valeur de la colonne
ID
de la table
Communes
, et que réciproquement, il ne soit pas possible d'effacer une commune si elle est référencée par un marin.
L'outil que nous fournit SQL pour ce faire et la
clé étrangère
. Une colonne peut être déclarée comme étant une clé étrangère. Dans ce cas, les valeurs qu'elle porte doivent correspondre à celles d'une autre colonne, en général d'une autre table. Si, lors de la création, la valeur insérée ne correspond à aucune valeur, alors l'insertion échoue. De l'autre côté de la relation, si l'on tente d'effacer la valeur référencée, une erreur est générée, qui peut être gérée applicativement ou non.