Tester l’existence d’emprunts
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.
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;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
EXISTSvé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
EXISTSquand 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.