interrogazione postgres Clicca QUI per vedere il messaggio nel forum |
kyuss |
A proposito di un'interrogazione riportata negli esercizi di laboratorio del Valtolina sulla base di dati in allegato:
2. la media dei voti registrati presso il corso di laurea di informatica;
Che differenza c'è fra queste due interrogazioni?
SELECT AVG(voto) FROM esami JOIN corsi ON corso=corsi.id JOIN corsidilaurea ON corsodilaurea=corsidilaurea.id WHERE corsidilaurea.denominazione='Informatica'
oppure
SELECT AVG(voto) FROM esami JOIN studenti ON matricola=studente JOIN corsidilaurea ON corsodilaurea=id WHERE denominazione='Informatica'
Secondo me dovrebbero portare entrambe allo stesso risultato, ma non è così.
Grazie. |
altin |
devi partire dal codice a creare la schema relazionale,e da li devi penso che devi guardare le cardinalita delle entita e delle associazioni.
a me come entita mi sono uscite Professore,Studenti,Corsi,CorsiDiLaurea e Esami(qui avevo un dubbio ma visto che pure data fa parte della chiave primaria e le altre due li prendi matricola-->da Studenti e Id-->Corso per questo pure esame è entita.
a me l'unica associazione mi esce PianoDiStudio con cardinalita (n,n).ritornando alla tua domanda.
allora io ho fatto cosi::
ho Studenti(0,n)--FA--(0,1)Esame
cioè un studente può fare un esame ma ne puo fare n di esami. e l'esame di quella data puo essere o no svolto dallo studente.
Esami(0,1)--fa parte--(1,n)Corsi un esame puo fare parte di un corso o no , e un corso puo avere un esame o n esami("qui ho un dubbio sulla cardinalita da parte dei Esame ma penso che sia giusta")
Corsi(1,1)--fa parte--(1,n)(CorsoDiLaurea)
un corso fa parte di uno e un corso di laurea,e un CorsoDiLaurea puo avere da 1 a n corsi |
altin |
se faqi caso alle cardinalita puo capire che dalla prima query che:
SELECT AVG(voto) FROM esami JOIN corsi ON corso=corsi.id JOIN corsidilaurea ON corsodilaurea=corsidilaurea.id WHERE corsidilaurea.denominazione='Informatica'
il rpimo join fra Esami e Corsi puo darti solo i studenti di quell esame in quella data ("qui noti che nn tieni conto dei studenti che nn hanno partecipato").
il secondo join fra Corsi e CorsiDiLaurea lo fai per ricavare quelli del informatica. |
altin |
ho sbagliato sopra..ripetto tutto scusa |
altin |
la differenza sta che nella prima tu puoi recuperare le medie dei esami di un corso della facolta di informatica.
nella seconda tu selezioni tutti i studenti che hanno fatto un certo esame della facolta di informatica e su qeusti esami vai a recuperare la media("fai atenzione xke qui puoi avere dei studenti che non hanno fatto nessun esame che fanno parte della facolta di informatica",da qui puoi capire ch eperdi la media dei esami che dei studenti non hanno fatto.)suponi che devi fare l'esame di programmazione e di statistica.hai dei studenti che hanno partecipato solo al esame di programmazione.con il secondo query tu fai il join tra studente e esame("significa che prendi in considerazione solo gli esami che lo studente ha partecipato e non tutti gli altri").se quel studente che ha fatto programmazione non ha fatto statistica vuol dire se tu fai join tra studente e corso non puoi recuperare l'esame di statistica.
o meglio imagina che l'esame di statistica e del 3 anno e programmazione del 1.hai dei studenti del secondo anno.se fai join dei studenti con gli esami vedi subito che statistica del 3 anno non lo ha fatto nessuno xke sono tutti del secondo anno.
tu puoi avere che ad un esame nn ha partecipato nessuno |
|
|
|