Télécharger la version PDF du document
Transcription
Télécharger la version PDF du document
SELECT DISTINCT personne FROM Emprunt WHERE personne NOT IN ( SELECT personne FROM Retard ) Exercices sur les bases de données IPT Première année 1 Bibliothèque La construction suivante est un peu plus compliquée. Elle est cependant intéressante à retenir car nous allons la retrouver dans des situations plus complexes. SELECT DISTINCT personne FROM Emprunt AS E WHERE NOT EXISTS ( SELECT * FROM Retard AS R WHERE E.personne = R.personne ) [AWP029] Une bibliothèque gère une base de données dont le schéma relationnel est le suivant : • EMPRUNT[personne, livre, dateEmprunt, retourPrévue, retourRéel] • RETARD[personne, livre, dateEmprunt, pénalitéRetard] Le tuple {personne ; livre ; dateEmprunt} est la clé primaire, aussi bien pour la table EMPRUNT que pour la table RETARD. Exprimez, lorsque cela est possible, les questions suivantes en algèbre relationnelle, puis construisez une requête SQL qui permet d’obtenir l’information. 3. Quelles sont les personnes ayant empruntés tous les livres ? Solution : 1. Quelles sont les personnes ayant emprunté le livre « Iliade » ? π{personne, livre} (EMPRUNT ) / π{livre} (EMPRUNT) Solution : La division cartésienne est un opérateur qui n’existe pas dans le langage SQL. Il faut donc se débrouiller autrement. Il s’agit de trouver les personnes pour lesquelles il n’existe pas de livre qu’ils n’ont pas empruntés. π{personne} ◦ σlivre=”I liade” (EMPRUNT ) SELECT DISTINCT personne FROM Emprunt WHERE livre = "Iliade" SELECT DISTINCT personne FROM Emprunt AS E1 WHERE NOT EXISTS ( SELECT * FROM Emprunt AS E2 WHERE NOT EXISTS ( SELECT * FROM Emprunt WHERE personne = E1.personne AND livre = E2.livre ) ) 2. Quelles sont les personnes n’ayant jamais rendu de livre en retard ? Solution : π{personne}(EMPRUNT ) − π{personne}(RETARD ) La traduction littérale en langage SQL donne : SELECT DISTINCT personne FROM Emprunt EXCEPT SELECT DISTINCT personne FROM Retard 4. Quels sont les livres ayant été empruntés par tout le monde ? Solution : La question est identique à la précédente, en permutant les rôles des attributs personne et livre. Beaucoup de serveurs SQL n’implémentent pas l’opération EXCEPT. Nous écrirons alors plutôt : http://docs.dichotomies.fr/2014/informatique/ipt1/exercices/base-de-donnees/ π{personne, livre} (EMPRUNT ) / π{personne}(EMPRUNT ) Denis Pinsard – Mis à jour le vendredi 02 janvier 2015 [ORT403] Il s’agit de trouver les livres pour lesquels il n’existe pas de personne qui ne l’on pas empruntés. SELECT DISTINCT livre FROM Emprunt AS E1 WHERE NOT EXISTS ( SELECT * FROM Emprunt AS E2 WHERE NOT EXISTS ( SELECT * FROM Emprunt WHERE livre = E1.livre AND personne = E2.personne ) ) SELECT dateconcert FROM Spectacle NATURAL JOIN Concert NATURAL JOIN Salle WHERE chanteur = "Corneille" AND nom = "Zénith"; 2. Quels sont les noms des salles ayant la plus grande capacité ? Solution : Cette requête ne peut pas s’exprimer en algèbre relationnel. En langage SQL, la solution la plus simple est d’utiliser l’opérateur MAX. SELECT nom FROM Salle WHERE capacite = (SELECT MAX(capacite) FROM Salle) Nous pouvons nous passer de l’opérateur MAX : SELECT nom FROM Salle AS S1 WHERE NOT EXISTS ( SELECT * FROM Salle WHERE capacite > S1.capacite ) 2 Organisme de spectacles [YTE562] Un organisme de gestion de spectacles, de salles de concert et de vente de billets de spectacles gère une base de données dont le schéma relationnel est le suivant : • SPECTACLE[idspectacle, titre, datedebut, durée, idsalle, chanteur] • CONCERT[idconcert, dateconcert, horaire, idspectacle] Nous pouvons également également utiliser le mot-clé ALL : • SALLE[idsalle, nom, adresse, capacité] SELECT nom FROM Salle WHERE capacite >= ALL ( SELECT capacite FROM Salle ) • BILLET[idbillet, idconcert, numéro, catégorie, prix] • VENTE[idvente, datevente, idbillet, moyenpaiement] Le premier attribut de chaque table est la clé primaire. Un attribut qui porte le même nom qu’une clé primaire est une clé étrangère qui fait référence à cette clé primaire. Exprimez, lorsque cela est possible, les questions suivantes en algèbre relationnelle, puis construisez une requête SQL qui permet d’obtenir l’information. 1. Quelles sont les dates du concert de Corneille au Zénith ? 3. Quels sont les chanteurs n’ayant jamais réalisé de concert à la Cygale ? Solution : Solution : Voici deux calculs possibles en algèbre relationnelle : π{chanteur} (SPECTACLE) − π{chanteur} SPECTACLE ⊲⊳ σnom=Cygale (SALLE) π{dateconcert} ◦ σchanteur=Corneille ∧ nom=Zénith (SPECTACLE ⊲⊳ CONCERT ⊲⊳ SALLE) π{dateconcert} SELECT chanteur FROM Spectacle EXCEPT SELECT chanteur FROM Spectacle NATURAL JOIN Salle WHERE nom = "Cygale" σchanteur=Corneille (SPECTACLE) ⊲⊳ CONCERT ⊲⊳ σnom=Zénith (SALLE) En terme d’efficacité, la seconde solution est préférable car elle effectue les opérations de sélection avant les jointures. La traduction en langage SQL est immédiate : http://docs.dichotomies.fr/2014/informatique/ipt1/exercices/base-de-donnees/ Denis Pinsard – Mis à jour le vendredi 02 janvier 2015 [ORT403] Page 2 SELECT chanteur FROM Spectacle WHERE chanteur NOT IN ( SELECT chanteur FROM Spectacle NATURAL JOIN Salle WHERE nom = "Cygale" ) SELECT * FROM Billet AS Billet1 WHERE Billet1.idconcert = Concert1.idconcert AND NOT EXISTS ( SELECT * FROM Vente WHERE idbillet = Billet1.idbillet ) ) 4. Quels sont les chanteurs ayant réalisé au moins un concert dans toutes les salles ? Solution : π{chanteur, idsalle}(SPECTACLE ) / π{idsalle}(SALLE) Il s’agit de trouver les chanteurs pour lesquels il n’existe pas de salles dans lesquels ils ne ceux sont pas produits. SELECT chanteur FROM Spectacle AS Spectacle1 WHERE NOT EXISTS ( SELECT * FROM Salle AS Salle1 WHERE NOT EXISTS ( SELECT * FROM Spectacle WHERE chanteur = Spectacle1.chanteur AND idsalle = Salle1.idsalle ) ) 5. Quels sont les dates et les identificateurs des concerts pour lesquels il ne reste aucun billet invendu ? Solution : BILLETINVENDU = π{idbillet, idconcert} (BILLET) − π{idbillet, idconcert} (BILLET ⊲⊳ VENTE) CONCERTCOMPLET = π{idconcert} (CONCERT) − π{idconcert} (BILLETINVENDU ) π{idconcert, dateconcert} (CONCERT ⊲⊳ CONCERTCOMPLET) Nous pouvons aussi remarquer qu’il s’agit de trouver les concerts pour lesquels il n’existe pas de billets qui ne sont pas vendus. SELECT idconcert, dateconcert FROM Concert AS Concert1 WHERE NOT EXISTS ( http://docs.dichotomies.fr/2014/informatique/ipt1/exercices/base-de-donnees/ Denis Pinsard – Mis à jour le vendredi 02 janvier 2015 [ORT403] Page 3