Informatica Basi di dati parte 4 SQL Lezione 13 Laurea magistrale in Scienze della mente Laurea magistrale in Psicologia dello sviluppo e dell'educazione Anno accademico: 2012 2013 1 Interrogazioni in SQL Non esiste un unico standard SQL standard Formulazione di interrogazioni (query) è parte del Data Manipulation Language, DML Anche usato neldata DeclarationLanguage Language, DDL (per esempio, per dichiarare vincoli di integrità) Paradigma dichiarativo: si specifica la descrizione dell obiettivo e non il modo con cui ottenerlo Sintassi Esistono, in generale, più modi per effettuare un interrogazione: scelta basata sulla leggibilità (più che sull efficienza ) Struttura essenziale (introdurremo le variazioni di volta in volta): select ListaAttributi (target list) ListaTabelle (clausola ) [ Condizione] (clausola ) Le parentesi quadre [ ]: indicano che il termine all interno è opzionale Può non comparire o comparire Significato dell interrogazione Si considerano la tabella/le tabelle della clausola Si selezionano i record che soddisfano la condizione della clausola (opzionale) Si danno in ouput i valori degli attributi elencati nella target list ( select ) Tabella Impiegato Impiegato(Matricola, Nome, Cognome, Dipart, Ufficio, Stipendio, Città) Impiegato Matricola Nome Cognome Dipart Ufficio Stipendio Città 45 Amministr 10 15 Milano 46 Prod 20 12 Torino 47 Giuseppe Verdi Amministr 20 13 Roma 48 Franco Neri Distrib 16 15 Napoli 49 Direzione 14 Milano 50 Lorenzo Lanzi Direzione 7 21 Genova 51 Paola Burroni Ammistr 75 13 Venezia 52 Marco Franco Prod 20 14 Roma 1
Interrogazione 1 Interrogazione 2 Cognome = * significa tutti gli attributi select Stipendio Cognome = Matricola Nome Cognome Dipart Ufficio Stipendio Città 45 Amministr 10 15 Milano 49 Direzione 14 Milano Stipendio 15 Interrogazione 2bis Interrogazione 3 select Stipendio as Salario Cognome = Salario 15 alias select Stipendio/12 as StipendioMensile Cognome = espressione StipendioMensile 1 Join in SQL (primo modo) Per formulare interrogazioni che coinvolgono più tabelle occorre fare un join In SQL un modo è: elencare le tabelle di interesse nella mettere nella le condizioni necessarie per mettere in relazione fra loro gli attributi di interesse Tabella Dipartimento Dipartimento(Nome, Indirizzo, Città) Dipartimento Nome Indirizzo Città Amministr Via Tito Livio Milano Prod P.le Lavater 3 Torino Distrib Via Segre 9 Roma Direzione Via Tito Livio Milano Ricerca Via Morone 6 Milano 11 12 2
Interrogazione 4a Interrogazione 4a Prodotto cartesiano delle due tabelle: ogni riga di una tabella in relazione con tutte le righe dell altra tabella Nome Cognome Dipart Ufficio Stipendio Città Nome Indirizzo Città Amministr 10 15 Milano Amministr Via Tito Livio Milano Amministr 10 15 Milano Prod P.le Lavater 3 Torino Amministr 10 15 Milano Distrib Via Segre 9 Roma Amministr 10 15 Milano Direzione Via Tito Livio Milano Impiegato,Dipartimento Amministr 10 15 Milano Ricerca Via Morone 6 Milano Prod 20 12 Torino Amministr Via Tito Livio Milano Prod 20 12 Torino Prod P.le Lavater 3 Torino Prod 20 12 Torino Distrib Via Segre 9 Roma Prod 20 12 Torino Direzione Via Tito Livio Milano Prod 20 12 Torino Ricerca Via Morone 6 Milano da Impiegato da Dipartimento 13 14 Interrogazione 4b Risultato interrogazione 4b Restituire tutta l informazione rispetto agli impiegati/dipartimenti (usando gli attributi Dipart e Dipartimento.Nome per mettere in relazione le due tabelle) Impiegato,Dipartimento Dipart = Dipartimento.Nome Nome Cognome Dipart Ufficio Stipendio Città Nome Indirizzo Città Amministr 10 15 Milano Amministr Via Tito Livio Milano Prod 20 12 Torino Prod P.le Lavater 3 Torino Giuseppe Verdi Amministr 20 13 Roma Amministr Via Tito Livio Franco Neri Distrib 16 15 Napoli Distrib Via Segre 9 Roma Direzione 14 Milano Direzione Via Tito Livio Lorenzo Lanzi Direzione 7 21 Genova Direzione Via Tito Livio Paola Burroni Ammistr 75 13 Venezia Amministr Via Tito Livio Milano Milano Milano Milano Marco Franco Prod 20 14 Roma Prod P.le Lavater 3 Torino Per collegare tra di loro tabelle tramite i valori uguali degli attributi La notazione punto serve per disambiguare da Impiegato da Dipartimento 15 16 Interrogazione 4c Restituire nome e cognome degli impiegati e le città in cui lavorano select Impiegato.Nome,Cognome, Dipartimento.Città Impiegato,Dipartimento Dipart = Dipartimento.Nome Suggerimento (ordine della scrittura dell interrogazione):,, target list 17 Risultato interrogazione 4c Impiegato.Nome Cognome Dipartimento.Città Milano Torino Giuseppe Verdi Milano Franco Neri Roma Milano Lorenzo Lanzi Milano Paola Burroni Milano Marco Franco Torino 18 3
Join esplicito Interrogazione 5 (join esplicito) Abbiamo visto un modo di fare il join mettendo le condizioni di join nella clausola Si può utilizzare esplicitamente un operatore di join select Impiegato.Nome, Cognome, Dipartimento.Città Impiegato,Dipartimento Dipart = Dipartimento.Nome select Impiegato.Nome, Cognome, Dipartimento.Città Impiegato join Dipartimento On (Dipart = Dipartimento.Nome) 19 20 Outer join Tabelle Guidatore e Automobile Fino ad adesso abbiamo visto inner join Parliamo adesso di outer join (joinesterno) Serve quando il join non è completo Completo: dato R1 join R2 on ( ), per ciascuna tupla di R1 esiste almeno una tupla di R2 che si combina con essa, e viceversa per R2 se si vuole mantenere l informazione anche per quelle tuple che non partecipano al join Nome Cognome Marco Neri AP 4544442R Marco Neri AP 4544442R Targa Marca Modello BB 421 JJ Uno MI 2020030U 21 22 Inner join ( normale ) Outer left join (interrogazione 6) select Nome,Cognome,Guidatore., Guidatore join Automobile on (Guidatore.=Automobile.) select Nome,Cognome,Guidatore., Guidatore left join Automobile on (Guidatore.=Automobile.) Nome Cognome Guidatore. Targa Marca Modello Nome Cognome Guidatore. Targa Marca Modello Marco Neri AP 4544442R Join non completo 23 24 4
Outer right join (interrogazione 7) Outer full join (interrogazione 8) select Nome,Cognome,Guidatore., Guidatore right join Automobile on (Guidatore.=Automobile.) select Nome,Cognome,Guidatore., Guidatore full join Automobile on (Guidatore.=Automobile.) Nome Cognome Guidatore. Targa Marca Modello BB 421 JJ Uno Nome Cognome Guidatore. Marco Neri AP 4544442R Targa Marca Modello BB 421 JJ Uno 25 26 Join naturale (interrogazione 9) select Nome,Cognome,, Guidatore natural join Automobile Nome Cognome Targa Marca Modello Sulla clausola Ammette come argomento un espressione booleana Predicati semplici combinati con not, and, or (not ha la precedenza, consigliato l uso di parentesi()) Ciascun predicato usa operatori: =, <>, <, >, <=, >= Confronto tra valori di attributi, costanti, espressioni Attributo comune: 28 Interrogazione 10 Interrogazioni 11 e 12 select Nome,Cognome Impiegato Ufficio = 20 and Dipart = Amministr Nome Giuseppe Cognome Verdi select Nome, Cognome Dipart= Prod or Dipart= Amministr select Nome Cognome= and (Dipart= Prod or Dipart= Amministr ) Nome Paola Marco Giuseppe Cognome Burroni Franco Verdi Nome 29 30 5
Operatore like Usato per i confronti con stringhe _ = carattere arbitrario % = stringa di lunghezza arbitraria (anche 0) di caratteri arbitrari Esempi: like ab%ba_ = tutte le stringhe che cominciano con ab e che hanno ba come coppia di caratteri prima dell ultima posizione (es. abjjhhdhdbak,abbap) Interrogazione 13 Cognome like _o%i or Cognome like _u%i Matricola Nome Cognome Dipart Ufficio Stipendio Città 45 Amministr 10 15 Milano 49 Direzione 14 Milano 51 Paola Burroni Ammistr 75 13 Venezia 31 32 Gestione dei valori i Campo con valore o significa: non applicabile a una certa tupla, o valore sconosciuto, o non si sa a SQL offre il predicato is : Attributo is [not] Stipendio>13: cosa succede se l attributo Stipendio è o? Controllo esplicito, ad esempio: Stipendio > 13 or Stipendio is Ordinamento Per ordinare le righe del risultato di un interrogazione, si può usare la clausola order by Esempi: Impiegati order by Matricola asc Impiegati order by Matricola desc ordine crescente ordine decrescente 33 34 Operatori aggregati SQL offre degli operatori che lavorano su più di una tupla alla volta: count,sum,max,min,avg Interrogazione 14 select count(*) Dipart = Prod count(<* [distinct all]listaattributi>) valori diversi tra loro non 35 36 6
Interrogazioni 15, 16 Gli operatori aggregati si applicano sulle tuple selezionate dalla clausola (se c è) count(<* [distinct all]listaattributi>) Numero di stipendidiversidiversi select count(distinct Stipendio) Numero di righe che hanno nome non o sum, max, min, avg Accettano solo espressioni rappresentanti valori numerici o intervalli di tempo distinct e all stesso significato di prima Altri operatori a seconda delle versioni di SQL (solitamente operatori statistici) select count(all Nome) 37 38 Interrogazioni 17, 18 Somma stipendi di Amministrazione select sum(stipendio) Dipart = Amministr i Stipendi min, max, medio degli Impiegati select min(stipendio), max(stipendio), avg(stipendio) Interrogazione 19 Max stipendio tra impiegati che lavorano in un dipartimento a Milano select max(stipendio), Dipartimento Dipart = Dipartimento.Nome and Dipartimento.Citta = Milano 39 40 Interrogazione 20 Raggruppamento con group by: Estrarre la somma degli stipendi di tutti gli impiegati dello stesso dipartimento select Dipart, sum(stipendio) Interrogazione 20 (cont.) È come se prima si facesse la query select Dipart, Stipendio ottenendo la tabella 41 42 7
Interrogazione 20 (cont.) Interrogazione 20 (cont.) Dipart Stipendio Amministrazione 22.500 Produzione 18.000 Distribuzione 22.500 Direzione 40.000 Direzione 36.500 Produzione 23.000 43 Poi le tuple si raggruppano in sottoinsiemi in base allo stesso valore dell attributo Dipart Dipart Stipendio Amministrazione 22.500 Produzione 18.000 Produzione 23.000 Distribuzione 22.500 Direzione 40.000 Direzione 36.500 44 Interrogazione 20 (cont.) Poi le tuple si raggruppano in sottoinsiemi in base allo stesso valore dell attributo Dipart Interrogazione 20 (cont.) Infine l operatore sum viene applicato separatamente a ogni sottoinsieme Dipart Stipendio Amministrazione 22.500 Produzione 18.000 Produzione 23.000 Distribuzione 22.500 Direzione 40.000 Direzione 36.500 45 Dipart sum(stipendio) Amministrazione 62.500 Produzione 41.000 Distribuzione 22.500 Direzione 76.500 46 Interrogazione non corretta Interrogazione 21 (versione scoretta) select Ufficio A ogni valore dell attributo Dipart corrisponderanno diversi valori dell attributo Ufficio Dopo l esecuzione del raggruppamento, invece, ogni sottoinsieme di righe deve corrispondere a una sola riga nella tabella risultato della interrogazione Dipartimenti, il numero di impiegati di ciascun dipartimento, e la città sede del dipartimento select Dipart, count(*), D.citta, Dipartimento Impiegato.Dipart=Dipartimento.Nome scorretta! 47 48 8
Interrogazione 21 (versione coretta) Predicati sui gruppi Dipartimenti, il numero di impiegati di ciascun dipartimento, e la città sede del dipartimento select Dipart, count(*), D.Citta I, Dipartimento D I.Dipart=D.Nome, D.Citta group by: le tuple vengono raggruppate in sottoinsiemi Si potrebbe volere considerare solo sottoinsiemi che soddisfano una certa condizione clausola : applicata alle singole righe clausola having: applicata al risultato della group by ogni sottoinsieme di tuple della group by viene selezionato se il predicato di having è soddisfatto corretta! 49 50 Interrogazione 22 Dipartimenti che spendono più di 50 talleri in stipendi select Dipart, sum(stipendio) having sum(stipendio) > 50 Predicati sui gruppi Consigli di buon uso Having è da usare con group by Senza group by: l intero insieme di righe è trattato come un unico raggruppamento Sela condizione nonè soddisfatta il risultato sarà vuoto Usare solo predicati in cui ci sono operatori aggregati nella clausola having 51 52 Interrogazione 23 Dipartimenti per cui la media degli stipendi degli impiegati che lavorano nell ufficio 20 è > di 12.500 talleri select Dipart Ufficio = 20 having avg(stipendio) > 12.500 53 9