# SubQuery e Group By (superiori)
## Query attraverso l'istruzione select parte 2

Vediamo l'uso del comando select con la clausola Group By e il caso di query annidate (subquery)
Le tabelle utilizzate sono :
studenti
| IDStudente | Nome | Cognome | DataNascita | CittaNascita | Altezza |
| 1 | Marco | Rossi | 21/1/1980 | Rovigo | 178 |
| 2 | Luca | Verdi | 25/12/1978 | Padova | 180 |
| 3 | Silvia | Blu | 13/9/1997 | Rovigo | 173 |
| 4 | Michele | Giallo | 14/9/1997 | Padova | 167 |
| 5 | Anna | Rossi | 23/2/1995 | Venezia | 180 |
compiti
| IDCompito | Materia | Data | Voto | Tipo | IDstudente |
| 1 | matematica | 13/10/2014 | 7 | scritto | 1 |
| 2 | storia | 23/10/2014 | 8 | scritto | 3 |
| 3 | matematica | 13/11/2014 | 6 | orale | 1 |
| 4 | matematica | 13/11/2014 | 7 | orale | 4 |
| 5 | geografia | 15/5/2013 | 10 | orale | 4 |
| 6 | inglese | 13/4/2013 | 2 | scritto | 2 |
| 7 | storia | 3/10/2016 | 4 | scritto | 1 |

## Group By

1) e' possibile selezionare le righe di una tabella e raggrupparle per un particolare campo, ad esempio possiamo prendere la tabella dei compiti e decidere di raggrupparli per materia per poterne visualizzare il voto medio per ciascuna materia scriviamo allora
dopo il select se utilizziamo il group by possono esserci solo i campi oggetto del raggruppamento e funzioni di aggregazione sui campi della tabella
quindi NON SI PUO' scrivere
posso anche decidere una selezione a livello di raggruppamento ad esempio calcolare il voto medio dei compiti per ciascuna materia limitatamente alle materie con più di 3 valutazioni
fate attenzione che il where lavora sulle righe prima del raggruppamento, mentre l' having sui raggruppamenti mediante funzione di aggregazione relative ai campi della tabella
ad esempio voglio il voto medio per ciascuna materia dello studente con codice 7 escludendo le materie con meno di 5 prove
calcolare il voto max e contare quanti compiti sono stati fatti per le materie : storia , geografia e matematica
contare quante prove ci sono suddivise per materia e valutazione ( i 6 con i sei, i 7 con i sette etc)

## Subquery

2) Talvolta c'e' la necessità più di una query per risolvere un particolare quesito, inserendo il risultato di una query fra i parametri di una seconda query, in questo caso abbiamo una subquery .
visualizzare i nomi degli studenti che hanno in storia un voto superiore alla media di tutti gli studenti in quella materia
ora per risolvere il quesito bisogna prima calcolare il voto medio in storia di tutti gli studenti, cioe'
e poi utilizzare la query appena scritta al posto del valore medio dei compiti in storia, quindi
oppure pensiamo a dove risolvere il quesito: stampare il nome e cognome degli studenti nati in una citta' con più di 10 iscritti nel nostro istituto ora per trovare le citta' dobbiamo
che inseriamo nella
3) possiamo usare gli operatori
in per verificare se il valore di un campo appartiene a un certo gruppo di valori
not in per verificare se il valore di un campo non appartiene a un certo gruppo di valori
all per verificare se il valore di un campo e' minore o maggiore di tutti i valori di un certo gruppo
any per verificare se il valore di un campo e' minore o maggiore uguale o diverso da almeno uno dei valori di un certo gruppo
exists per verificare se una interrogazione restituisce un numero di righe diverso da zero
4) quando si opera con le subquery si puo salvare una query con un nome e poi utilizzarla come una ulteriore tabella accessibile mediante quel nome ad esempio
salvo
come tabellacittastudentinumerosi
e poi la utilizzo in
5) le subquery possono restituire :
* un solo valore,
ad esempio per visualizzare tutti gli studenti che hanno preso il voto massimo fra i voti della tabella compiti
* una riga di valori
visualizzare i nomi e i cognomi degli studenti la cui altezza è pari all'altezza media degli studenti e che siano i più vecchi della classe
* una colonna di valori
visualizzare i nomi e i cognomi degli studenti che sono nati in città in cui sono nati più di 3 studenti
* una tabella
tutte le informazioni sui compiti degli studenti con una eta>23
6)Query correlate
Nelle soluzioni proposte per evitare di allungare troppo la query si può dare un alias al nome delle tabelle nel FROM, ad esempio
Nel caso di una query annidata, la query più interna può fare riferimento ai campi delle tabelle della query più esterna,in questo caso si parla di subquery correlata alla query principale (quella più esterna) come nel seguente esempio
In questo caso la query interna viene rielaborata per ciascuna riga della query più esterna
Per prepararvi al 2^compito rivedete l'uso dei comandi sql e poi esercitatevi nella creazione dei modelli relazionali e nelle interrogazioni sql con questa dispensaEserciziSQL.pdf (la dispensa è dell'Università di Pisa Prof.Leoni)