Results 1 to 11 of 11

Thread: SQL [Dubbio Urgente]

  1. #1
    Warrant Officer
    Join Date
    Nov 2003
    Location
    Suisse
    Posts
    2.969

    Default SQL [Dubbio Urgente]

    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 ?

  2. #2
    Warrant Officer Burner's Avatar
    Join Date
    Oct 2004
    Location
    45.698695 - 8.462571
    Posts
    2.994

    Default

    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.
    Roses are #FF0000 Violets are #0000FF All my base are belong to you.

  3. #3
    Petty Officer 2nd Class Beregond's Avatar
    Join Date
    Sep 2003
    Location
    Ceriale (SV)
    Posts
    680

    Default

    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/product...nager/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)

    on Hakkar

  4. #4
    Warrant Officer
    Join Date
    Nov 2003
    Location
    Suisse
    Posts
    2.969

    Default

    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
    Last edited by NoeX; 27th June 2006 at 15:14.

  5. #5
    Hador's Avatar
    Join Date
    Mar 2004
    Location
    Milano
    Posts
    31.321

    Default

    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

  6. #6
    Petty Officer 2nd Class Beregond's Avatar
    Join Date
    Sep 2003
    Location
    Ceriale (SV)
    Posts
    680

    Default

    Quote Originally Posted by Burner
    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
    Quote Originally Posted by Hador
    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
    Last edited by Beregond; 27th June 2006 at 15:17.

    on Hakkar

  7. #7
    Hador's Avatar
    Join Date
    Mar 2004
    Location
    Milano
    Posts
    31.321

    Default

    voleva dire di non usare le query insiemistiche ma quelle annidate

  8. #8
    Warrant Officer Burner's Avatar
    Join Date
    Oct 2004
    Location
    45.698695 - 8.462571
    Posts
    2.994

    Default

    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
    Roses are #FF0000 Violets are #0000FF All my base are belong to you.

  9. #9
    Petty Officer 2nd Class Beregond's Avatar
    Join Date
    Sep 2003
    Location
    Ceriale (SV)
    Posts
    680

    Default

    Quote Originally Posted by NoeX
    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
    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
    Last edited by Beregond; 27th June 2006 at 15:25.

    on Hakkar

  10. #10
    Warrant Officer
    Join Date
    Nov 2003
    Location
    Suisse
    Posts
    2.969

    Default

    sì ma errore mio, una sola select che però può usare altre select annidate

    madò bere, saperlo prima

    magari si studiava assieme
    Last edited by NoeX; 27th June 2006 at 15:34.

  11. #11
    Lieutenant Gate's Avatar
    Join Date
    Jan 2004
    Location
    Vietato fumareeeeee
    Posts
    4.516

    Default

    select corso from pippo where pippo = ( select corso.idcorso,esame.corso where esame.voto > avg(esame.voto))

    qualcosa di simile?
    Last edited by Gate; 27th June 2006 at 18:43.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  
[Output: 80.96 Kb. compressed to 68.47 Kb. by saving 12.48 Kb. (15.42%)]