Informatica Generale (AA 07/08) Corso di laurea in Scienze della Comunicazione Facoltà di Lettere e Filosofia Università degli Studi di Salerno : SQL (2) Tabelle mult., variabili, aggreg, group Prof. Alberto Postiglione Università degli Studi di Salerno Queries su più tabelle Per formulare un interrogazione su più tabelle, la clausola dovrà contenere l elenco di tutte le tabelle coinvolte Sul prodotto cartesiano delle tabelle verranno applicate le condizioni contenute nella clausola WHERE # 2 Prof Alberto Postiglione Università Salerno Come funziona una query su più tabelle Come funziona una query su più tabelle Una Query su più tabelle si riduce ad una query su una sola tabella in quanto SQL effettua il prodotto cartesiano di tutte le tabelle coinvolte nella query Infatti, il Prodotto Cartesiano crea un unica, grande, tabella, data dal prodotto di quelle di partenza Su tale grande tabella si applicano le condizioni della clausola WHERE. Alla fine viene creata la tabella di risposta selezionando i campi presenti nella clausola I1 I2 IMPIEGATO DIPARTIMENTO D1 D2 D3 D4 D5 Per avere la prova basta eseguire la seguente query: *, ; # 3 Prof Alberto Postiglione Università Salerno # 4 Prof Alberto Postiglione Università Salerno Come funziona una query su più tabelle Operatore punto Il numero totale di righe è il prodotto del numero delle righe presenti nelle tabelle input, cioè 40, in quanto ha 8 righe ha 5 righe. Il numero totale di colonne è la somma del numero delle colonne nelle tabelle input, cioè 9, in quanto ha 6 colonne ha 3 colonne. Per indicare gli attributi di ogni tabella si usa la notazione < Tabella>.<attributo> E necessario utilizzare l operatore punto per identificare la tabelle da cui provengono i campi solo se c è ambiguità, cioè se nell interrogazione si fa riferimento a nomi presenti in più tabelle. In caso di assenza di ambiguità è possibile usare il solo nome del campo, senza dichiarare la tabella di appartenenza # 5 Prof Alberto Postiglione Università Salerno # 6 Prof Alberto Postiglione Università Salerno 1
Tabelle esempio: / (,,, Ufficio,, ) Anna Giuseppe Mario Bianco Bianchi Neri (, Indirizzo, ) Ricerca Ufficio 75 20 16 20 20 10 Indirizzo Via Tito Livio, 27 Via Tito Livio, 2 Via Segre, 9 P.le Lavater, 3 Via Venosa, 6,00 36.000,00,00 73.000,00 46.000,00 Venezia Napoli Genova QUERY 23 - Tabelle Multiple, e città di lavoro di tutti gli impiegati.,.,., WHERE. =.; NOME e COGNOME appartengono alla tabella IMPIEGATO Anna Giuseppe Mario Bianco Bianchi Neri CITTA appartiene alla tabella DIPARTIMENTO # 7 Prof Alberto Postiglione Università Salerno # 8 Prof Alberto Postiglione Università Salerno Uso di ALIAS (Nomi alternativi) USO DI VARIABILI Atzeni, cap. 4.2.2 Uso di variabili ALIAS: nome alternativo dato ad una tabella MOTIVAZIONI (Alias come Pseudonimo) Far riferimento ad una tabella evitando di scrivere per intero il suo nome ogni volta che ne viene richiesto l uso (Alias come nome di variabile) Far riferimento a più esemplari della stessa tabella, quando l interrogazione prevede di accedere in momenti successivi alla stessa tabella (quando per esempio una tabella va confrontata con se stessa) # 10 Prof Alberto Postiglione Università Salerno QUERY 23bis - Alias su Tabelle, e città di lavoro di tutti i dipendenti I.,, D. AS I, AS D WHERE I. = D.; Anna Giuseppe Mario Bianco Bianchi Neri QUERY 24 - Variabili, e Stipendio di chi guadagna più di Neri. In questo caso la query corrisponde ad un confronto da effettuare all interno della stessa tabella. Dobbiamo assegnare due nomi (ALIAS) differenti alla stessa tabella, in modo da poter confrontare elementi appartenenti alla stessa tabella come se fossero due tabelle differenti. # 11 Prof Alberto Postiglione Università Salerno # 12 Prof Alberto Postiglione Università Salerno 2
WHERE QUERY 24 - Variabili I2., I2., I2.[] I1, I2 I1. = AND I1. = Neri AND I2.[] > I1.[] 73.000,00 46.000,00 OPERATORI AGGREGATI E INTERROGAZIONI CON RAGGRUPPAMENTO Atzeni, cap. 4.2.3, 4.2.4 # 13 Prof Alberto Postiglione Università Salerno Operatori Aggregati Operatori Aggregati Una Query normalmente è applicata all intera tabella, ma ne analizza una riga per volta, estraendo tutte quelle che verificano le condizioni della WHERE Es: Si vuole conoscere il numero di matricola di tutti gli studenti che abitano a Napoli. Se ci sono 100 studenti di Napoli, la risposta sarà una tabella con 100 righe # 15 Una Query aggregata estrae un risultato che dipende da un insieme di righe. Il risultato è un valore che non è posseduto da una riga in particolare Es: Si vuole conoscere il numero di studenti che abitano a Napoli Se ci sono 100 studenti di Napoli, la risposta sarà il numero 100. Prof Alberto Postiglione Università Salerno Le Queries con operatori aggregati sono delle estensioni delle normali interrogazioni Un interrogazione con un operatore aggregato viene eseguita in 2 momenti successivi: 1. (Selezione di righe) Viene prima eseguita la query considerando le parti e WHERE, procedendo una riga alla volta selezionando quelle che rispondono alle condizioni della clausola Where. 2. (Applicazione della funzione sulle righe selezionate) Sulla tabella risultante viene poi applicato l operatore aggregato # 16 Prof Alberto Postiglione Università Salerno QUERY 25 - COUNT QUERY 25bis - COUNT Numero di Dipendenti del Count (*) WHERE = "; 2 Numero di Dipendenti del (metodo alternativo) WHERE Count ([]) = "; 2 # 17 Prof Alberto Postiglione Università Salerno # 18 Prof Alberto Postiglione Università Salerno 3
# 19 QUERY 26 - COUNT ATTENZIONE: Count (<nome campo>) conta il numero di righe con valore NON NULLO del campo specificato, che non necessariamente corrisponde al numero di righe selezionate tramite la clausola WHERE Numero totale di Dipendenti Count (*) 8 Prof Alberto Postiglione Università Salerno # 20 QUERY 26 bis e 26ter - COUNT Numero totale di Dipendenti Alternativa num. 1 (26bis) Count () Alternativa num. 2 (26ter) - ERRATA Count (Ufficio) 8 6 Ogni Dipendente (sia impiegato che dirigente) ha un Ci sono alcuni dipendenti che non sono assegnati ad un ufficio (i dirigenti) Prof Alberto Postiglione Università Salerno Operatori Aggregati QUERY 27 - SUM FUNZIONI di aggregazione su un insieme di tuple COUNT SUM AVG Ammettono come argomento solo espressioni numeriche o di tempo MAX MIN Richiedono che sull espressione sia definito un ordinamento (per cui si possono applicare anche a Caratteri, ad esempio) Somma degli stipendi del Sum ([]) AS [Stipendio Totale] WHERE =""; Stipendio Totale Si noti che per inserire uno spazio bianco nel nome di un campo bisogna racchiudere l intero nome tra una coppia di parentesi quadre. # 21 Prof Alberto Postiglione Università Salerno # 22 Prof Alberto Postiglione Università Salerno QUERY 28 - MIN, MAX, AVG Stipendi minimo, massimo e medio fra quelli di tutti i Dipendenti Min ([]), Max ([]), Avg ([]) 36.000,00 Expr1001 Expr1002 50.625,00 QUERY 29 MAX su testo del Dipendente che, in ordine alfabetico, è in ultima posizione Max () # 23 Prof Alberto Postiglione Università Salerno # 24 Prof Alberto Postiglione Università Salerno 4
QUERY 30 - Aggregati su 2 tabelle Nomi di Attributi e operatori aggregati Stipendio più alto fra quelli dei Dipendenti che lavorano in un con sede a WHERE Max ([]),. =. AND.='', e Stipendio del Dipendente che guadagna più di tutti NON E POSSIBILE mischiare nella clausola nomi di attributi con operatori aggregati perchè Il risultato di una è normalmente un insieme di righe Un operatore aggregato (Count, Sum, ) estrae un unico valore da un insieme di righe già selezionato dalla. Nelle queries precedenti abbiamo sempre usato operatori aggregati OPPURE nomi di campi! Se in una Query c è un qualsiasi operatore aggregato (Sum, Count, ) non abbiamo utilizzato nomi di campi presi singolarmente, se non come argomenti dell operatore # 25 Prof Alberto Postiglione Università Salerno # 26 Prof Alberto Postiglione Università Salerno Nomi di Attributi e operatori aggregati Non è cioè possibile scrivere la query un questo modo:,, Max (Stipendio) ; Questa query NON INDIVIDUA lo stipendio massimo e poi seleziona il nome e il cognome dell impiegato corrispondente. Quando incontreremo le Queries Innestate (Subqueries) vedremo come sarà possibile rispondere a questa interrogazione Raggruppamento Gli esempi visti fino ad ora operano su tutte le righe di una tabella A volte è necessario applicare un operatore aggregato a sottoinsiemi di righe raggruppati in base ad un valore comune presente in uno o più campi E cioè necessario ripartire le righe in sottoinsiemi omogenei ed applicare gli operatori aggregati ai singoli gruppi. # 27 Prof Alberto Postiglione Università Salerno # 28 Prof Alberto Postiglione Università Salerno Raggruppamento Basta aggiungere in coda alla --WHERE la clausola GROUP BY GROUP BY A 1, A k HAVING Ψ A 1, A k è un insieme di campi che devono comparire anche nella clausola Ψ è 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 QUERY 31 - GROUP BY Per ogni si vuole conoscere il totale degli stipendi pagati, Sum([]) AS Totale GROUP BY Totale 153.000,00 82.000,00 # 29 Prof Alberto Postiglione Università Salerno # 30 Prof Alberto Postiglione Università Salerno 5
Come funziona una query con GROUP BY 1) Viene prima eseguita la query come se non ci fosse la clausola GROUP BY, Nell esempio è come se venisse effettuata la query(31bis), [],00 36.000,00,00 73.000,00 46.000,00 Come funziona una query con GROUP BY 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 73.000 80.000 36.000 46.000 # 31 Prof Alberto Postiglione Università Salerno # 32 Prof Alberto Postiglione Università Salerno Come funziona una query con GROUP BY 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 73.000 80.000 36.000 46.000 Totale 153.000,00 82.000,00 GROUP BY - HAVING La lista dei campi della clausola deve essere un sottoinsieme di quella della clausola GRUOP BY. Se siamo interessati solamente ad alcuni dei sottoinsiemi utilizziamo il predicato HAVING # 33 Prof Alberto Postiglione Università Salerno # 34 Prof Alberto Postiglione Università Salerno QUERY 32 - HAVING GROUP BY - HAVING e spesa complessiva dei Dipartimenti che spendono più di 100.000 euro in stipendi, Sum ([]) GROUP BY HAVING Sum([])>100000 Expr1001 153.000,00 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 solo se questi sono argomenti di operatori aggregati # 35 Prof Alberto Postiglione Università Salerno # 36 Prof Alberto Postiglione Università Salerno 6
QUERY 33 - HAVING Tutti i Dipartimenti in cui la media degli stipendi dei dipendenti che lavorano nell ufficio 20 è superiore a 25.000 euro WHERE Ufficio = 20 GROUP BY HAVING Avg([])>25000; # 37 Prof Alberto Postiglione Università Salerno 7