INF245 - partiel mars 2012

Transcription

INF245 - partiel mars 2012
L2 Informatique, 2011/12
GDINF245 - Gestion de données relationnelles et applications
Licence Science et Technologies
Devoir surveillé - mars 2012
Durée : 2 heures
Le sujet comporte 2 questions indépendantes
Documents non autorisés
Le barème est donné à titre indicatif
Instructions qui s’appliquent à tout le sujet : les requêtes en SQL devront construire des
résultats sans répétition, la clause distinct ne sera utilisée que lorsque nécessaire. Ceci quelque soit la
valeur des relations. Les produits de relation seront exprimés dans la clause from des requêtes. Toute
sous-requête sera soigneusement spécifiée.
1
A propos de bars
On s’appuie sur la base de données qui illustre le cours. On en rappelle le schéma ci-après (les attributs
soulignés forment les identifiants) :
Drinkers (name, addr, phone)
/* <n, a, p> ∈ Drinkers ⇐⇒ la personne de nom n habite à l’adresse a ; son téléphone est p. */
Beers (name, manf)
/* <n, f> ∈ Beers ⇐⇒ la bière de nom b est fabriquée par le brasseur f. */
Bars (name, addr, license, openDate)
/* <n a, l, d> ∈ Bars ⇐⇒ le bar de nom n est situé à l’adresse a. Son numéro de license est l. Ce bar est
ouvert depuis la date d. */
Likes (drinker, beer)
/* <d, b> ∈ Likes ⇐⇒ la personne d aime la bière b. */
Sells (bar, beer, price)
/* <b, e, p> ∈ Sells ⇐⇒ le bar b vend la bière e pour le prix de p. */
Frequents (drinker, bar)
/* <d, b> ∈ Frequents ⇐⇒ la personne d fréquente le bar b. */
Les contraintes d’intégrité :
domaine(price) = entiers > 0
Sells[bar] ⊆ Bars[name]
Likes[beer] ⊆ Beers[name]
Frequents[bar] ⊆ Bars[name]
Sells[beer] ⊆ Beers[name]
Likes[drinker] ⊆ Drinkers[name]
Frequents[drinker] ⊆ Drinkers[name]
Question 1 (5 points) :
En considérant les relations fournies en annexe, donner le résultat retourné par chacune des requêtes
ci-dessous (considérer le système Oracle vu en TP). Il peut s’agir d’une erreur, ou de n-uplets affichés
sous forme de tableau.
1. select beer, price
from Likes natural join Sells
where bar = ’Marble Bar’
and drinker = ’Adam’;
3. select beer, price
from Bars left outer join Sells
on (bar = name)
where price > 3 ;
2. select bar, drinker from Frequents
minus
select bar from Sells where price < 10 ;
4. select bar, count(beer), min(price)
from Sells
group by bar ;
c
M.-C.
Fauvet, C. Parent-Vigouroux – UJF/UFRIM2 AG – mars 2012
page 1
L2 Informatique, 2011/12
GDINF245 - Gestion de données relationnelles et applications
Question 2 (5 points) :
Ré-écrire en SQL les requêtes suivantes en respectant à chaque fois les instructions fournies.
1. select distinct beer, price from Sells
where bar in (select name from Bars where addr = ’Toowong’)
La requête ne doit pas comporter l’opérateur in.
2. select bar from Frequents where drinker = ’Adam’
intersect
select bar from Frequents where drinker = ’John’;
La requête ne doit pas comporter l’opérateur in, ni l’opérateur intersect.
3. select distinct name, manf
from Beers join Sells on (name=beer)
where price in (select max(price) from Sells)
La requête ne doit pas comporter la forme ...in (select...) ni la forme ...= (select...).
2
A propos de théâtre
Un directeur de théâtre désire informatiser son système de ventes de places pour les spectacles qui se
déroulent dans son théâtre au cours d’une même saison (de septembre à juin). A la fin d’une saison, le
contenu de la base de données est archivé et vidé. Pour les besoins du sujet les données de l’application
décrites ci-après ont été simplifiées.
Les spectacles. Un spectacle est identifié par un numéro et on connaı̂t son nom. Un spectacle fait
généralement l’objet de plusieurs représentations proposées à des moments différents. Il y a au plus
une représentation par spectacle et par jour. Une représentation débute à un moment donné exprimé
à la granularité de l’heure (par exemple 28/11/2007 20H).
La salle. La salle est partitionnée en zones numérotées, regroupant chacune un ensemble de places.
Une place est identifiée par un numéro de rang, et un numéro de place dans le rang. Une zone est
associée à une catégorie tarifaire (orchestre, balcon, poulailler, etc). Toutes les places de la même zone
sont dans la même catégorie. Le tarif de base associé à chaque catégorie est fixé pour l’ensemble de
tous les spectacles.
Les ventes. Chaque place vendue fait l’objet de l’émission d’un ticket identifié par un numéro de
série et estampillé par la date au moment de la transaction (instant à la granularité de la seconde).
Une vente peut concerner plusieurs places et plusieurs représentations ; elle est associée à un client
identifié par son numéro.
Le schéma relationnel est donné ci-dessous. Les identifiants sont formés des attributs notés en
caractères soulignés :
LesZones (numZ, nomC)
/* <z, c> ∈ LesZones ⇐⇒ les places de la zone z sont dans la catégorie c. */
LesCatégories (nomC, prix)
/* <c, p> ∈ LesCatégories ⇐⇒ p est le prix des places se situant dans une zone de catégorie c. */
LesPlaces (noPlace, noRang, numZ)
/* <p, r, z> ∈ LesPlaces ⇐⇒ la place de numéro p dans le rang r est dans la zone z. */
LesSpectacles (numS, nomS)
/* <s, t> ∈ LesSpectacles ⇐⇒ le spectacle de numéro s a pour titre t. */
LesReprésentations (numS, dateRep)
/* <s, d> ∈ LesReprésentations ⇐⇒ d est la date d’une représentation pour le spectacle s. */
LesTickets (noSerie, numS, dateRep, noPlace, noRang, dateEmission, noClient)
/* <t, s, d, p, r, e, n> ∈ LesTickets ⇐⇒ le ticket dont le numéro de série est t, correspondant à la place <p,
r> pour la représentation <s, d>, a été émis à la date e ; il est associé au client n. e < d. */
c
M.-C.
Fauvet, C. Parent-Vigouroux – UJF/UFRIM2 AG – mars 2012
page 2
L2 Informatique, 2011/12
GDINF245 - Gestion de données relationnelles et applications
domaine (nomS) = domaine (nomC) = chaı̂nes de caractères
domaine (dateRep) = domaine (dateEmission) = date
domaine (numZ) = domaine (noPlace) = domaine (noSérie)
= domaine (noRang) = domaine (numS) = domaine (noClient) = entier > 0
domaine (prix) = réels > 0
Les autres contraintes d’intégrité :
•
•
•
•
Dans la relation LesTickets : dateEmission < dateRep
• LesZones[nomC] = LesCatégories[nomC]
LesPlaces[numZ] = LesZones[numZ]
• LesReprésentations[numS] = LesSpectacles[numS]
LesTickets[noPlace, noRang] ⊂ LesPlaces[noPlace, noRang]
LesTickets[numS, dateRep] ⊂ LesReprésentations[numS, dateRep]
Question 3 (10 points) :
Exprimer en SQL les requêtes ci-dessous. A chaque fois, respecter les instructions données.
Pour comparer des valeurs de type date, on utilisera les opérateurs de comparaison habituels (<, >,
=, <>, ≤, ≥). On dispose de plus des fonctions to date et to char fournies par Oracle :
format: {’DD/MM/YYYY’, ’DD-Month-YYYY’, ‘DD-Month-YYYY HH24:MI’, ’HH24:MI:SS’, etc. }
to date: une chaı̂ne de caractères, un format −→ une date
/* to date (c, f) est la date déduite de la forme externe c, donnée sous forme de chaı̂ne de caractères, selon le
format f. */
to char: une date, un format −→ une chaı̂ne de caractères
/* to char (d, f) est la forme externe de la date d selon le format f. */
On rappelle que la fonction nvl spécifiée ci-dessous doit être utilisée pour fixer l’interprétation de la
valeur absente :
nvl: un type, un type −→ un type /* nvl (x, y) = si x is null alors y sinon x. */
1. Donner le prix des places de la catégorie ”poulailler”.
2. Donner les numéros des clients qui ont acheté au moins un ticket pour une représentation du
spectacle dont le nom est ’Le lac des cygnes’.
3. Pour chaque zone de la catégorie ’poulailler’, donner son numéro, le nombre de places qu’elle
comporte et son prix.
4. Pour chaque spectacle, donner son numéro, son nom, la date de sa première représentation dans
le temps.
5. Donner les numéros des clients qui n’ont pas acheté de tickets pour la représentation du
21/1/2012 du spectacle de nom ’Le lac des cygnes’.
6. Donner les numéros et noms des spectacles qui ont exactement une représentation.
Instruction : la requête ne doit comporter ni clause group by, ni fonctions
d’agrégation (count, sum, etc).
7. Pour chaque représentation, donner le numéro de son spectacle, sa date, et par zone de la salle, le
nombre et le cumul des prix des tickets vendus pour cette représentation. Le résultat comporte
un ensemble de nuplets <s, d, z, n, p> tels que s est un numéro de spectacle, d une date de
représentation de s, z est une zone du théâtre, et n est le nombre de tickets vendus dans la zone
z pour la représentation d du spectacle s, et p est le cumul des prix de ces tickets.
Cas particuliers : (1) Si aucun ticket n’a été vendu pour la représentation d du spectacle s
alors z est sans valeur, n=0 et p=0. (2) Si pour la représentation d du spectacle s, dans la zone
z aucune place ne correspond à un ticket vendu, alors n=0 et p=0.
c
M.-C.
Fauvet, C. Parent-Vigouroux – UJF/UFRIM2 AG – mars 2012
page 3
L2 Informatique, 2011/12
GDINF245 - Gestion de données relationnelles et applications
Annexe : valeur des relations de la base de données Bars
Bars
Addr
License
The Rocks 123456
Coogee
966500
Rose Bay
966410
The Rocks 123888
Sydney
122123
Kingsford
987654
Randwick
938500
Beers
Name
Manf
80/Caledonian
Bigfoot Barley Wine Sierra Nevada
Burragorang Bock
George IV Inn
Crown Lager
Carlton
Fosters Lager
Carlton
Invalid Stout
Carlton
Melbourne Bitter
Carlton
New
Toohey’s
Old
Toohey’s
Old Admiral
Lord Nelson
Pale Ale
Sierra Nevada
Premium Lager
Cascade
Red
Toohey’s
Sheaf Stout
Toohey’s
Sparkling Ale
Cooper’s
Stout
Cooper’s
Three Sheets
Lord Nelson
Victoria Bitter
Carlton
Likes
Drinker Beer
Adam
Crown Lager
Adam
Fosters
Adam
Old
Adam
New
Gernot
Premium Lager
Gernot
Sparkling Ale
John
80/John
Bigfoot Barley Wine
John
Pale Ale
John
Three Sheets
Justin
Sparkling Ale
Justin
Victoria Bitter
Name
Australia Hotel
Coogee Bay Hotel
Rose Bay Hotel
Lord Nelson
Marble Bar
Regent Hotel
Royal Hotel
openDate
12/1/1940
31/8/1980
31/8/1920
11/11/1920
1/4/2001
29/2/2000
26/6/1986
Drinkers
Addr
Phone
Randwick 9385-4444
Newtown 9415-3378
Clovelly
9665-1234
Mosman
9845-4321
Rose Bay 9371-2126
Redfern
9371-1244
Frequents
Drinker Bar
Adam
Coogee Bay Hotel
Gernot
Lord Nelson
John
Coogee Bay Hotel
Marie
Rose Bay Hotel
John
Lord Nelson
John
Australia Hotel
Justin
Regent Hotel
Justin
Marble Bar
Sells
Bar
Beer
Australia Hotel
Burragorang Bock
Coogee Bay Hotel New
Coogee Bay Hotel Old
Coogee Bay Hotel Sparkling Ale
Coogee Bay Hotel Victoria Bitter
Lord Nelson
Three Sheets
Lord Nelson
Old Admiral
Marble Bar
New
Marble Bar
Old
Marble Bar
Victoria Bitter
Regent Hotel
New
Regent Hotel
Victoria Bitter
Royal Hotel
New
Royal Hotel
Old
Royal Hotel
Victoria Bitter
Name
Adam
Gernot
John
Justin
Marie
Adrian
c
M.-C.
Fauvet, C. Parent-Vigouroux – UJF/UFRIM2 AG – mars 2012
Price
3.50
2.30
2.50
2.80
2.30
3.75
3.75
2.80
2.80
2.80
2.20
2.20
2.30
2.30
2.30
page 4