TP 10 - Tourbillon

Transcription

TP 10 - Tourbillon
5/2014
MPSI 1
2014-2015
Informatique
Travaux pratiques no 10
Bases de données 1
Interface phpMyAdmin
L’intégralité des TPs de bdds se passera dans un navigateur web. Je vous recommande d’utiliser
Firefox™ou Chrome™.
Question 1 Allez sur le site http://sql.mpsi2.info et identifiez vous avec le couple utilisateur/mot de passe suivant : ipt/ipt.
Sélectionnez ipt dans la barre de navigation à gauche de l’écran.
Vous pouvez alors voir les tables (relations) présentes dans cette base de donnée. Les prochains
exercices utiliseront ces bases.
Données géographiques
Cet exercice porte sur les tables bbc et cia qui ont toutes deux le même schéma :
nom
region
bbc,cia
superficie
population
pib
Recherche dans une seule table
Question 2 Cliquez sur la table bbc à gauche. On peut examiner le contenu de la table sous forme de
liste.
Avec le compte ipt vous ne pouvez rien modifier.
Question 3 Dans la partie supérieure de la page vous pouvez voir un chemin d’accès : localhost →
ipt → bbc.
Cliquez sur ipt pour revenir à liste des tables de la base.
Allez dans l’onglet SQL.
C’est là que se passera l’intégralité des TPs. Il s’agit d’un champ de saisie dans lequel on peut taper
une commande de recherche, on parle alors de requête, et appuyer sur Exécuter pour voir le résultat.
Sélection simple :
Question 4 Exécutez la requête suivante :
SELECT * FROM bbc WHERE nom = ’France’
1. De Falco™
1
On obtient alors les valeurs de la table bbc ayant pour nom la valeur “France”. Le symbole * signifie
que l’on veut afficher l’intégralité des attributs.
Cliquer sur “Montrer zone SQL” pour re-afficher la zone de saisie, et écrire une requête pour chercher le pays Germany.
Projection :
Question 5 Exécutez la requête suivante :
SELECT nom, population FROM bbc WHERE region = ’Europe’
En déduire la liste des attributs (nom, superficie) pour les pays de la région Africa.
Il est même possible de projeter en effectuant des calculs. On sait que la densité de population
vaut population/superficie :
Question 6 Exécutez la requête suivante :
SELECT nom, population / s u p e r f i c i e FROM bbc
Ici on n’a pas indiqué de condition WHERE. On récupère toutes les valeurs de la table sans condition.
En déduire la liste nom, pib par habitant.
Pour faire des recherches on peut utiliser des opérateurs de comparaison comme < et des opérations logiques comme NOT, OR ou AND.
Question 7 Exécutez la requête suivante :
SELECT nom, region FROM bbc
WHERE population < 2000000 AND pib > 5000000000
En déduire une liste similaire des pays de superficie moins de 2000 km 2 et de pib plus grand que
5000000000 dollars.
Plutôt que d’écrire
SELECT nom, region FROM bbc
WHERE (nom = ’France’ ) OR (nom = ’Ireland’ ) OR (nom = ’Denmark’ )
on peut écrire
SELECT nom, region FROM bbc
WHERE nom IN ( ’France’ , ’Ireland’ , ’Denmark’ )
Question 8 En déduire le nom et la population des pays dont le nom est Germany, Italy, France ou
Monaco.
Question 9 Exécuter la requête :
SELECT nom, region FROM bbc
WHERE nom LIKE ’F%’
L’opérateur LIKE permet de rechercher une chaîne avec de la souplesse. On dispose du symbôle joker
% qui remplace n’importe quelle chaîne. Ainsi la requête précédente cherche les pays dont le nom
commence par F.
Cherchez les pays dont le nom finit par y (attention c’est sensible à la casse).
2
Opérations ensemblistes
Les tables bbc et cia ayant le même schéma on est dans le contexte où l’on peut réaliser des opérations ensemblistes.
Petit problème de SQL : on ne peut réaliser des opérations qu’entre des requêtes SELECT. Il n’est
pas directement possible d’écrire bbc UNION cia il faut utiliser :
SELECT * FROM bbc
UNION
SELECT * FROM c i a
Question 10 On peut utiliser des requêtes SELECT quelconques. En déduire l’union des listes nom,
superficie des pays dont le nom commence par Fr dans ces deux tables.
Par contre, ni l’intersection ni la différence ne sont disponibles dans le moteur de base de données
utilisé (MySQL). Il est possible de les simuler à l’aide de requêtes imbriquées :
Question 11 Exécutez la requête
SELECT nom, region FROM bbc WHERE nom IN (SELECT nom FROM c i a )
En déduire le nombre de pays présents dans la base bbc mais pas dans la base cia.
Présentation du résultat
Question 12 Exécutez la requête
SELECT region FROM bbc
On constate qu’il y a beaucoup de régions dupliquées : une par pays. Pour obtenir les valeurs de manière unique on utilise la variation suivante :
SELECT DISTINCT region FROM bbc
En déduire les régions dans lesquelles il y a au moins un pays dont le pib n’excède pas 1 milliard de
dollars.
Question 13 Exécutez la requête
SELECT nom, s u p e r f i c i e FROM bbc ORDER BY s u p e r f i c i e
puis
SELECT nom, s u p e r f i c i e FROM bbc ORDER BY s u p e r f i c i e DESC
En déduire la liste des pays dans l’ordre décroissant des pib.
On peut utiliser des expressions pour trier :
Question 14 Exécutez la requête
SELECT nom FROM bbc ORDER BY population / s u p e r f i c i e
En déduire la liste des pays dans l’ordre décroissant des pib par habitant.
3
Statistiques sur les albums
On va maintenant travailler sur la table album dont le schéma est :
asin
title
artist
album
rdate
price
label
rank
chaîne
chaîne
chaîne
date
flottant
chaîne
entier
Question 15 Chercher tous les albums de U2.
Pour comparer des dates on utilise toujours les symboles de comparaison mais pour obtenir des
constantes à comparer on utilise des chaînes de format ’yyyy-mm-dd’. Par exemple ’1981-08-05’ est le
5 août 1981.
Question 16 Cherchez tous les albums parus pendant l’année 1991 2 .
Les données sont issues d’amazon (à un instant précis dans le passé), c’est en ce sens qu’il faut
interpréter l’attribut price (c’est le prix en dollars) et l’attribut rank (c’est le rang dans les ventes de
disques).
L’attribut price n’est pas toujours renseigné. Dans ce cas là il prend la valeur spéciale NULL.
Question 17 Chercher tous les albums dont le prix est renseigné.
Question 18 Chercher les pires albums, c’est-à-dire ceux qui sont chers et ont un mauvais rang.
Question 19 Qui a le plus d’albums dans les 10000 meilleures ventes : le label Sony ou le label Atlantic ?
Question 20 Combien d’artistes ont un album dans les 5000 meilleures ventes ?
Albums et chansons
On va va continuer notre travail sur la table album dont le schéma est :
asin
title
artist
album
rdate
price
label
rank
chaîne
chaîne
chaîne
date
flottant
chaîne
entier
mais cette fois-ci on considère aussi la table :
album
chaîne
track
disk
posn
entier
entier
song
chaîne
où l’on a relation entre les pistes des albums (tracks) et les albums : un album contient de multiples
pistes.
L’attribut asin d’un album est un identifiant unique, c’est donc la clé primaire utilisée par les
pistes dans l’attribut album pour faire référence à un album.
2. et constatez que c’était une grande année musicale :)
4
Recherche imbriquée
La requête :
SELECT asin FROM album WHERE a r t i s t = ’U2’
permet d’obtenir tous les asins des albums de U2.
Une piste est dans un album de U2 si son asin est dans le résultat de la requête précédente. On
peut utiliser la requête suivante pour les obtenir :
SELECT * FROM track
WHERE album IN (SELECT asin FROM album WHERE a r t i s t = ’U2’ )
On parle de requête imbriquée ou de sous-requête
Question 21 Cherchez tous les titres de chansons dans les albums parus en 1991.
Jointures
On rappelle la syntaxe privilégiée pour joindre deux tables selon deux attributs.
SELECT * FROM table1 , table2 WHERE a t t r 1 = a t t r 2
Ici on obtient donc :
SELECT * FROM album , track WHERE asin = album
Question 22 En déduire les valeurs song, title, artist des deux tables.
Question 23 Obtenir ces triplets de valeurs pour les chansons commencant par S des artistes dont le
nom commence par B.
Une autre table est liée à album :
style
album
style
chaine
chaîne
qui utilise aussi l’asin pour faire référence à un album.
Question 24 Obtenir les noms d’albums ainsi que leur style.
Question 25 Obtenir les noms d’albums, leurs styles et les noms des chansons. C’est-à-dire que l’on
faire une double jointure.
Attention, il y a deux attributs album un dans track et un dans style. Pour les distinguer on utiilse
style.album et track.album.
5
Agrégation
Pour grouper les chansons dans la table track selon l’album qui les contient on peut utiliser la
requête :
SELECT * FROM track GROUP BY album
On obtient une valeur par album dont les attributs sont pris au hasard 3 dans les valeurs regroupées.
Il est alors possible d’appliquer une fonction. Par exemple MAX permet d’obtenir le maximum
d’un attribut. Ici la piste de numéro maximum sur un album indique le nombre de pistes de l’album :
SELECT album , MAX( posn ) FROM track GROUP BY album
On rappelle les fonctions sur un attribut :
— COUNT qui permet de trouver la taille d’un groupe
— MAX et MIN
— SUM qui fait la somme des valeurs d’un attribut sur un paquet
— AVG qui calcule la moyenne
Pour filtrer sur le résultat d’une de ces fonctions on utilise HAVING. Par exemple, pour les albums
ayant au moins 10 pistes :
SELECT album FROM track GROUP BY album HAVING MAX( posn ) > 10
Question 26 Vérifier que la table track est correcte, c’est-à-dire que le nombre de pistes est bien celui
de la la piste maximum. On se restreindra (par un WHERE) aux disques 1 des albums.
Tout ensemble
On reprend la requête précédente pour avoir le nom de l’album avec son nombre de pistes, ce
dernier étant affiché sous un nom pratique :
SELECT t i t l e , MAX( posn ) as p i s t e s FROM album , track JOIN by album=asin GROUP BY album
Question 27 Trouver les noms des artistes dont un album contient au moins deux disques et dont le
nom de l’artiste commence par S.
Résultat, 4 entrées :
— Smashing Pumpkins
— Supergrass
— Stevie Wonder
— Sarah Vaughan
Question 28 Trouver les titres de chansons commençant par T et présentes dans des albums dont les
artistes ont au moins 7 albums dans la table.
Résultat, 5 entrées :
— Think for Yourself
— Taxman
— Tomorrow Never Knows
— Two of Us
— Think for Yourself
3. pas exactement, mais c’est un détail d’implémentation
6
Films
On va maintenant utiliser la base ipt3. Sélectionnez la à gauche. Elle contient trois relations (ou
tables) :
movie
score
id
title
yr
entier
chaine
entier
id
flottant
votes
director
entier
entier
actor
name
entier
chaine
movieid
casting
actorid
ord
entier
entier
entier
Quelques précisions :
— Les clés id permettent d’identifier uniquement un film (movie) ou un acteur (actor).
— L’attribut director fait référence à un id d’actor qui est également réalisateur de ce film (un pur
réalisateur peut ne pas être un vrai acteur mais être présent dans la table actor quand même).
— L’entier ord indique l’ordre dans lequel sont énumérés les acteurs dans le casting d’un film : du
premier nom de valeur 1 (le plus important) au dernier.
— score est le score des internautes sur le film.
— votes est le nombre de votes
— yr est un entier à quatre chiffres comme 1977.
Question 29 Déterminer les noms des acteurs ayant joué dans des films dont le nom commence par
Star.
Question 30 Déterminer les noms des acteurs ayant tournés dans au moins 5 films tout en étant toujours premier au casting.
Résultat : Arnold Schwarzenegger et Humphrey Bogart.
Question 31 Déterminer les noms des acteurs qui n’ont tourné qu’avec un seul réalisateur.
Question 32 Déterminer les noms des acteurs qui n’ont tourné que dans des films qu’ils ont réalisés.
Résultat : il y’en a 27, dont Terry Gilliam.
Question 33 Déterminer le film qui a le plus d’acteurs au casting.
7