Documente Academic
Documente Profesional
Documente Cultură
TP4 : correction
Le but de ce TP est d’écrire des requêtes SQL d’interrogation, de type SELECT FROM
WHERE en utilisant des constructions plus compliquées tel group by, having, et les
requêtes imbriquées.
Téléchargement :
Nous utiliserons la même base que pour le TP3 aussi vous n'avez pas à faire d'importation dans
phpMyAdmin. Si vous avez supprimé les tables à la fin du TP3, suivez à nouveau la procédure
d'importation. Sinon, vous pouvez l'ignorer. Téléchargez le fichier
http://webia.lip6.fr/~lepape/ens/infogen2/tourdefrance_mysql.sql Créer un nouveau fichier
texte tp4_partie1_nom1_nom2.sql, où nom1 et nom2 sont les logins du binôme.
Ouvrez-le avec un éditeur de texte.
Connexion :
Connectez-vous à l’interface phpMyAdmin en tapant l’url suivante dans un navigateur :
https://pc69.polytech.upmc.fr/phpMyAdmin/
Votre login est le même que sous linux et votre mot de passe, c’est votre login.
Importation :
Nous allons importer dans phpMyAdmin une bases de données à partir du fichier sql téléchargé.
A partir de phpMyAdmin, cliquez sur votre unique base dans le menu de gauche puis dans le
menu de droite, cliquez sur l’onglet « Importer ». Dans l’encart « Fichier à importer », cliquer sur
« Parcourir » et sélectionner le fichier tourdefrance.sql. Cliquez sur « Exécuter ».
• EQUIPE(code,nom,directeur)
• PAYS(code,nom)
• COUREUR(num-dossart,code-equipe*,nom,code-pays*)
• ETAPE(num,date,kms,ville-depart,ville-arrivee)
• TEMPS(num-dossart*,num-etape*,temps-realise)
Remarque : la table TEMPS ne stocke que les temps des joueurs qui ont participé à l’étape. Si un
coureur déclare forfait pour une étape, son temps n’apparait pas.
Vérifier que l’importation s’est bien déroulée en visualisant la base de données puis le contenu de
chaque table.
Les requêtes qui portent sur plusieurs tables doivent être éditées à partir du menu de la
base elle-même.
Sélectionnez la base dans le menu de gauche et cliquez dans l’onglet « SQL » dans les
onglet en haut.
1
Informatique générale - 2eme semestre - Spécialité AGRAL3/MTX3
b. Récupérez le code et le nom des pays ayant plus d'un coureur, classé par ordre
alphabétique croissant des noms de pays
c. Récupérez le nom des coureurs dont le temps total (somme du temps mis pour
chaque étape) est inférieur à 3h30, classé par temps total croissant
2. Requêtes imbriquées
a. Récupérez le nom des joueurs qui n'ont pas couru l'étape 2 ? Que signifie la
réponse ?
SELECT c.nom
FROM coureur c
WHERE c.num_dossart NOT IN (SELECT t.num_dossart
FROM temps t
WHERE t.num_etape = 2)
2
Informatique générale - 2eme semestre - Spécialité AGRAL3/MTX3
b. Récupérez le nom des coureurs dont la première lettre de leur nom est
identique à celle d'un autre joueur (exemple : REICHL et ROUS) en utilisant
EXISTS
SELECT c.nom
FROM coureur c
WHERE EXISTS (SELECT d.nom
FROM coureur d
WHERE SUBSTRING(c.nom, 1, 1) = SUBSTRING(d.nom, 1, 1)
AND c.num_dossart <> d.num_dossart)
ORDER BY c.nom
d. Récupérez les coureurs qui n'ont pas gagné (autrement dit tous les coureurs
sauf le premier) pour chaque étape ?
e. Récupérez le 2ème meilleur temps pour l'étape 1 en utilisant le fait qu'il n'y a
aucun ex aequo (les temps sont tous uniques)
3. Question bonus
Quel est l'intérêt d'utiliser une base de données ?
3
Informatique générale - 2eme semestre - Spécialité AGRAL3/MTX3
Note : Imaginez devoir répondre aux mêmes questions en utilisant des tableaux dans
votre tableur préféré
Importation :
Téléchargez les fichiers
http://webia.lip6.fr/~lepape/ens/infogen2/geographie_mysql1.sql.bz2
http://webia.lip6.fr/~lepape/ens/infogen2/geographie_mysql2.sql.bz2 et
http://webia.lip6.fr/~lepape/ens/infogen2/geographie_mysql3.sql.bz2 et importez les dans
l'ordre en suivant la procédure donnée dans la première partie. Le schéma de la base que
vous venez d’importer est :
où :
¾ num_com est une clé étrangère qui référence id_insee dans la table communes
¾ prefecture est une clé étrangère qui référence id_insee dans la table communes
¾ region est une clé étrangère qui référence id_region dans la table regions
Vous placerez vos requêtes SQL dans le fichier texte suivant tp4partie2_nom1_nom2.sql,
où nom1 et nom2 sont les logins du binôme.
2. Le nombre de département par canton, pour les régions ayant une densité de
population supérieure à 300, ordonné par le nom des régions
SELECT count( * ) AS 'nb_departement', r.nom_reg
FROM departements d, regions r
WHERE d.region = r.id_region
AND r.`nb-hab_reg` / r.superficie_reg >50
GROUP BY d.region
ORDER BY r.nom_reg
4
Informatique générale - 2eme semestre - Spécialité AGRAL3/MTX3
3. Les départements dont la densité de population est plus grande que celle de leur
région (en utilisant IN)
SELECT d1.nom_dep
FROM departements d1
WHERE d1.id_dep IN (SELECT d2.id_dep
FROM departements d2, regions r
WHERE d1.region = r.id_region
AND d2.region = r.id_region
AND d2.`nb-hab_dep` / d2.superficie_dep > r.`nb-hab_reg` / r.superficie_reg)
4. Les communes ayant une population plus importante qu'un département (en
utilisant ANY)
SELECT c.nom_com
FROM communes c
WHERE c.nb-hab_com >= ANY (SELECT d.nb-hab_dep
FROM departements d)
5. Les cantons dont le nom est également le nom du département (en utilisant
EXISTS)
SELECT c.nom_can
FROM cantons c
WHERE EXISTS (SELECT ca.nom_dep
FROM departements d
WHERE d.nom_dep = ca.nom_can)
SELECT d.nom_dep
FROM departements d
WHERE d.nb-hab_dep / d.superficie_dep <= ALL
(SELECT dep.nb-hab_dep / dep.superficie_dep
FROM departements dep)
7. Les tables utilisées dans la 2e partie de ce TP sont volumineuses. Vous devez les
supprimer. Pour cela, commencez par supprimer les clés étrangères (lien gestion
des relations sur l'onglet structure de la table dont vous voulez supprimer les clés),
et ensuite les tables.