INFORMATICA GENERALE Prof. Alberto Postiglione Scienze della Comunicazione Università degli Studi di Salerno : SQL (4) GROUPING Atzeni, cap. 4.3.4 DBMS: SQL (4) GROUPING 26 nov 2010 Dia 2 Gli operatori aggregati visti fino ad ora forniscono un unico risultato complessivo (SUM, COUNT, ) e operano su tutte le righe prodotte come risultato di un interrogazione SELECT Count (*) WHERE = Produzione"; DBMS: SQL (4) GROUPING 26 nov 2010 Dia 3 Altre volte è, invece, necessario applicare un operatore aggregato per ottenere più risultati parziali relativi a sottoinsiemi di righe raggruppate su valori comuni Ad esempio: se per ogni si volesse conoscere il totale degli stipendi pagati bisognerebbe raggruppare i dipendenti per dipartimento e applicare l operatore SUM ad ognuno di questi gruppi E cioè necessario ripartire le righe in sottoinsiemi omogenei ed applicare gli operatori aggregati ai singoli gruppi. 1
DBMS: SQL (4) GROUPING 26 nov 2010 Dia 4 Basta aggiungere in coda alla SELECT-FROM-WHERE la clausola GROUP BY GROUP BY A 1, A k HAVING A 1,,A k è un insiemei di campi Un sottoinsieme di A 1,,A k può comparire nella clausola SELECT (che non può contenere campi diversi da A 1,,A k ) è una clausola opzionale che si applica ai gruppi (permette di selezionarne solo un sottoinsieme) La query raggrupperà tutte le righe che presentano gli stessi valori sui campi A 1, A k DBMS: SQL (4) GROUPING 26 nov 2010 Dia 5 Tabelle esempio: Impiegato/ Impiegato (Nome, Cognome,, Ufficio, Stipendio annuo, Città) Impiegato Nome Cognome Ufficio Stipendio annuo Città Anna Bianco Amministrazione 75 40.000,00 Venezia Carlo Bianchi Produzione 20 36.000,00 Torino Carlo Rossi Direzione 80.000,00 Milano Franco Neri Distribuzione 16 45.000,00 Napoli Giuseppe Verdi Amministrazione 20 40.000,00 Roma Lorenzo Gialli Direzione 73.000,00 Genova Marco Franco Produzione 20 46.000,00 Roma Mario Rossi Amministrazione 10 45.000,00 Milano (Nome, Indirizzo, Città) Nome Indirizzo Città Amministrazione Via Tito Livio, 27 Milano Direzione Via Tito Livio, 2 Milano Distribuzione Via Segre, 9 Roma Produzione P.le Lavater, 3 Torino Ricerca Via Venosa, 6 Milano DBMS: SQL (4) GROUPING 26 nov 2010 Dia 6 QUERY 30 - GROUP BY Per ogni si vuole conoscere il totale degli stipendi pagati SELECT, Sum([Stipendio annuo]) AS Totale GROUP BY Totale Amministrazione 125.000,00 Direzione 153.000,00 Distribuzione 45.000,00 Produzione 82.000,00 2
DBMS: SQL (4) GROUPING 26 nov 2010 Dia 7 1) Viene prima eseguita la query come se non ci fosse la clausola GROUP BY, Nell esempio è come se venisse effettuata la query(31bis) SELECT FROM, [Stipendio annuo] Impiegato Stipendio annuo Amministrazione 40.000,00 Produzione 36.000,00 Direzione 80.000,00 Distribuzione 45.000,00 Amministrazione 40.000,00 Direzione 73.000,00 Produzione 46.000,00 Amministrazione 45.000,00 DBMS: SQL (4) GROUPING 26 nov 2010 Dia 8 2) Le righe vengono poi raggruppate mettendo assieme tutte quelle con uguale valore degli attributi che compaiono nella clausola GROUP BY Nell esempio il valore in base a cui raggruppare è il nome del t Stipendio annuo Amministrazione 40.000 Amministrazione 40.000 Amministrazione 45.000 Direzione 73.000 Direzione 80.000 Distribuzione 45.000 Produzione 36.000 Produzione 46.000 DBMS: SQL (4) GROUPING 26 nov 2010 Dia 9 3) Viene applicato l operatore aggregato ad ognuno dei sottoinsiemi individuati Nel nostro esempio, l operatore è SUM e si applica ad ognuno dei 4 sottoinsiemi individuati Stipendio annuo Totale Amministrazione 40.000 Amministrazione 125.000,00 Amministrazione 40.000 Direzione 153.000,00 Amministrazione 45.000 Distribuzione 45.000,00 Direzione 73.000 Produzione 82.000,00 Direzione 80.000 Distribuzione 45.000 Produzione 36.000 Produzione 46.000 3
DBMS: SQL (4) GROUPING 26 nov 2010 Dia 10 GROUP BY - HAVING La lista dei campi della clausola SELECT deve essere un sottoinsieme di quella della clausola GRUOP BY. Se siamo interessati solamente ad alcuni dei sottoinsiemi utilizziamo il predicato HAVING DBMS: SQL (4) GROUPING 26 nov 2010 Dia 11 QUERY 31 - HAVING Nome e spesa complessiva dei Dipartimenti che spendono più di 100.000 euro in stipendi SELECT, Sum ([Stipendio annuo]) GROUP BY HAVING Sum([Stipendio annuo])>100000 Expr1001 Amministrazione 125.000,00 Direzione 153.000,00 DBMS: SQL (4) GROUPING 26 nov 2010 Dia 12 GROUP BY - HAVING Nota: HAVING può anche essere usato senza GROUP BY. In questo caso la tabella si considera come un unico grande raggruppamento. HAVING presenta espressioni che contengono campi HAVING presenta espressioni che contengono campi solo se questi sono argomenti di operatori aggregati 4
DBMS: SQL (4) GROUPING 26 nov 2010 Dia 13 QUERY 32 - HAVING Tutti i Dipartimenti in cui la media degli stipendi dei dipendenti che lavorano nell ufficio 20 è superiore a 25.000 euro SELECT WHERE Ufficio = 20 GROUP BY HAVING Avg([Stipendio annuo])>25000; Amministrazione Produzione 5