(SQL] AIde pour requète

(SQL] AIde pour requète - SQL/NoSQL - Programmation

Marsh Posté le 16-11-2014 à 20:30:07    

Bonjour, je suis étudiant en informatique. J'ai un problème pour un exercice de BDD.  
Je vous présente rapidement le propos, je possède:
Une table étudiants contenant le numéro,le nom et prénom de l'étudiant
Une table avoir_note contenant le numéro étudiant,les numéros d'épreuves et les note en fonction du numéro d'étudiant et du numéro d'épreuve.

 
La question est d'afficher le nom des étudiants qui ont ) l'épreuve 4 une note supérieur à celle obtenue par Dupont Luc à l'épreuve 4.
 
J'ai réalisé la requète suivante:
 
select E.nometu,E.prenometu, A.note from etudiants as E, avoir_note as A where (note>(select A.note from etudiants as E, avoir_note as A where (E.nometu='dupont') and (E.prenometu='luc') and (E.numetu=A.numetu) and (numepr=4)));
 
seulement elle n'affiche pas les résultats corrects. J'obtiens le résultat affiché en dessous alors que la réponse devrait contenir 4 ligne seulement. J'ai du mal écrire la requète. Pourriez-vous m'aider svp?  
 
Merci
 
nometu | prenometu | note
-------------+-----------+------
roblin | lea | 15
macarthur | leon | 15
minol | luc | 15
bagnole | sophie | 15
bury | marc | 15
vendraux | marc | 15
vendermaele | helene | 15
besson | loic | 15
godart | jean-paul | 15
beaux | marie | 15
turini | elsa | 15
torelle | elise | 15
pharis | pierre | 15
ephyre | luc | 15
leclercq | jules | 15
dupont | luc | 15
marke | loic | 15
dewa | leon | 15
roblin | lea | 11
macarthur | leon | 11
minol | luc | 11
bagnole | sophie | 11
SUITE

Reply

Marsh Posté le 16-11-2014 à 20:30:07   

Reply

Marsh Posté le 17-11-2014 à 00:39:50    

Il faudrait étaler la requête sur plusieurs lignes, avec des indentations. Ca ne pose pas de problème pour le résultat, mais ça en pose pour la lecture du programme par un collègue.
 
Il y a trop de parenthèses. Ca ne pose pas de problème pour le résultat, mais ça en pose pour la lecture du programme par un collègue.
 
Donc, après reformatage, on obtient ceci qui est beaucoup plus lisible :
 

select
    E.nometu,
    E.prenometu,
    A.note
from
    etudiants as E,
    avoir_note as A
where
    note >
         (select
              A.note
          from
              etudiants as E,
              avoir_note as A
          where
              E.nometu = 'dupont'
          and E.prenometu = 'luc'
          and E.numetu = A.numetu
          and numepr = 4
         );  

 
Ce n'est pas terrible d'utiliser les mêmes alias (A et E) dans la sous-requêtes et dans la requête. Il y a un risque de confusion.
 
Il manque une jointure entre A et E dans le select principal. Il y en a une qui est faite, mais uniquement dans le sous-select.
 
Il manque le test sur l'état nul d'une colonne, mais je ne sais pas si une colonne pourrait avoir un état nul.
 

Reply

Marsh Posté le 17-11-2014 à 01:17:38    

Okmerci, je tacherai de mieux présenter la requête.  
 
Alors j'ai modifier la requête en mettant des alias différent mais ça ne change rien malheureusement. J'ai aussi rajouté la jointure dans le select principalj 'obtiens le résultat suivant (qui n'est pas encore correct, il faut 4 lignes en réponse)
 
Je n'ai pas bien comprisde quoi tu parles avec l'état nul d'une colonne...
 
 
Merci pour la réponse, j'ai testé la commande malheuresement la réponse donne ceci, ce qui n'est toujours pas les 4 lignes recherchées^^
Par curiosité comment utiliserais tu les join, j'ai vu ça en cours mais je ne saisis pas bien comment l'utiliser. Sinon grâce à ta commande la réponse semble tout de même se préciser, mais j'avoue être perdu, j'ai du mal à réfléchir à d'autres possibilitées.
   nometu    | prenometu | note
-------------+-----------+------
 roblin      | lea       |   15
 bagnole     | sophie    |   11
 bury        | marc      |   15
 vendraux    | marc      |   16
 dewa        | leon      |   11
 roblin      | lea       |   12
 macarthur   | leon      |   12
 bagnole     | sophie    |   15
 vendraux    | marc      |   11
 vendermaele | helene    |   13
 marke       | loic      |   19
 godart      | jean-paul |   14
 beaux       | marie     |   14
 turini      | elsa      |   11
 ephyre      | luc       |   20
 leclercq    | jules     |   12
 dupont      | luc       |   11
 godart      | jean-paul |   11
 beaux       | marie     |   12
 torelle     | elise     |   20
 pharis      | pierre    |   12
(21 lignes)


Message édité par seyrinian le 17-11-2014 à 01:18:02
Reply

Marsh Posté le 17-11-2014 à 02:20:37    

En relisant l'énoncé, je remarque la condition "étudiants qui ont ) l'épreuve 4", avec la parenthèse qui est probablement un "à". Or cette condition est exprimée dans le cas du sous-sélect, pour Luc Dupont, mais pas pour les autres étudiants.
 
Ensuite, dans les résultats je vois deux fois "roblin" par exemple, ce qui semble bizarre. En relisant la question, je m'aperçois qu'il est demandé une liste de noms et c'est tout. On ne demande pas les notes qu'ont ces étudiants. Par exemple, Roblin a eu une fois 15 et une fois 12, mais les notes ne sont pas demandées.
 
L'état nul, que l'on appelle aussi "valeur nulle" est un concept que vous n'avez peut-être pas encore étudié. En théorie, si la base de données est bien conçue (selon les règles de normalisation de Codd que je cite parce qu'elles sont très intéressantes et importantes, mais que votre professeur ne connait peut-être pas), alors les champs sont toujours remplis avec des données. Mais en pratique, il arrive assez souvent qu'un champ ne soit pas rempli, parce qu'il est considéré comme facultatif. Si Bury ne participe pas à l'épreuve 4, il n'aura pas de note. Donc, il faudrait prévoir ce cas, et donc faire un test pour ne sélectionner que les notes non nulles, tant pour les étudiants, que pour Dupont, qui lui aussi peut avoir manqué l'épreuve 4.
 
Je laisse d'autres personnes répondre pour la syntaxe avec join parce que je ne suis pas un spécialiste de ça.


Message édité par olivthill le 17-11-2014 à 02:21:51
Reply

Marsh Posté le 17-11-2014 à 22:15:22    

seyrinian :  
dans les requetes proposées tu ne fais pas de sélection sur l'épreuve 4
tu remontes les enregistrements des étudiants qui ont une note supérieure à celle de dupont à l'épreuve 4 mais pas pour l'épreuve 4  uniquement...
 
il te reste à ajouter dans ta clause where cette condition...
ou un truc comme ça :
select  
    a.nometu,  
    a.prenometu,  
    b.note  
from etudiants as a
inner join  avoir_note as b  
on
a.id_étudiant = b.id_etudiant
 
where  
b.numepr  = 4 and   and
b.note >  
         (select  
              y.note  
          from  
              from etudiants as x
inner join  avoir_note as y  
on
x.id_étudiant = y.id_etudiant          
where  
              x.nometu = 'Dupont'  
          and x.prenometu = 'Luc'  
          and y.numepr = 4  
         );  
Attention des deux champs nom et prénom sont keysensif ... la requête de olivthill remonte rien :)
 
Qu'est ce qui se passe si ton Dupont a plusieurs notes dans ta matiere 4? il faut alors passer par un min ou un max et tu mets un groupe by à la fin de ta sous requête...


Message édité par gpl73 le 17-11-2014 à 22:20:15

---------------
mieux vaut être un con au chaud, qu'un con gelé lol
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed