Info – Exercices 7 Bases de données relationnelles

publicité
Info – Exercices 7
Bases de données relationnelles
Requêtes élémentaires sur des bases de données relationnelles, TP et
exercices posés aux concours.
7
Bases de données relationnelles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1
Travaux pratiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2
Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3
Indications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1
2
2
5
PCSI2 \ 2014-2015
Laurent Kaczmarek
1. Travaux pratiques
1 . [ À traiter sur machine ] ( ind )
Le fichier films.db contient une base de données sur le cinéma. Elle est constituée de six relations. Voici
son schéma relationnel :
. acteur[id,prenom,nom]
. jeu[id_film,id_acteur]
. entree[id_utilisateur,id_film,note]
. realisateur[id,prenom,nom]
. film[id,titre,annee,id_realisateur]
. utilisateur[id,prenom,nom]
a) Ouvrir pyzo, importer la bibliothèque sqlite3, créer une connexion conn et un curseur c.
b) Effectuer quelques requêtes afin de comprendre la structure et le type d’informations contenues
dans chaque relation.
c) Requêtes élémentaires.
i) Afficher les films sortis l’année de votre naissance.
ii) Afficher les films de Akira Kurosawa.
iii) Afficher les films de Jim Carrey.
iv) Afficher les acteurs du film Inception.
v) Afficher les acteurs ayant été dirigés par Francis Ford Coppola.
vi) Afficher les films d’Alfred Hitchcock avec Cary Grant.
vii) Afficher la liste des réalisateurs accompagnés du nombre de leurs films dans la base de données.
viii) Afficher les acteurs ayant joué dans au moins trois films de cette base de données.
ix) Afficher le total des films par année par valeurs décroissantes.
x) Afficher le total de films par réalisateur par valeurs décroissantes.
xi) Afficher chaque utilisateur avec la moyenne de ses notes.
xii) Afficher les moyennes des notes des films par ordre décroissant.
xiii) Proposer à votre voisin une requête futile de votre choix.
2. Exercices
2 . [ Extrait de l’épreuve écrite d’informatique commune des Mines 2015 ] ( ind )
Après son assemblage et avant les différents tests de validation, un numéro de série unique est attribué
à chaque imprimante. À la fin des tests de chaque imprimante, les résultats d’analyse ainsi que le fichier
contenant l’ensemble des mesures réalisées sur l’imprimante sont rangés dans la table testfin dont le
schéma relationnel est :
testfin[nSerie,dateTest,Imoy,Iec,fichierMes]
Lorsqu’une imprimante satisfait les critères de validation, elle est enregistrée dans la table production
avec son numéro de série, la date et l’heure de sortie de production ainsi que son type.
production[Num,nSerie,dateProd,type]
a) Rédiger une requête SQL permettant d’obtenir les numéros de série nSerie des imprimantes ayant
une valeur de Imoy comprise strictement entre deux bornes Imin et Imax.
LLG \ PCSI2
Info – Exercices 7 \ 2
PCSI2 \ 2014-2015
Laurent Kaczmarek
b) Rédiger une requête SQL permettant d’obtenir les numéros de série nSerie, la valeur de l’écarttype Iec et le fichier de mesures fichierMes des imprimantes ayant une valeur de Iec strictement
inférieure à la valeur moyenne de la colonne Iec.
c) Rédiger une requête SQL qui permettra d’extraire à partir des tables testfin et production le
numéro de série nSerie et le fichier de mesures fichierMes correspondant aux imprimantes qui
n’ont pas été validées en sortie de production.
3 . [ Extrait de l’épreuve écrite d’informatique commune de Centrale 2015 ] ( ind )
À partir de mesures régulièrement effectuées par différents observatoires, une base de données des caractéristiques et des états des corps célestes de notre système solaire est maintenue à jour. Les données
à extraire sont les masses des corps étudiés et leurs états (position et vitesse) à l’instant t m du début
d’une simulation numérique. Une version simplifiée, réduite à deux tables, de la base de données du
Système solaire est décrite ci-dessous :
. La table CORPS répertorie les corps étudiés, elle contient les colonnes :
† id_corps (clé primaire) entier identifiant chaque corps ;
† nom, chaine de caractères, désigne le nom usuel du corps ;
† masse, de type flottant, contient la masse du corps.
. La table ETAT rassemble l’historique des états successifs (positions, vitesses) des corps étudiés. Elle est constituée de huit colonnes :
† id_corps de type entier, identifie le corps concerné ;
† datem est la date de la mesure, sous forme d’un entier donnant le nombre de secondes
écoulées depuis un instant d’origine ;
† trois colonnes de type flottant pour les composantes de la position x, y, z ;
† trois colonnes de type flottant pour les composantes de la vitesse vx, vy, vz.
Les masses sont exprimées en kilogrammes, les distances en unités astronomiques (1 ua = 1, 5 × 1011
m) et les vitesses en kilomètres par seconde. Le référentiel utilisé pour exprimer les composantes des
positions et des vitesses est galiléen, orthonormé et son centre est situé à proximité du soleil.
a) Écrire une requête SQL qui renvoie la liste des masses de tous les corps étudiés.
b) Les états des différents corps ne sont pas forcément tous déterminés exactement au même instant.
Nous allons assimiler l’état initial (à la date t m ) de chaque corps à son dernier état connu antérieur
à t m . Dans toute la suite, on supposera que la valeur de t m , sous le format utilisé dans la table ETAT,
est accessible à toute requête SQL via l’expression tmin().
i) On souhaite d’abord vérifier que tous les corps étudiés disposent d’un état connu antérieur à
tmin(). Le nombre de corps présents dans la base est obtenu grâce à la requête
SELECT count(*) FROM corps
Écrire une requête SQL qui renvoie le nombre de corps qui ont au moins un état connu antérieur à tmin().
ii) Écrire une requête SQL qui renvoie, pour chaque corps, son identifiant et la date de son dernier état antérieur à tmin().
iii) Le résultat de la requête précédente est stocké dans une nouvelle table date_mesure à deux
colonnes :
. id_corps de type entier, contient l’identifiant du corps considéré ;
. date_der de type entier, correspond à la date du dernier état connu du corps considéré,
antérieur à tmin().
Pour simplifier la simulation, on décide de négliger l’influence des corps ayant une masse
strictement inférieure à une valeur fixée masse_min() et de ne s’intéresser qu’aux corps situés
LLG \ PCSI2
Info – Exercices 7 \ 3
PCSI2 \ 2014-2015
Laurent Kaczmarek
dans un cube, centré sur l’origine du référentiel de référence et d’arête arete() donnée. Les
faces de ce cube sont parallèles aux plans formés par les axes du référentiel de référence. Écrire
une requête SQL qui renvoie la masse et l’état initial (sous la forme masse, x, y, z, vx, vy, vz)
de chaque corps retenu pour participer à la simulation. On classera les corps dans l’ordre
croissant par rapport à leur distance à l’origine du référentiel.
LLG \ PCSI2
Info – Exercices 7 \ 4
PCSI2 \ 2014-2015
Laurent Kaczmarek
3. Indications
1 . [ À traiter sur machine ]
a) select titre from film where annee=1974 ;
b) select titre from film join realisateur on id_realisateur=realisateur.id where
prenom="Akira" and nom="Kurosawa" ;
c) select titre from film join jeu join acteur on film.id=id_film and id_acteur=acteur.id
where prenom="Jim" and nom="Carrey" ;
d) select nom,prenom from film join acteur join jeu on id_acteur=acteur.id and
film.id=id_film where titre="Inception" ;
e) select distinct acteur.nom,acteur.prenom from film join jeu join acteur join realisateur
on realisateur.id=id_realisateur and id_film=film.id and id_acteur=acteur.id
where realisateur.prenom="Francis Ford" and realisateur.nom="Coppola" ;
f) select
titre from film join jeu join acteur join realisateur on
id_acteur=acteur.id and id_film=film.id and id_realisateur=realisateur.id
where realisateur.nom="Hitchcock" and realisateur.prenom="Alfred" and acteur.nom="Grant" and acteur.prenom="Cary" ;
g) select
nom,prenom,count(*) as
total
from
film
id_realisateur=realisateur.id group by nom,prenom ;
join
realisateur
on
h) select nom,prenom from (select nom,prenom,count(*) as n from film join jeu join acteur on
id_acteur=acteur.id and id_film=film.id group by nom,prenom having n>2) ;
i) select annee,count(*) as total from film group by annee order by total desc ;
j) select
nom,prenom,count(*) as
total
from
film
join
realisateur
id_realisateur=realisateur.id group by nom,prenom order by total desc ;
k) select
nom,prenom,avg(note)
from
utilisateur
id_utilisateur=utilisateur.id group by nom,prenom ;
join
entree
on
on
l) select titre,avg(note) as moy from entree join film on id_film=film.id group by titre
order by moy desc ;
2 . [ Extrait de l’épreuve écrite d’informatique commune des Mines 2015 ]
a) select nSerie from testfin where Imin<=Imoy and Imoy<=Imax ;
b) select nSerie,Iec,fichierMes from testfin where Iec<(select avg(Iec) from testfin) ;
c) select nSerie,fichierMes from testfin join ((select nSerie as nbis from testfin) except
(select nSerie from production)) on nbis=nSerie ;
3 . [ Extrait de l’épreuve écrite d’informatique commune de Centrale 2015 ]
a) select masse from corps ;
b)
i) select count(*) from (select distint id_corps from etat where datem<tmin()) ;
ou :
select count(distint id_corps) from etat where datem<tmin() ;
ii) select id_corps,max(datem) from etat where datem<tmin() group by id_corps ;
iii) select
masse,x,y,z,vx,vy,vz from corps join etat join date_mesure on
date_mesure.id_corps=etat.id_corps and corps.id_corps=etat.id_corps and
LLG \ PCSI2
Info – Exercices 7 \ 5
PCSI2 \ 2014-2015
Laurent Kaczmarek
date_der=datem where masse>=masse_min() and x<arete()/2 and x>-arete()/2
and y<arete()/2 and y>-arete()/2 and z<arete()/2 and z>-arete()/2 order by
x*x+y*y+z*z asc ;
LLG \ PCSI2
Info – Exercices 7 \ 6
Téléchargement