: SQL (3) Tabelle multiple, variabili, operatori di aggregazione QUERIES SU PIU TABELLE Queries su più tabelle 17 mar 010 Dia 3 17 mar 010 Dia 4 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 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 Per avere la prova basta eseguire la seguente query: *, Dipartimento; 17 mar 010 Dia 5 17 mar 010 Dia 6 I1 IMPIEGATO DIPARTIMENTO D1 D Il numero totale di righe è il prodotto del numero delle righe presenti nelle tabelle input, cioè 40, in quanto ha 8 righe Dipartimento ha 5 righe. D3 I D4 D5 Il numero totale di colonne è la somma del numero delle colonne nelle tabelle input, cioè 9, in quanto ha 6 colonne Dipartimento ha 3 colonne. 1
Operatore punto Per indicare gli attributi di ogni tabella si usa la notazione < Tabella>.<attributo> 17 mar 010 Dia 7 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 17 mar 010 Dia 8 Tabelle esempio: /Dipartimento (, Cognome, Dipartimento, Ufficio, Stipendio annuo, Città) Cognome Dipartimento Ufficio Stipendio annuo Città Anna Bianco Amministrazione 75 40.000,00 Venezia Bianchi Produzione 0 36.000,00 Torino Direzione Neri Distribuzione 16 45.000,00 Napoli Giuseppe Verdi Amministrazione 0 40.000,00 Roma Lorenzo Gialli Direzione 73.000,00 Genova Marco Produzione 0 46.000,00 Roma Mario Amministrazione 10 45.000,00 Dipartimento (, Indirizzo, Città) Dipartimento Indirizzo Città Amministrazione Via Tito Livio, 7 Direzione Via Tito Livio, Distribuzione Via Segre, 9 Roma Produzione P.le Lavater, 3 Torino Ricerca Via Venosa, 6 QUERY 3 - Tabelle Multiple 17 mar 010 Dia 9, Cognome e città di lavoro di tutti gli impiegati.,.cognome, Dipartimento.Città, Dipartimento WHERE.Dipartimento = Dipartimento.; NOME e COGNOME appartengono alla tabella IMPIEGATO Anna Giuseppe Lorenzo Marco Mario Cognome Bianco Bianchi Neri Verdi Gialli Città Torino Roma Torino CITTA appartiene alla tabella DIPARTIMENTO USO DI VARIABILI Atzeni, cap. 4.. Uso di ALIAS (Nomi alternativi) ALIAS: nome alternativo dato ad una tabella 17 mar 010 Dia 11 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) 17 mar 010 Dia 1 QUERY 3bis - Alias su Tabelle, Cognome e città di lavoro di tutti i dipendenti I., Cognome, D.Città AS I, Dipartimento AS D WHERE I.Dipartimento = D.; Cognome Città Anna Bianco Bianchi Torino Neri Roma Giuseppe Verdi Lorenzo Gialli Marco Torino Mario
QUERY 4 - Variabili 17 mar 010 Dia 13 QUERY 4 - Variabili 17 mar 010 Dia 14, Cognome 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. I., I.Cognome, I.[Stipendio annuo] I1, I WHERE I1. = AND I1.Cognome = Neri AND I.[Stipendio annuo] > I1.[Stipendio annuo] Lorenzo Marco Cognome Gialli Stipendio annuo 73.000,00 46.000,00 Operatori di AGGREGAZIONE Atzeni, cap. 4..3, 4..4 Operatori Aggregati 17 mar 010 Dia 16 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 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 il numero di studenti che abitano a Napoli Se ci sono 100 studenti di Napoli, la risposta sarà il numero 100. Operatori Aggregati 17 mar 010 Dia 17 Le Queries con operatori aggregati sono delle estensioni delle normali interrogazioni Un interrogazione con un operatore aggregato viene eseguita in 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..(Applicazione della funzione sulle righe selezionate) Sulla tabella risultante viene poi applicato l operatore aggregato 17 mar 010 Dia 18 QUERY 5 - COUNT Numero di Dipendenti del Dipartimento Produzione Count (*) WHERE Dipartimento= Produzione"; 3
17 mar 010 Dia 19 QUERY 5bis - COUNT QUERY 6 - COUNT 17 mar 010 Dia 0 Numero di Dipendenti del Dipartimento Produzione (metodo alternativo) WHERE Count ([Cognome]) Dipartimento= Produzione"; Numero di tutti i Dipendenti Count (*) 8 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 QUERY 6 bis e 6ter - COUNT Numero totale di Dipendenti Alternativa num. 1 (6bis) Count (Cognome) Alternativa num. (6ter) - ERRATA Count (Ufficio) 8 6 17 mar 010 Dia 1 Ogni Dipendente (sia impiegato che dirigente) ha un Cognome Ci sono alcuni dipendenti che non sono assegnati ad un ufficio (i dirigenti) Riepilogo Operatori Aggregati 17 mar 010 Dia 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) QUERY 7 - SUM Somma degli stipendi del Dipartimento Amministrazione Sum ([Stipendio annuo]) AS [Stipendio Totale] WHERE Dipartimento="Amministrazione"; 17 mar 010 Dia 3 QUERY 8 - MIN, MAX, AVG 17 mar 010 Dia 4 Stipendi minimo, massimo e medio fra quelli di tutti i Dipendenti Min ([Stipendio annuo]), Max ([Stipendio annuo]), Avg ([Stipendio annuo]) Stipendio Totale 15.000,00 36.000,00 Expr1001 Expr100 50.65,00 Si noti che per inserire uno spazio bianco nel nome di un campo bisogna racchiudere l intero nome tra una coppia di parentesi quadre. 4
QUERY 9 MAX su testo 17 mar 010 Dia 5 Cognome del Dipendente che, in ordine alfabetico, è in ultima posizione Max (Cognome) Verdi QUERY 30 - Aggregati su tabelle Stipendio più alto fra quelli dei Dipendenti che lavorano in un Dipartimento con sede a WHERE 17 mar 010 Dia 6 Max ([Stipendio annuo]), Dipartimento Dipartimento. =.Dipartimento AND Dipartimento.Città='' 17 mar 010 Dia 7 Nomi di Attributi e operatori aggregati, Cognome 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 17 mar 010 Dia 8 Nomi di Attributi e operatori aggregati Non è cioè Cognome, possibile, scrivere Max la (Stipendio) query un questo modo: ; 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 5