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