APPLICATION
:
A partir de la base de données BIBLIOTHEQUE.MDB et du modèle relationnel correspondant, formulez sur papier puis dans access les requêtes SQL permettant d’obtenir les réponses suivantes :
RAPPEL : Modèle relationnel :
GENRE(CodeGenre, LibelleGenre)
AUTEUR(N°Auteur,
PrenAut, NomAut)
EDITEUR(N°Editeur, NomEditeur)
ADHERENT(N°Adh, NomAdh, PrenAdh, RueAdh, VilleAdh, #N°AdhParent)
EMPRUNT(#N°Adh, #N°Livre,
#DateEmprunt, DateRetour)
LIVRES(N°Livre, TitreLivre,
annee, #CodeGenre, #N°Editeur, #N°Auteur)
R1 |
Quels sont les livres (titres) qui n’ont jamais été empruntés ? Il s’agit d’une différence : on selectionne tous les livres puis seulement les livres empruntés et par différence on obtient les livres jamais empruntés SELECT TitreLivre from LIVRES WHERE LIVRES.N°livre NOT IN (SELECT EMPRUNT.N°Livre FROM emprunt); |
R2 |
Quels sont les auteurs n’ayant aucun livre dans la base de données Comme dans R1, il s’agit d’une différence : on sélectionne tous les auteurs puis tous les auteurs ayant écrit un livre et par différence on obtient les auteurs n’ayant pas écrit de livres SELECT NomAut FROM AUTEUR WHERE AUTEUR.N°Auteur NOT IN (SELECT N°Auteur FROM LIVRES); |
R3 |
A quels dates les livres « A travers le temps » et « Zéro absolus » ont il été empruntés ? Il s’agit ici d’une union que l’on peut traiter de deux manières : Soit par une union select : SELECT DateEmprunt FROM EMPRUNT, LIVRES WHERE TitreLivre="A
travers le temps" AND
EMPRUNT.N°Livre=LIVRES.N°Livre ; UNION SELECT DateEmprunt FROM EMPRUNT, LIVRES WHERE TitreLivre="Zéro
absolu" AND
EMPRUNT.N°Livre=LIVRES.N°Livre Ou avec un critère de sélection incluant le OU logique SELECT DateEmprunt FROM EMPRUNT, LIVRES WHERE TitreLivre="A
travers le temps" OR TitreLivre="Zéro absolu" AND EMPRUNT.N°Livre=LIVRES.N°Livre ; |
R4 |
Quels sont les livres ayant été empruntés à la fois par « Eric JULIANA » et « Alexia KILOURIEN » ? (A faire directement en QBE dans ACCESS) Il s’agit cette fois d’une requête intersection (on veut connaître les titres de livres empruntés par JULIANA et KILOURIEN) En langage SQL l’instruction serait la suivante : SELECT TitreLivre FROM LIVRE, EMPRUNT, ADHERENT WHERE
LIVRES.N°Livre=EMPRUNT.N°Livre AND ADHERENT.N°Adh=ADHERENT.N°Adh AND NomAdh=”JULIANA” AND PrenAdh=”Eric” INTERSECT SELECT TitreLivre FROM LIVRE, EMPRUNT, ADHERENT WHERE
LIVRES.N°Livre=EMPRUNT.N°Livre AND ADHERENT.N°Adh=ADHERENT.N°Adh AND NomAdh=”KILOURIEN” AND PrenAdh=”Alexia” Avec ACCESS, ce type de requête n’est pas réalisable, il faut utiliser une selection utilisant le ET logique. Pbme : la condition NomAdh= « JULIANA » AND NomAdh= »KILOURIEN » est impossible à poser sur la table ADHERENT. On recourt ici à nouveau à une requête imbriquée Autre solution SELECT LIVRES.N°Livre,
LIVRES.TitreLivre FROM LIVRES WHERE N°Livre IN (SELECT EMPRUNT.N°Livre AS Livres1 FROM EMPRUNT,
ADHERENT WHERE ADHERENT.N°Adh = EMPRUNT.N°Adh AND
ADHERENT.NomAdh="KILOURIEN" AND
ADHERENT.PrenAdh="Alexia") AND N°Livre IN (SELECT EMPRUNT.N°Livre AS Livres2 FROM EMPRUNT, ADHERENT WHERE
ADHERENT.N°Adh = EMPRUNT.N°Adh AND
ADHERENT.NomAdh="JULIANA" AND
ADHERENT.PrenAdh="Eric"); (solution proposée par JL
OUDART – Lycée Guy Mollet Arras) |
R5 |
Pour la période du 01/01/02 au 31/05/02 quels sont les journées où aucun emprunt de livres n’a été réalisé ? Requête non réalisable car on
n’a pas de table DATE contenant toutes les dates d’ouverture de la
bibliotheque |
REVISIONS SUR LES REQUETES OPERATIONS |
|
R6 |
Quel est le nombre de livres empruntés par chaque adhérent SELECT NomAdh,
count(emprunt.N°livre) as Nbemprunt from ADHERENT, EMPRUNT WHERE
ADHERENT.N°Adh=EMPRUNT.N°Adh GROUP BY NomAdh; |
R7 |
Quels sont les adhérents ayant emprunté au moins deux fois le même livre Cette requête opération est particulière car un critère de sélection est posé sur une donnée calculée. Dans ce cas, le critère ne se définit pas avec une clause WHERE mais avec la clause HAVING ajoutée obligatoirement A LA FIN de la requête : SELECT NomAdh,
EMPRUNT.N°Livre, count(EMPRUNT.N°Livre) AS Nbemprunt FROM EMPRUNT, ADHERENT WHERE EMPRUNT.N°Adh=ADHERENT.N°Adh GROUP BY NomAdh, EMPRUNT.N°Livre HAVING
COUNT(EMPRUNT.N°Livre)>2; Le critère de regroupement est
double (nomadh et n°livre emprunté) Remarque : par rapport à l’énoncé strict, la première ligne pouvait se réduire à SELECT NomAdh |
R8 |
Le livre « En pleine lumière » a été dégradé. On voudrait connaître le nom de chaque emprunteur ainsi que la date (résultats triés par date) SELECT NomAdh, DateEmprunt FROM ADHERENT, EMPRUNT, LIVRES WHERE
ADHERENT.N°Adh=EMPRUNT.N°Adh AND
EMPRUNT.N°Livre=LIVRES.N°Livre AND TitreLivre="En pleine
lumière" ORDER BY DateEmprunt; |
R9 |
Quels sont les emprunteurs ayant conservé un ouvrage plus de 10 jours ? SELECT NomAdh, N°Livre FROM ADHERENT, EMPRUNT WHERE ADHERENT.N°Adh=EMPRUNT.N°Adh AND DateRetour-DateEmprunt>10; |
R10 |
Pour chaque genre de roman, combien y a t’il de livre au total SELECT LibelleGenre,
count(N°Livre) AS NbLivres FROM GENRE, LIVRES WHERE GENRE.CodeGenre=LIVRES.CodeGenre GROUP BY LibelleGenre; |