PDA

View Full Version : [Basi di Dati] Esercizi d'esame!


Doriän
16-01-2009, 11:03
Mmh, ho appena visto che c'è un therad molto simile al mio in prima pagina, però non vorrei hijackarlo chiedendo li, qualche moderatore potrebbe dirmi se faccio bene ad aprirne un altro :)?!
Comunque, sto preparando l'esame di BDA, e ogni tanto mi impantano in qualche query. Ho per esempio queste relazioni


SQUADRE(IdSq, Nome, Città)
PARTITE(IdPartita, Data, Campionato, IdSqCasa, IdSqOspite, GolSqCasa, GolSqOspite)


sulle quali devo esprimere questa interrogazione:

Selezionare il nome e il numero di gol segnati in casa nell’anno 1980
dalle squadre di Roma che, nell’anno 1980 in casa, hanno subito meno di 20 gol, ne hanno fatti più di 40, e hanno vinto almeno 13 partite.


Io ho buttato giù questa cosa:


SELECT nome, sum(GolSqCasa)
FROM Squadre S join Partite P on S.IdSq = P.IdSqCasa
WHERE data like '%1980"
GROPU BY IdSqCasa
HAVING sum(GolSqOspite) < 20
and sum(GolSqCasa) > 40


Secondo me, questa interrogazione joina le due tabelle, mi seleziona solo i record per i quali la data finisce con 1980 e dopo effettua un raggruppamento per IdSqCasa per tutti i record che rispettano quelle condizioni. Anche posto che sia corretto, e non mi pare lo sia, come trovo quante partite hanno :mbe: ?

gugoXX
16-01-2009, 11:25
Mmh, ho appena visto che c'è un therad molto simile al mio in prima pagina, però non vorrei hijackarlo chiedendo li, qualche moderatore potrebbe dirmi se faccio bene ad aprirne un altro :)?!
Comunque, sto preparando l'esame di BDA, e ogni tanto mi impantano in qualche query. Ho per esempio queste relazioni


SQUADRE(IdSq, Nome, Città)
PARTITE(IdPartita, Data, Campionato, IdSqCasa, IdSqOspite, GolSqCasa, GolSqOspite)


sulle quali devo esprimere questa interrogazione:


Io ho buttato giù questa cosa:


SELECT nome, sum(GolSqCasa)
FROM Squadre S join Partite P on S.IdSq = P.IdSqCasa
WHERE data like '%1980"
GROPU BY IdSqCasa
HAVING sum(GolSqOspite) < 20
and sum(GolSqCasa) > 40


Secondo me, questa interrogazione joina le due tabelle, mi seleziona solo i record per i quali la data finisce con 1980 e dopo effettua un raggruppamento per IdSqCasa per tutti i record che rispettano quelle condizioni. Anche posto che sia corretto, e non mi pare lo sia, come trovo quante partite hanno :mbe: ?

Finora dovrebbe essere tutto giusto.
Il numero di partite e' il numero di record della tabella Partite

Doriän
16-01-2009, 12:03
Mmh, ottimo spunto di riflessione! Vediamo: a me interessano i record (ossia le righe) che rispettino quei due parametri riguardanti i gol, ma allo stesso tempo che rispettino anche il vincolo sul numero di partite, mettiamola così. Il numero di record lo trovo con count(*), giusto?

SELECT nome, sum(GolSqCasa)
FROM Squadre S join Partite P on S.IdSq = P.IdSqCasa
WHERE data like '%1980"
GROUP BY IdSqCasa
HAVING sum(GolSqOspite) < 20
and sum(GolSqCasa) > 40
and count(*) >= 13

Questa interrogazione mi seleziona tutte le partite, raggruppandole per squadre, dove il totale delle partite sia almeno 13, il totale di gol segnati siano quelli, e mi restituisce nome della squadra e totale di gol segnati. È corretto?!

gugoXX
16-01-2009, 12:10
Giusto!

Doriän
16-01-2009, 14:38
ottimo! grazie gugo, ora procedo e se mi incastro vengo a chiedere :asd:

gugoXX
16-01-2009, 15:05
ottimo! grazie gugo, ora procedo e se mi incastro vengo a chiedere :asd:

Purtroppo c'e' un errore che vedo ora.
Da SQL Standard, a fronte di una GROUP BY, puoi selezionare solo le colonne per cui hai fatto GROUP BY (piu' una serie di altre possibilita' che trovi qui
http://www.hwupgrade.it/forum/showthread.php?t=1906542)
al che non puoi selezionare
nome
se raggruppi per IdSqCasa

Fatto salvo che i nomi delle squadre siano tutti diversi (che e' normale, ma che dovrebbe essere rinforzato da un Constraint di univocita' sulla colonna), puoi raggruppare direttamente per nome.

PS: MySql, che non e' standard, permette una scrittura come quella da te esposta, ma motori piu' seri l'avrebbero rifiutata.