PDA

View Full Version : SQL [Dubbio Urgente]



NoeX
27th June 2006, 13:57
Ciao, domani devo sostenere l'esame di basi di dati e ho un dubbio che non è spiegato manco nelle slides del professore, in un esercizio con Select ANNIDATE
come questo:

Sia dato il seguente schema di db relazionale

Studente(IdStudente,Nome,Cognome)
Corso(IdCorso,Nome) Idcorso è un numerico univoco
Esame(Studente,Corso,Voto) Corso è numerico univoco

Ritornare in SQL gli identificatori dei corsi la cui media voto è maggiore della media voto calcoalta su tutti i corsi, usate una sola interrogazione:


Select idcorso
From Corso
Where ( Select avg(voto)
from esame
where corso=idcorso) > (Select avg(voto) from esame)

Allora, la prima select annidata mi restituisce una colonna senza il nome dell'attributo con per ogni riga la media dei voti di quel corso ? Oppure parto prima dalla select esterna (almeno a me verrebbe così a intuito) mi creo la colonna idcorso e ci filtro il campo Nome, poi per ogni corso mi vado a valutare la condizione ? Spiegatemi meglio come funziona l'ordine ç_ç


p.s. non c'è qlc per esercitarsi sul pc ?

Burner
27th June 2006, 15:02
Se devi farlo con una sola interrogazione credo devi mette solo un select, qualcosa tipo:

SELECT idcorso FROM Corso WHERE ( avg(voto) FROM Esame WHERE (Corso FROM Esame = idcorso FROM Corso) > avg(voto) FROM Esame);

Parti da quello che vuoi farti ritornare e man mano scendi nel dettaglio.
Non sono sicuro della sintassi, sono andato molto a naso. Cmq il modo migliore per esercitarsi (e fare query in modalità semi automatica) è usare Access, non è il massimo come database ma per le istruzioni SQL funziona.

Beregond
27th June 2006, 15:09
Io l'avrei fatta cosi:
SELECT corso
FROM esami
GROUP BY corso HAVING AVG(voto)> (SELECT AVG(voto)
FROM esami)
considerando che a quel che vedo corso.idcorso = esame.corso nn è il caso di scomodare 2 tabelle, cmq
Select idcorso
From Corso
Where ( Select avg(voto)
from esame
where corso=idcorso) > (Select avg(voto) from esame)

La parte blu prende la media globale dei voti di tutti i corsi ed è giusta
La parte verde è completamente cannata perchè
1)nel where prende in considerazione 2 attributi di 2 tabelle differenti, bisognerebbe scrivere
Select avg(voto)
from esame,corso
where corso=idcorso
2) con una cosa del genere prende la media di tutti i voti dei corsi esistenti (come ID) in entrambe le tabelle, ma si suppone che l'elenco dei corsi li comprenda tutti, non ha senso anche presa a se stante

Comunque per testare ste cose c'è questo programmino freeware con interfaccia grafica che mi fanno usare in uni http://www.sqlmanager.net/en/products/mysql/manager/download (versione lite va benissimo)
ovviamente prima serve installare Mysql 5.0 http://dev.mysql.com/downloads/mysql/5.0.html (c'è versioni diverse x processori x86 o i nuovi a 64)

NoeX
27th June 2006, 15:11
scrivere un'espressione in algebra relazionale
che ritorni gli id e i cognomi degli studenti
che hanno sostenuto l'unico esame AI
utilizzare come unico operatore binario il natural join

proiezione IdStudente, Cognome ( selezione nomecorso='AI' (Studente JOIN ridenominazione idstudente,idcorso <- studente,corso ( Esame) JOIN ridenominazione nomecorso<- nome(Corso)))

Perchè ha ridenominato Nome della tabella Corso in modo tale da averli diversi e ha fatto il contrario per la tabella Studente che fa match con istudente della tabella esame ?


Errore nella ridenominazione nomecorso<- nome(Corso)))

giusto ?


Grazie burner e beregond :)

Hador
27th June 2006, 15:13
select idcorso
from corso JOIN esame on idcorso=corso
where avg(voto) > (select avg(voto) from corso) io gli proponevo in msn, che è stessa robba di vulgar alla fin fine - ma non sono sicurissimo sulla sintassi che non è proprio il mio forte

Beregond
27th June 2006, 15:15
Se devi farlo con una sola interrogazione credo devi mette solo un select, qualcosa tipo:
SELECT idcorso FROM Corso WHERE ( avg(voto) FROM Esame WHERE (Corso FROM Esame = idcorso FROM Corso) > avg(voto) FROM Esame);

Se era tra gli esercizi con select annidati dubito che intenda quello quando dice 1 sola interrogazione, e cmq a quanto ne so io (livello didattico quindi) può nn esserci il where, ma from e select ci vanno x forza.
Forse voleva dire di non usare delle view a parte

select idcorso
from corso JOIN esame on idcorso=corso
where avg(voto) > (select avg(voto) from corso) io gli proponevo in msn, che è stessa robba di vulgar alla fin fine - ma non sono sicurissimo sulla sintassi che non è proprio il mio forte
Se metti un avg, min, max, count dentro il where da me c'è la fucilazione x direttissima, poi nn so :sneer:

Hador
27th June 2006, 15:18
voleva dire di non usare le query insiemistiche ma quelle annidate

Burner
27th June 2006, 15:19
Si mi sa che se si usa il JOIN o il GROUP BY esce molto più isi, sono io che sono atrofizzato su 3 operatori in croce che per fare interrogazioni SQL per il php non uso roba complicata :p

Beregond
27th June 2006, 15:22
scrivere un'espressione in algebra relazionale
che ritorni gli id e i cognomi degli studenti
che hanno sostenuto l'unico esame AI
utilizzare come unico operatore binario il natural join
proiezione IdStudente, Cognome ( selezione nomecorso='AI' (Studente JOIN ridenominazione idstudente,idcorso <- studente,corso ( Esame) JOIN ridenominazione nomecorso<- nome(Corso)))
Perchè ha ridenominato Nome della tabella Corso in modo tale da averli diversi e ha fatto il contrario per la tabella Studente che fa match con istudente della tabella esame ?
Errore nella ridenominazione nomecorso<- nome(Corso)))
giusto ?
Grazie burner e beregond :)
Mi spiace ma qua son tagliato fuori, mai studiata sta roba :shrug:
Se x la roba sopra, programmino compreso hai dei problemi qua a finaco c'è il mio msn, tra 9 giorni ho l'esame pure io, mi ci sto sbattendo :sneer:

NoeX
27th June 2006, 15:27
sì ma errore mio, una sola select che però può usare altre select annidate

madò bere, saperlo prima :(

magari si studiava assieme

Gate
27th June 2006, 17:48
select corso from pippo where pippo = ( select corso.idcorso,esame.corso where esame.voto > avg(esame.voto))

qualcosa di simile?