Leçon 11 / 15

Tester l’existence d’emprunts

20 min SQL — jointures, agrégats et sous-requêtes Gratuit

Objectif : Sélectionner les adhérents ayant au moins un emprunt en retard, sans répéter leur ligne dans le résultat.

Pour repérer les adhérents concernés par un retard, vous pourriez joindre les tables adherents et emprunts. Mais un adhérent ayant plusieurs emprunts en retard apparaîtrait alors plusieurs fois. Ici, vous ne cherchez pas à afficher chaque emprunt : vous voulez seulement savoir si au moins un emprunt répond au critère.

Vous allez utiliser EXISTS pour tester si une sous-requête renvoie au moins une ligne. La sous-requête est corrélée parce qu’elle fait référence à l’adhérent examiné par la requête extérieure. Comme dans les leçons précédentes, les clés permettent de relier les tables ; ici, la référence est emprunts.adherent_id = adherents.adherent_id.

Tester l’existence d’un emprunt en retard

La requête suivante suppose que la table emprunts contient les colonnes date_echeance et date_retour. Elle considère comme en retard un emprunt dont l’échéance est passée et qui n’a pas été rendu. Si votre schéma stocke le retour sous une autre forme, adaptez uniquement le test correspondant à l’absence de retour.

SQL
SELECT
    a.adherent_id,
    a.nom
FROM adherents AS a
WHERE EXISTS (
    SELECT 1
    FROM emprunts AS e
    WHERE e.adherent_id = a.adherent_id
      AND e.date_echeance < CURRENT_DATE
      AND e.date_retour IS NULL
)
ORDER BY a.nom, a.adherent_id;
Résultat attendu
La requête renvoie une ligne par adhérent ayant au moins un emprunt non rendu dont la date d’échéance est antérieure à la date du jour. Les adhérents sans emprunt en retard ne sont pas affichés.

Dans la sous-requête, e.adherent_id = a.adherent_id rattache les emprunts à l’adhérent courant. Pour chaque ligne de adherents, MariaDB vérifie ensuite les deux critères de retard. Dès qu’une ligne correspond, EXISTS vaut vrai ; si aucune ne correspond, il vaut faux.

Le SELECT 1 de la sous-requête ne fournit pas une valeur destinée à l’affichage : avec EXISTS, seule compte la présence d’au moins une ligne. Vous pourriez sélectionner un identifiant à la place, sans changer le résultat. En revanche, les colonnes de la requête extérieure déterminent bien les données affichées.

Pourquoi ne pas joindre directement les emprunts ?

Une jointure est adaptée si vous devez afficher les dates ou les identifiants des emprunts concernés. Mais si votre résultat doit contenir une seule ligne par adhérent, joindre directement plusieurs emprunts en retard peut répéter cet adhérent. Vous pourriez alors avoir besoin d’une déduplication ou d’un regroupement, alors que EXISTS exprime directement le besoin : l’existence d’au moins un emprunt.

Ne confondez donc pas le test d’existence avec un comptage. Cette requête ne calcule pas le nombre de retards : elle classe chaque adhérent selon que la sous-requête trouve ou non un emprunt correspondant. Si vous devez afficher le nombre, il faudra produire un agrégat, comme dans les rapports déjà construits.

À retenir

  • EXISTS vérifie si une sous-requête renvoie au moins une ligne.
  • Une sous-requête corrélée peut utiliser une colonne de la requête extérieure.
  • Utilisez EXISTS quand vous testez une présence, plutôt que de récupérer chaque ligne correspondante.
  • Le résultat extérieur conserve une ligne par adhérent sélectionné, même si plusieurs emprunts satisfont le test.

Dans la leçon suivante, vous regrouperez un résultat calculé dans une table dérivée avant de le joindre aux adhérents.

Envie d'aller plus loin ?

Les cours Enovatic sont gratuits et le resteront. Si vous cherchez un accompagnement encadré, nos formations professionnelles sont animées par les mêmes formateurs.