Lire des données liées entre plusieurs tables
Objectif : Relier les emprunts à leurs adhérents et exemplaires pour afficher des informations provenant de plusieurs tables.
Un emprunt contient l’identifiant de l’adhérent et celui de l’exemplaire, mais pas nécessairement leurs noms ni leur code-barres. Pour consulter ces informations ensemble, vous devez relier les tables concernées. Vous allez construire une requête qui décrit chaque emprunt avec l’adhérent et l’exemplaire associés.
Partir des relations déjà présentes dans le schéma
Dans les leçons précédentes, vous avez repéré les tables, leurs colonnes et les clés étrangères du schéma. Ici, la table emprunts référence adherents par id_adherent et exemplaires par id_exemplaire. Ces relations indiquent quelles colonnes doivent être mises en correspondance pour retrouver les détails associés à chaque emprunt.
INNER JOIN relie deux tables selon une condition écrite après ON. Dans cette requête, la condition compare la clé étrangère de emprunts à la clé correspondante de adherents. Une ligne de résultat est produite lorsque les valeurs correspondent ; la jointure n’ajoute pas au résultat les emprunts sans ligne correspondante dans l’autre table.
Relier emprunts et adhérents
Pour rendre la requête plus lisible, vous pouvez donner un alias à chaque table. L’alias est un nom court utilisé dans la requête pour désigner une table : e représente emprunts, et a représente adherents. Vous préfixez ensuite les noms de colonnes par l’alias et un point, par exemple e.id_adherent.
-- Afficher les emprunts et les adhérents concernés
SELECT e.id_emprunt, a.nom, a.prenom, e.date_emprunt
FROM emprunts AS e
INNER JOIN adherents AS a
ON e.id_adherent = a.id_adherent;Le résultat contient les colonnes id_emprunt, nom, prenom et date_emprunt. Les valeurs dépendent des données présentes dans votre base.La clause ON exprime la relation entre les deux tables : pour chaque emprunt, la valeur de e.id_adherent doit correspondre à a.id_adherent. Les colonnes sélectionnées peuvent provenir de l’une ou l’autre table. Préfixez-les avec leur alias pour que la provenance soit claire et que MariaDB puisse distinguer les colonnes si plusieurs tables en possèdent une de même nom.
Ajouter les exemplaires au résultat
Vous pouvez poursuivre la chaîne en reliant aussi emprunts à exemplaires. L’alias x désigne cette dernière table ; la condition de jointure utilise e.id_exemplaire et x.id_exemplaire. La requête ci-dessous affiche ainsi l’identifiant de l’emprunt, l’identité de l’adhérent, le code-barres de l’exemplaire et les dates de l’emprunt.
-- Décrire chaque emprunt avec son adhérent et son exemplaire
SELECT e.id_emprunt,
a.nom,
a.prenom,
x.code_barres,
e.date_emprunt,
e.date_retour_prevue
FROM emprunts AS e
INNER JOIN adherents AS a
ON e.id_adherent = a.id_adherent
INNER JOIN exemplaires AS x
ON e.id_exemplaire = x.id_exemplaire;Le résultat comporte une ligne par emprunt relié à un adhérent et à un exemplaire, avec les colonnes id_emprunt, nom, prenom, code_barres, date_emprunt et date_retour_prevue.Chaque ligne du résultat rassemble des valeurs provenant de trois tables, sans modifier les données enregistrées. Les deux jointures s’appuient sur les clés étrangères de emprunts ; elles décrivent le chemin qui relie un emprunt à son adhérent et à son exemplaire. Vous pourrez ajouter d’autres tables lorsque votre question nécessitera, par exemple, des informations sur l’œuvre associée à un exemplaire.
Mettre les requêtes dans le projet
Ajoutez ces exemples à requetes.sql, à la suite des deux requêtes SELECT déjà écrites. Les commentaires indiquent l’intention de chaque requête ; les points-virgules permettent de les exécuter séparément dans votre client MariaDB. Les fichiers schema.sql, donnees.sql, index.html et style.css ne changent pas dans cette leçon.
-- Afficher les noms et dates d’inscription des adhérents
SELECT nom, prenom, date_inscription
FROM adherents;
-- Afficher les identifiants et courriels des adhérents
SELECT id_adherent, courriel
FROM adherents;
-- Afficher les emprunts et les adhérents concernés
SELECT e.id_emprunt, a.nom, a.prenom, e.date_emprunt
FROM emprunts AS e
INNER JOIN adherents AS a
ON e.id_adherent = a.id_adherent;
-- Décrire chaque emprunt avec son adhérent et son exemplaire
SELECT e.id_emprunt,
a.nom,
a.prenom,
x.code_barres,
e.date_emprunt,
e.date_retour_prevue
FROM emprunts AS e
INNER JOIN adherents AS a
ON e.id_adherent = a.id_adherent
INNER JOIN exemplaires AS x
ON e.id_exemplaire = x.id_exemplaire;À retenir
- Utilisez INNER JOIN pour relier des tables lorsque leurs lignes ont une correspondance selon la condition indiquée.
- Écrivez la correspondance entre les colonnes liées dans la clause ON.
- Donnez des alias aux tables pour raccourcir et clarifier les références aux colonnes.
- Préfixez les colonnes par leur alias lorsque vous sélectionnez des informations de plusieurs tables.
Dans la prochaine leçon, vous apprendrez à éviter les lignes répétées dans un résultat avec DISTINCT.