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

Documents pareils