Vous êtes sur la page 1sur 5

Informatique générale - 2eme semestre - Spécialité AGRAL3/MTX3

Correction TP3 : Requêtes SQL

Partie 1 : exercices corrigés (2h)

1. Sélection et projection.

a. Le nom des coureurs

SELECT `nom` FROM coureur

b. Les villes de départ et les villes d’arrivée des étapes

SELECT `ville_depart`,`ville_arrivee` FROM etape

c. Les villes du tour renommées en ‘ville’

( SELECT `ville_depart` AS ville


FROM etape )
UNION
( SELECT `ville_arrivee` AS ville
FROM etape )

d. Les coureurs français, renommés en ‘coureurs_français’

SELECT nom as 'coureurs_français' FROM `coureur` WHERE `code_pays`='FRA'

e. L’étape du 3 juillet 2003

SELECT num FROM etape WHERE `date_etape`='2003-07-03'

f. Les matricules et nom des coureurs dont le nom commence par ‘A’

SELECT `num_dossart`, nom FROM coureur WHERE nom LIKE 'A%'

g. Les noms des coureurs dont le matricule est compris entre 1 et 5.

SELECT nom FROM `coureur` WHERE `num_dossart` BETWEEN 1 AND 5

h. Les temps réalisés et les numéros de dossard pour l’étape 1, ordonnés par
ordre décroissant sur le temps réalisé.

SELECT `num_dossart`,`temps_realise`
FROM `temps`
WHERE `num_etape`=1
ORDER BY `temps_realise` DESC
Informatique générale - 2eme semestre - Spécialité AGRAL3/MTX3

1. Jointures

a. Le directeur de l’équipe du coureur numéro 7

SELECT directeur
FROM coureur, equipe
WHERE coureur.`code_equipe`=equipe.`code`
AND coureur.`num_dossart`=7

b. Le nom des l’équipe, le nom des coureurs et le temps réalisé pour l’étape 1.

SELECT equipe.nom AS 'nom_equipe',


coureur.nom AS 'nom_coureur',
temps.`temps_realise`
FROM temps, coureur, equipe
WHERE coureur.`code_equipe`=equipe.code
AND temps.`num_dossart`=coureur.`num_dossart`
AND temps.`num_etape`=1

c. Le nom des équipes et le nom des coureurs qui ont terminé l’étape 1 en moins
de 1h30.

SELECT equipe.nom AS 'nom_equipe', coureur.nom AS 'nom_coureur'


FROM temps, coureur, equipe
WHERE coureur.`code_equipe`=equipe.code
AND temps.`num_dossart`=coureur.`num_dossart`
AND temps.`num_etape` = 1
AND temps.`temps_realise` < '01:30:00'

2. Fonctions SQL

a. Le nombre de miles de chaque étape (arrondi à l'entier inférieur)

SELECT etape.`num`, floor(kms/1.609344) AS 'miles'


FROM etape

b. La vitesse de chaque coureur pour l’étape numéro 1 (en km/h)

SELECT temps.`num_dossart`,
kms/(time_to_sec(temps.`temps_realise`))*3600 AS 'vitesse'
FROM temps, etape
WHERE temps.`num_etape`=etape.num
AND etape.num=1

c. La vitesse de chaque coureur pour l’étape numéro 1, par ordre croissant de la


vitesse.

SELECT temps.`num_dossart`,
kms/(time_to_sec(temps.`temps_realise`))*3600 AS vitesse
FROM temps, etape
WHERE temps.`num_etape`=etape.num
Informatique générale - 2eme semestre - Spécialité AGRAL3/MTX3

AND etape.num=1
ORDER BY vitesse

d. Les dates des étapes de plus de 200 kilomètres sous la forme


"DD/MM/YYYY"

SELECT `num`, date_format(`date_etape`, '%d/%m/%Y') AS date


FROM etape
WHERE kms >= 200

e. Les villes de départ de cette semaine

SELECT `ville_depart`
FROM etape
WHERE week(curdate()) = week(`date_etape`)

f. Les étapes qui démarrent de la ville d'arrivée du jour d'avant

SELECT e1.`num`
FROM etape e1, etape e2
WHERE e1.`ville_depart` = e2.`ville_arrivee`
AND DATE_SUB(e1.`date_etape`, interval 1 day) = e2.`date_etape`

g. Les temps réalisés de chaque coureur sur les étapes d'aujourd'hui, trié par
numéros d'étape puis par temps réalisés

SELECT etape.`num` as 'num_etape',


coureur.`num_dossart`,
temps.`temps_realise`
FROM etape, coureur, temps
WHERE temps.`num_etape` = etape.`num`
AND temps.`num_dossart` = coureur.`num_dossart`
AND etape.`date_etape` = curdate ()
ORDER BY etape.`num`, temps.`temps_realise`

h. Les couples de coureurs avec leur temps respectif sur l'étape 1, qui ont un
écart de temps de moins de 30s

SELECT c1.`num_dossart`, c2.`num_dossart`,


t1.`temps_realise`, t2.`temps_realise`
FROM coureur c1, coureur c2, temps t1, temps t2
WHERE t1.`num_etape` = 1 AND t2.`num_etape` = 1
AND c1.`num_dossart` > c2.`num_dossart`
AND t1.`num_dossart` = c1.`num_dossart`
AND t2.`num_dossart` = c2.`num_dossart`
AND abs(time_to_sec(t1.`temps_realise`) -
time_to_sec(t2.`temps_realise`)) <= 40
Informatique générale - 2eme semestre - Spécialité AGRAL3/MTX3

Partie 2 : exercice à rendre (1h)

1. Le nom des clients qui ont un âge supérieur à 20,

SELECT `nom` FROM client WHERE `age` >= 20

2. Le nom des clients ayant commandé le produit numéro 3,

SELECT client.`nom`
FROM client, commande
WHERE client.`nclt`=commande.`nclt`
AND commande.`nprod`=3

3. La couleur des produits commandés par monsieur Dupont,

SELECT DISTINCT produit.`couleur`


FROM client, commande, produit
WHERE client.`nclt`=commande.`nclt`
AND commande.`nprod`=produit.`nprod`
AND client.`nom`='Dupond'

4. Le nom des clients ayant commandé au moins un produit,

SELECT DISTINCT client.`nom`


FROM client, commande
WHERE client.`nclt`=commande.`nclt`

5. Le nom des clients ayant commandé au moins deux produits,

SELECT DISTINCT client.`nom`


FROM client, commande AS c1, commande AS c2
WHERE client.`nclt`=c1.`nclt`
AND client.`nclt`=c2.`nclt`
AND c1.`nprod`<>c2.`nprod`

6. Le nom des clients ayant commandé un produit vert ou un produit bleu,

SELECT DISTINCT client.`nom`


FROM client, commande, produit
WHERE client.`nclt`=commande.`nclt`
AND commande.`nprod`=produit.`nprod`
AND (produit.`couleur` IN ('vert', 'bleu'))

on peut aussi le faire avec une union ou un OR.


Informatique générale - 2eme semestre - Spécialité AGRAL3/MTX3

7. Le nom des clients ayant commandé un produit vert et un produit bleu,

SELECT DISTINCT client.`nom`


FROM client, commande AS c1, commande AS c2,
produit AS p1, produit AS p2
WHERE client.`nclt`=c1.`nclt`
AND client.`nclt`=c2.`nclt`
AND c1.`nprod`=p1.`nprod`
AND c2.`nprod`=p2.`nprod`
AND p1.`couleur`='vert'
AND p2.`couleur`='bleu'

8. Les numéros des produits commandés depuis le 1er juin 2008,

SELECT DISTINCT produit.nprod


FROM produit, commande
WHERE commande.`nprod`=produit.`nprod`
AND to_days(date_cmd)>=to_days('2008-6-01')

9. Les dates des commandes au format "MM, DD YYYY" de chaque produit avec une
chaine qui contient le nom, l'age en mois (arrondi au plus proche) et l'adresse du client,

SELECT date_format(`date_cmd`, '%m, %d %y') AS 'date',


concat(`nom`, ' ', round(age * 12), ' ', adresse) AS 'client'
FROM commande, client
WHERE commande.`nclt`=client.`nclt`

10. Les produits ayant été commandés la veille d'une commande passée par un client dont le
nom commence par 'du'.

SELECT c1.`nclt`
FROM commande c1, commande c2, client
WHERE c2.`nclt` = client.`nclt`
AND lower(client.nom) LIKE 'du%'
AND DATE_ADD(c1.`date_cmd`, interval 1 day) = c2.`date_cmd`