Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 25/01/2011, 19h01   #1
Invité de passage
 
Inscription : janvier 2011
Messages : 13
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 13
Points : 0
Points : 0
Par défaut besoin d'aide pour un exercice (requêtes sql)

Bonjour tout le monde.
J'aurais besoin de votre aide SVP.
J'ai un exercice a faire, et je voudrais que vous dites si j'ai bien commencé?
Merci d'avance


L'énonces de l'exercice


Les questions

1 -
Code :
1
2
3
 SELECT nom, prenom, (datedeNaissance???)
FROM PILOTE
ORDER BY datedeNaissance DESC;
2 -
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
   SELECT COUNT (p.positionArr) AS « Nombre de course gagné », n.nom, n.prenom
   FROM CLASSEMENT AS p JOIN PILOTE AS n
   ON (p.idPilote = n.idPilote)
   WHERE PositionArr = 1
   AND nom = 'ALESI'
   AND prenom = 'JEAN';
 
OU
 
SELECT COUNT (p.positionArr) AS «*Nombre de course gagné*»
FROM CLASSEMENT AS p JOIN PILOTE AS n
ON (p.idPilote = n.idPilote)
WHERE PositionArr = 1
AND nom = 'ALESI'
AND prenom = 'JEAN';
3 -
Code :
1
2
3
4
5
6
  SELECT p.positionArr, n.nomPays
   FROM CLASSEMENT AS p JOIN PAYS AS n
   ON (p.idPilote = n.idPilote)
   WHERE nomPays = 'Suisse'
   AND nomPays = 1
   ORDER BY positionArr ASC;
stabii est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/01/2011, 20h47   #2
Membre Expert
 
Homme
Responsable de service informatique
Inscription : janvier 2009
Messages : 1 081
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 38
Localisation : France

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Boutique - Magasin

Informations forums :
Inscription : janvier 2009
Messages : 1 081
Points : 1 875
Points : 1 875
Bonsoir,
Pour la 1, inutile de renvoyer la date de naissance.
Pour la 2, la première version fonctionne, mais un count(*) suffira.
Pour la 3, tu renvoies un classement alors que l'énoncé demande la meilleure place. Il faudrait plutôt employer min() pour renvoyer la plus petite place. J'enlèverai aussi le nom du pays, puisque la requête ne concerne que la Suisse (et surtout nompays=1, qui risque de ne pas passer...).

3,4,5: je te laisse chercher

Tatayo.
tatayo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/01/2011, 21h27   #3
Invité de passage
 
Inscription : janvier 2011
Messages : 13
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 13
Points : 0
Points : 0
Merci pour ta réponse...

Donc pour la 2 c'est:

Code :
1
2
3
4
5
6
SELECT COUNT (*) AS " Nombre de course gagné ", n.nom, n.prenom
   FROM CLASSEMENT AS p JOIN PILOTE AS n
   ON (p.idPilote = n.idPilote)
   WHERE PositionArr = 1
   AND nom = 'ALESI'
   AND prenom = 'JEAN';
Pour la 3 je ne vois que cet solution
Code :
1
2
3
4
5
SELECT MIN(p.positionArr) AS "Meilleur résultat au palmarès", n.nomPays
   FROM CLASSEMENT AS p JOIN PAYS AS n
   ON (p.idPilote = n.idPilote)
   WHERE nomPays = 'Suisse'
   ORDER BY positionArr ASC;

Pour la 4 désolé je ne voit pas du tout comment faire


Pour la 5, je ne sais pas comment faire la jointure avec 3 tables (table1 JOIN table2 JOIN table3 ????)

5 -
Code :
1
2
3
4
SELECT n.nomEcurie, a.annee, p.nom, p.prenom
FROM ECURIE AS n, ENGAGER AS a, PILOTE AS p
ON
WHERE annee = 2010;
Pour la 6, j'ai beaucoup d'erreurs

6 -
Code :
1
2
3
4
SELECT c.PositionArr, p.nom, p.prenom, d.dateCourse
FROM CLASSEMENT AS c JOIN PILOTE AS p JOIN COURSE AS d
ON (c.idPilote = p.idPilote)
ORDER BY c.PositionArr, d.dateCourse ASC;
Désolé je suis un débutant et qui a loupé beaucoup de cours
stabii est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2011, 07h24   #4
Membre Expert
 
Homme
Responsable de service informatique
Inscription : janvier 2009
Messages : 1 081
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 38
Localisation : France

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Boutique - Magasin

Informations forums :
Inscription : janvier 2009
Messages : 1 081
Points : 1 875
Points : 1 875
La syntaxe pour plusieurs jointures est:
Code SQL :
1
2
3
4
5
6
 
SELECT lescolonnes
FROM table1
INNER JOIN table2 ON condition
INNER JOIN table3 ON condition
WHERE...

Il y a des tutoriels très bien fait ici, tu devrais y jeter un oeil.

Pour la 3, comme je te l'ai indiqué, il faut enlever le nom du pays.

Allez, une piste(!) pour la 4: il faut compter le nombre de pays différents des vainqueurs de grand prix.

Et pour la 6: l'énoncé ne demande que la dernière course, ici tu renvoies toutes les courses...

Tatayo.
tatayo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2011, 18h28   #5
Invité de passage
 
Inscription : janvier 2011
Messages : 13
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 13
Points : 0
Points : 0
Merci, je vais regarder les tutoriels...

Oui pour la 3 tu m'avait dit d'enlever le nom du pays mais dans la question ils veulent le meilleur palmarès d'un pilote SUISSE. Et je vois pas pourquoi il faut mettre un MIN()

Code :
1
2
3
SELECT MIN(positionArr) AS "Meilleur résultat au palmarès"
   FROM CLASSEMENT
   ORDER BY positionArr ASC;

4 -
Code :
1
2
3
4
SELECT MAX(p.possitionArr) AS "Nombre d'hymnes", n.nomPays
FROM CLASSEMENT AS P INNER JOIN PAYS AS N
ON p.idPilote = n.idPays
ORDER BY p.position, n.nomPays ASC;

5 -
Code :
1
2
3
4
5
SELECT n.nomEcurie, a.annee, p.nom, p.prenom
FROM ECURIE AS n
INNERT JOIN ENGAGER AS a ON n.idEcurie = a.idEcurie
INNER JOIN PILOTE AS p ON n.idEcurie = p.idPilote
WHERE annee = 2010;

Peut être aussi une petite piste pour la 6 ??
stabii est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2011, 07h30   #6
Membre Expert
 
Homme
Responsable de service informatique
Inscription : janvier 2009
Messages : 1 081
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 38
Localisation : France

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Boutique - Magasin

Informations forums :
Inscription : janvier 2009
Messages : 1 081
Points : 1 875
Points : 1 875
Citation:
Envoyé par stabii Voir le message
Oui pour la 3 tu m'avait dit d'enlever le nom du pays mais dans la question ils veulent le meilleur palmarès d'un pilote SUISSE. Et je vois pas pourquoi il faut mettre un MIN()

Code :
1
2
3
SELECT MIN(positionArr) AS "Meilleur résultat au palmarès"
   FROM CLASSEMENT
   ORDER BY positionArr ASC;
Peut être aussi une petite piste pour la 6 ??
EN fait je disais d'enlever le code pays de la clause SELECT, pas du where !! Vu que l'énoncé demande un pilote suisse, inutile de renvoyer le fait qu'il est suisse... Et pourquoi un min ? L'énoncé demande la meilleure place d'un pilote suisse, donc le plus petit numéro d'arrivé.
Citation:
Envoyé par stabii Voir le message
Peut être aussi une petite piste pour la 6 ??
Le classement de la dernière course, en commençant pas le vainqueur:
Pour avoir la (date de la) dernière course:
Code SQL :
1
2
 
SELECT max(datecourse) FROM course
Pour avoir le classement de la course, en commençant par le premier:
Code SQL :
1
2
3
4
5
 
SELECT pilote.idpilote,pilote.nom,pilote.prenom,positionarr
FROM classement
INNER JOIN pilote ON pilote.idpilote = classement.idpilote
ORDER BY positionarr DESC
Je te laisse mixer les deux pour trouver le classement de la dernière course

Tatayo.
tatayo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2011, 18h07   #7
Invité de passage
 
Inscription : janvier 2011
Messages : 13
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 13
Points : 0
Points : 0
Code :
1
2
3
4
SELECT MIN(p.positionArr) AS "Meilleur résultat au palmarès"
   FROM CLASSEMENT
   WHERE nomPays = 'Suisse'
   ORDER BY positionArr ASC;
Oui mais si je l'enlève du SELECT, comment je peux le trouver sans faire de jointure ?? Mmmm désolé je suis nul

Tu veux dire que pour la 4 et la 5 j'ai bon ??? c'est pas possible


Pour la 6:
Code :
1
2
3
4
5
SELECT MAX(dateCourse) AS "Dernière course" pilote.idpilote, pilote.nom, pilote.prenom, positionArr
FROM CLASSEMENT
INNER JOIN PILOTE ON PILOTE.idPilote = CLASSEMENT.idPilote
INNER JOIN COURSE ON COURSE.datecourse = PILOTE.idPilote
ORDER BY positionArr DESC
stabii est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2011, 20h40   #8
Membre Expert
 
Homme
Responsable de service informatique
Inscription : janvier 2009
Messages : 1 081
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 38
Localisation : France

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Boutique - Magasin

Informations forums :
Inscription : janvier 2009
Messages : 1 081
Points : 1 875
Points : 1 875
Citation:
Envoyé par stabii Voir le message
Code :
1
2
3
4
SELECT MIN(p.positionArr) AS "Meilleur résultat au palmarès"
   FROM CLASSEMENT
   WHERE nomPays = 'Suisse'
   ORDER BY positionArr ASC;
Oui mais si je l'enlève du SELECT, comment je peux le trouver sans faire de jointure ?? Mmmm désolé je suis nul
Tu peux faire une rselection sur une colonne qui n'est pas renvoyée par la requête, ça fonctionne quand même (heureusement d'ailleurs !).
Citation:
Envoyé par stabii Voir le message
[
Tu veux dire que pour la 4 et la 5 j'ai bon ??? c'est pas possible
Bha si, c'est possible ! Mais ici, ce n'est pas le cas.
Pour la 5, l'énoncé demande le nombre d'hymne nationaux joués (donc le nombre de nations des gagnants), et tu renvoies les plus mauvais classements...
Pour la 4, j'aurai viré l'année DU SELECT, qui n'est pas demandée dans le résultat.
Citation:
Envoyé par stabii Voir le message
[
Pour la 6:
Code :
1
2
3
4
5
SELECT MAX(dateCourse) AS "Dernière course" pilote.idpilote, pilote.nom, pilote.prenom, positionArr
FROM CLASSEMENT
INNER JOIN PILOTE ON PILOTE.idPilote = CLASSEMENT.idPilote
INNER JOIN COURSE ON COURSE.datecourse = PILOTE.idPilote
ORDER BY positionArr DESC
Cette requête ne peut pas fonctionner: avec une fonction d'aggrégation (max, min,avg...), il faut un group-by sur toutes les autres colonnes. Là il te faut utiliser une sous-requête qui te renvoie la date de la dernière course. Sinon tu vas renvoyer la dernière course de chaque pilote, et chaque classement du pilote. Or la question demande le classement de la dernière course.

Tatayo.
tatayo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2011, 22h16   #9
Invité de passage
 
Inscription : janvier 2011
Messages : 13
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 13
Points : 0
Points : 0
Donc la 3 est bonne ?

Tu te trompe, c'est pour la 5 qu'il faut enlever ANNEE du select car dans la 4 il n'y pas...
Dans la 4, il faut utiliser un MIN() ?

Pour la 6
Code :
1
2
3
4
5
SELECT MAX(dateCourse) AS "Dernière course" pilote.idpilote, pilote.nom, pilote.prenom, positionArr
FROM CLASSEMENT
INNER JOIN PILOTE ON PILOTE.idPilote = CLASSEMENT.idPilote
INNER JOIN COURSE ON COURSE.datecourse = PILOTE.idPilote
GROUP BY pilote.idpilote, pilote.nom, pilote.prenom, dateCourse, positionArr;
stabii est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2011, 07h24   #10
Membre Expert
 
Homme
Responsable de service informatique
Inscription : janvier 2009
Messages : 1 081
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 38
Localisation : France

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Boutique - Magasin

Informations forums :
Inscription : janvier 2009
Messages : 1 081
Points : 1 875
Points : 1 875
Citation:
Envoyé par stabii Voir le message
Donc la 3 est bonne ?
Je dirai que oui.
Citation:
Envoyé par stabii Voir le message
Tu te trompe, c'est pour la 5 qu'il faut enlever ANNEE du select car dans la 4 il n'y pas...
Oups, il faut que me relise un peu plus souvent

Citation:
Envoyé par stabii Voir le message
Dans la 4, il faut utiliser un MIN() ?
Heu... non. Il faut compter le nombre distinct de nationalité de pilote ayant fini premier.
Citation:
Envoyé par stabii Voir le message
Pour la 6
Code :
1
2
3
4
5
SELECT MAX(dateCourse) AS "Dernière course" pilote.idpilote, pilote.nom, pilote.prenom, positionArr
FROM CLASSEMENT
INNER JOIN PILOTE ON PILOTE.idPilote = CLASSEMENT.idPilote
INNER JOIN COURSE ON COURSE.datecourse = PILOTE.idPilote
GROUP BY pilote.idpilote, pilote.nom, pilote.prenom, dateCourse, positionArr;
Non, là tu renvoie la dernière course pour chaque classement de chaque pilote.
Il te faut renvoyer le nom, le prenom, l'écurie de chaque pilote pour la course dont la date est celle de la dernière course.
tatayo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2011, 16h16   #11
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 990
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 990
Points : 18 241
Points : 18 241
Envoyer un message via MSN à CinePhil
Il me semblait bien avoir déjà vu cet exercice...

Tu y trouveras au moins ce qu'il ne faut pas faire !
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2011, 18h54   #12
Invité de passage
 
Inscription : janvier 2011
Messages : 13
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 13
Points : 0
Points : 0
4 -
Code :
1
2
3
4
5
SELECT DISTINC(idPays?) AS "Nombre pays"
FROM CLASSEMENT
INNER JOIN PAYS ON idPilote = idPays
INNER JOIN PILOTE ON idPilote = idPilote
WHERE possitionArr = '1';


6 -
Code :
1
2
3
4
5
SELECT MAX(dateCourse) AS "Dernière course" pilote.idpilote, pilote.nom, pilote.prenom, positionArr
FROM CLASSEMENT
INNER JOIN PILOTE ON PILOTE.idPilote = CLASSEMENT.idPilote
INNER JOIN COURSE ON COURSE.datecourse = PILOTE.idPilote
GROUP BY pilote.idpilote, pilote.nom, pilote.prenom;
stabii est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2011, 14h50   #13
Membre Expert
 
Homme
Responsable de service informatique
Inscription : janvier 2009
Messages : 1 081
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 38
Localisation : France

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Boutique - Magasin

Informations forums :
Inscription : janvier 2009
Messages : 1 081
Points : 1 875
Points : 1 875
Je pense qu'il faut que tu y mettes un peu du tien. Pour la 4, on te demande de compter quelquechose ("COMBIEN d'hymnes nationaux...), et rien dans ta requête ne permet de compter quoi que ce soit. Qui plus est, tu fais une jointure entre l'Id du pays et l'id du pilote...

Pour la 6, la réponse ne change pas. Tu ne renvoies pas les résultats de la dernièe course, mais la dernière date de chaque classement de chaque pilote...

Bref je pense que tu devrais te replonger dans ton cours de SQL ainsi que dans les tutoriels présents sur ce site.

Tatayo.
tatayo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2011, 15h42   #14
Invité de passage
 
Inscription : janvier 2011
Messages : 13
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 13
Points : 0
Points : 0
Même en lisant les tuto, tout seul sans aide c'est pas possible pour un débutant...

4-
Code :
1
2
3
4
5
SELECT COUNT(possitionArr), DISTINC(nomPays) AS "Nombre pays"
FROM CLASSEMENT
INNER JOIN PAYS ON idPilote = idPilote
INNER JOIN PILOTE ON idPilote = idPilote
WHERE possitionArr = '1';
6-
Code :
1
2
3
4
5
SELECT MAX(dateCourse) AS "Dernière course" pilote.idpilote, pilote.nom, pilote.prenom, positionArr
FROM CLASSEMENT
INNER JOIN PILOTE ON PILOTE.idPilote = CLASSEMENT.idPilote
INNER JOIN COURSE ON COURSE.datecourse = PILOTE.idPilote
GROUP BY dateCourse;
stabii est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2011, 17h24   #15
Membre Expert
 
Homme
Responsable de service informatique
Inscription : janvier 2009
Messages : 1 081
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 38
Localisation : France

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Boutique - Magasin

Informations forums :
Inscription : janvier 2009
Messages : 1 081
Points : 1 875
Points : 1 875
Pour la 4: Tu comptes les arrivés par pays (d'ailleurs il manque un group by) au lieu de compter les pays... Une dernière piste: tu dois compter le nombre distinct de pays dont un pilote est arrivé premier.
Pour la 6: toujours pas, tu renvoie toujours la dernière date par pilote, et non le classement de la dernière course. D'ailleurs la requête n'est pas syntaxiquement correcte car le group by doit porter sur les colonnes qui NE SONT PAS l'objet d'une aggregation (count,max...).
Une dernière piste aussi: tu dois renvoyer le nom, le prenom des pilotes ayant participé à la course dont la date est celle de la dernière course, le tout trié par position d'arrivée.

Pour y arriver, il te faut "traduire" l'énoncé:
Qu'est-ce que je dois renvoyer: la clause SELECT
D'où je tire les infos: la clause FROM
Sur quels critères: la clause WHERE
Sur quoi je regroupe: la clause GROUP BY
Sur quoi je trie: la clause ORDER BY

Tatayo.
tatayo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2011, 00h00   #16
Invité de passage
 
Inscription : janvier 2011
Messages : 13
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 13
Points : 0
Points : 0
Code :
1
2
3
4
5
6
SELECT COUNT(idPays) AS "Nombre de pays", DISTINC(idPilote)
FROM CLASSEMENT
INNER JOIN PAYS ON idPilote = idPilote
INNER JOIN PILOTE ON idPilote = idPilote
WHERE positionArr = '1'
GROUP BY positionArr;
Pour la 6-
Code :
1
2
3
4
5
SELECT MAX(dateCourse) AS "Dernière course" pilote.idpilote, pilote.nom, pilote.prenom, positionArr
FROM CLASSEMENT
INNER JOIN PILOTE ON PILOTE.idPilote = CLASSEMENT.idPilote
INNER JOIN COURSE ON COURSE.datecourse = PILOTE.idPilote
GROUP BY positionArr;
stabii est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h12.


 
 
 
 
Partenaires

Hébergement Web