La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

SQL (II) Interrogazioni (parte 2). 2 Notazione Le parentesi angolari : permettono di isolare un termine della sintassi Le parentesi quadre [,]: indicano.

Presentazioni simili


Presentazione sul tema: "SQL (II) Interrogazioni (parte 2). 2 Notazione Le parentesi angolari : permettono di isolare un termine della sintassi Le parentesi quadre [,]: indicano."— Transcript della presentazione:

1 SQL (II) Interrogazioni (parte 2)

2 2 Notazione Le parentesi angolari : permettono di isolare un termine della sintassi Le parentesi quadre [,]: indicano che il termine all’interno è opzionale Può non comparire o comparire una sola volta

3 3 Notazione Le parentesi graffe {,}: indicano che il termine racchiuso può non comparire o essere ripetuto un numero arbitrario di volte Le barre verticali |: indicano che deve essere scelto uno tra i termini separati dalle barre

4 4 Interpretazione algebrica delle interrogazioni SQL select T1.Attrib_11,…,Th.Attrib_hm from Tabella1 as T1,…,Tabellan as Tn where condizione  T1.Attrib_11,…,Th.Attrib_hm (  condizione (Tabella1 x … x Tabellan)) Per semplicità, omettiamo le ridenominazioni che ci permettono di considerare tutti i join come prodotto cartesiano

5 5 Algebra->calcolo, SQL->linguaggio SQL gestisce i duplicati ( select e select distinct ), algebra no (basata su insiemi) select * from Impiegati ordered by [asc|desc] Matricola Operatori aggregati Interrogazioni nidificate per ordinare le tuple

6 6 Tabella “Impiegato” NomeCognomeDipartUfficioStipendioCittà MarioRossiAmministr1015Milano CarloBianchiProd2012Torino GiuseppeVerdiAmministr2013Roma FrancoNeriDistrib1615Napoli CarloRossiDirezione1427Milano LorenzoLanziDirezione721Genova PaolaBurroniAmmistr7513Venezia MarcoFrancoProd2014Roma Impiegato

7 7 Tabella “Dipartimento” NomeIndirizzoCittà AmministrVia Tito Livio 27 Milano ProdP.le Lavater 3Torino DistribVia Segre 9Roma DirezioneVia Tito Livio 27 Milano RicercaVia Morone 6Milano Dipartimento

8 8 Operatori aggregati Algebra relazionale: tutte le condizioni sono valutate su una tupla alla volta, in modo indipendente SQL offre degli operatori che lavorano su più di una tupla alla volta: count,sum,max,min,avg

9 9 Interrogazione 12 select count(*) from Impiegato where Dipart = ‘Prod’ count( ) valori diversi tra loro non null

10 10 Interrogazioni 13, 14 Numero di stipendi diversi select count(distinct Stipendio) from Impiegato Numero di righe che hanno nome non nullo select count(all Nome) from Impiegato Gli operatori aggregati si applicano sulle tuple selezionate dalla clausola “where” (se c’è) count( )

11 11 sum, max, min, avg Prendono 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)

12 12 Interrogazioni 15, 16 Somma stipendi di Amministrazione select sum(Stipendio) from Impiegato where Dipart = ‘Amministr’ Stipendi min, max, medio degli Impiegati select min(Stipendio),max(Stipendio),avg(Stipendio) from Impiegato

13 13 Interrogazione 17 Max stipendio tra impiegati che lavorano in dip a Milano select max(Stipendio) from Impiegato, Dipartimento where Dipart = NomeDip and Citta = ‘Milano’ Equi- join

14 14 Interrogazione non corretta select Cognome, Nome, max(Stipendio) from Impiegato, Dipartimento where Dipart = NomeDip and Citta = ‘Milano’ Perché è scorretta? Ha senso con group by…

15 15 Interrogazione 18 Estrarre la somma degli stipendi di tutti gli impiegati dello stesso dipartimento select Dipart, sum(Stipendio) from Impiegato group by Dipart

16 16 Interrogazione 18 (cont.) E` come se prima si facesse la query select Dipart, Stipendio from Impiegato ottenendo la tabella…

17 17 Interrogazione 18 (cont.) DipartStipendio Amministrazione Produzione Amministrazione Distribuzione Direzione Direzione Amministrazione Produzione23.000

18 18 Interrogazione 18 (cont.) Poi le tuple si raggruppano in sottoinsiemi in base allo stesso valore dell’attributo Dipart DipartStipendio Amministrazione Amministrazione Amministrazione Produzione Produzione Distribuzione Direzione Direzione36.500

19 19 Interrogazione 18 (cont.) Poi le tuple si raggruppano in sottoinsiemi in base allo stesso valore dell’attributo Dipart DipartStipendio Amministrazione Amministrazione Amministrazione Produzione Produzione Distribuzione Direzione Direzione36.500

20 20 Interrogazione 18 (cont.) Infine l’operatore sum viene applicato separatamente a ogni sottoinsieme Dipartsum(Stipendio) Amministrazione125 Produzione82 Distribuzione45 Direzione153

21 21 Interrogazione non corretta select Ufficio from Impiegato group by Dipart Perché?

22 22 Interrogazione non corretta select Ufficio from Impiegato group by Dipart 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

23 23 Interrogazione 19 Dipartimenti, il numero di impiegati di ciascun dipart, e la città sede del dipart select Dipart, count(*), D.citta from Impiegato I, Dipartimento D where I.Dipart=D.Nome group by Dipart  scorretta!

24 24 Interrogazione 19 select Dipart, count(*), D.Citta from Impiegato I, Dipartimento D where I.Dipart=D.Nome group by Dipart, Citta  corretta!

25 25 Predicati sui gruppi group by : le tuple vengono raggruppate in sottoinsiemi Si può voler considerare solo sottoinsiemi che soddisfano una certa condizione Sulle singole righe: clausola “where” Se condizioni di tipo aggregato: clausola having: ogni sottoinsieme di tuple della group by viene selezionato se il predicato di having è soddisfatto

26 26 Interrogazione 20 Dipartimenti che spendono più di 100 milioni in stipendi select Dipart, sum(Stipendi) as SommaStip from Impiegato group by Dipart having sum(Stipendio) > 100

27 27 Predicati sui gruppi Consigli di buon uso Meglio usare having con group by  Senza group by: l’intero insieme di righe è trattato come un unico raggruppamento  Se la condizione non è soddisfatta il risultato sarà vuoto Solo predicati in cui ci sono operatori aggregati nella clausola having

28 28 Interrogazione 21 Dipartimenti per cui la media degli stipendi degli impiegati che lavorano nell’ufficio 20 è > di 25 milioni select Dipart from Impiegato where Ufficio = 20 group by Dipart having avg(Stipendio) > 25

29 29 Interrogazioni in SQL La forma sintetica generale di un’interrogazione SQL diventa: SelectSQL ::= select ListaAttributiOEspressioni from ListaTabelle [ where CondizioniSemplici ] [ group by ListaAttributiDiRaggrupamento ] [ having CondizioniAggregate ] [ order by ListaAttributiDiOrdinamento ]

30 30 Interrogazioni di tipo insiemistico union (unione), intersect (intersezione) ed except (differenza) Assumono come default di eseguire una eliminazione di dupilicati L’eliminazione dei duplicati rispetta meglio il tipico significato delle operatori insiemistici Per preservare i duplicati: usare l’operatore con la parola chiave all

31 31 Interrogazioni di tipo insiemistico La sintassi per l’uso degli operatori insiemistici: SelectSQL { [all] SelectSQL }

32 32 Interrogazioni di tipo insiemistico SQL non richiede che gli schemi su cui vengono effettuate le operazioni insiemistiche siano identiche Solo che gli attributi siano in pari numero e che abbiano domini compatibili La corrispondenza tra gli attributi non si basa sul nome ma sulla posizione degli attributi Se gli attributi hanno nome diverso, il risultato normalmente usa i nomi del primo operando

33 33 Interrogazione 22 (insiemistiche) Nomi e cognomi degli impiegati (notare: non serve che gli attributi abbiano lo stesso nome, ma solo lo stesso “tipo”, per esempio stringa) select Nome from Impiegato union select Cognome from Impiegato L’unione non si può simulare

34 34 Interrogazione 22 (insiemistiche) select Nome from Impiegato union select Cognome from Impiegato Nome Mario Carlo Giuseppe Franco Lorenzo Paola Marco Rossi Bianchi Verdi Neri Lanzi Borroni

35 35 Interrogazione 23 (insiemistiche) Nomi e cognomi degli impiegati mantenendo i duplicati select Nome from Impiegato union all select Cognome from Impiegato Nome Carlo Franco Carlo Lorenzo Marco Bianchi Neri Rossi Lanzi Franco

36 36 Interrogazione 24 (insiemistiche) Cognomi che sono anche nomi select Nome from Impiegato intersect select Cognome from Impiegato Nome Franco

37 37 Interrogazione 25 (insiemistiche) Nomi che non sono cognomi select Nome from Impiegato except select Cognome from Impiegato Nome Mario Carlo Giuseppe Lorenzo Paola Marco

38 38 Join esplicito Abbiamo visto un modo di fare il join mettendo le condizioni di join nella clausola where Si può utilizzare esplicitamente un operatore di join

39 39 Interrogazione 26 (join esplicito) select Impiegato.Nome, Cognome, Dipartimento.Città from Impiegato,Dipartimento where Dipart = Dipartimento.Nome select Impiegato.Nome,Cognome, Dipartimento.Città from Impiegato join Dipartimento On (Dipart =Dipartimento.Nome)

40 40 Interrogazione 27 (join esplicito riprende la 11) Estrarre il nome e lo stipendio dei capi degli impiegati che guadagnano piú dei loro capi select I1.Nome, I1.Stipendio from Impiegato I1, Impiegato I2, Supervisione where I1.Matricola = Capo and I2.Matricola = Impiegato and I2.Stipendio > I1.Stipendio select I1.Nome, I1.Stipendio from (Impiegato I1 join Supervisione on (I1.Matricola = Capo)) join Impiegato I2 on (I2.Matricola = Impiegato) where I2.Stipendio > I1.Stipendio

41 41 Outer join Fino ad adesso abbiamo visto inner join Parliamo adesso di outer join 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

42 42 Tabelle “Guidatore” e “Automobile” NomeCognomeNumPatente Mario Carlo Marco Rossi Bianchi Neri VR Y PZ B AP R TargaMarcaModelloNumPatente AB 574 WW AA 652 FF BJ 747 XX BB 421 JJ Fiat Lancia Fiat Punto Brava Delta Uno VR Y PZ B MI U

43 43 Inner join (“normale”) select Nome,Cognome,Guidatore.NumPatente, Targa from Guidatore join Automobile on (Guidatore.NumPatente=Automobile.NumPatente) NomeCognomeNumPatenteTargaMarcaModello Mario Carlo Rossi Bianchi VR Y PZ B AB 574 WW AA 652 FF BJ 747 XX Fiat Lancia Punto Brava Delta Join non completo

44 44 Outer left join (interrogazione 28) select Nome,Cognome,Guidatore.NumPatente, Targa from Guidatore left join Automobile on (Guidatore.NumPatente=Automobile.NumPatente) NomeCognomeNumPatenteTargaMarcaModello Mario Carlo Marco Rossi Bianchi Neri VR Y PZ B AP R AB 574 WW AA 652 FF BJ 747 XX null Fiat Lancia null Punto Brava Delta null

45 45 Outer right join (interrogazione 29) select Nome,Cognome,Guidatore.NumPatente, Targa from Guidatore right join Automobile on (Guidatore.NumPatente=Automobile.NumPatente) NomeCognomeNumPatenteTargaMarcaModello Mario Carlo null Rossi Bianchi null VR Y PZ B null AB 574 WW AA 652 FF BJ 747 XX BB 421 JJ Fiat Lancia Fiat Punto Brava Delta Uno

46 46 Outer full join (interrogazione 30) select Nome,Cognome,Guidatore.NumPatente, Targa from Guidatore full join Automobile on (Guidatore.NumPatente=Automobile.NumPatente) NomeCognomeNumPatenteTargaMarcaModello Mario Carlo Marco null Rossi Bianchi Neri null VR Y PZ B AP R null AB 574 WW AA 652 FF BJ 747 XX null BB 421 JJ Fiat Lancia null Fiat Punto Brava Delta null Uno

47 47 Join naturale (interrogazione 31) select Nome,Cognome,Guidatore.NumPatente, Targa from Guidatore natural join Automobile NomeCognomeNumPatenteTargaMarcaModello Mario Carlo Rossi Bianchi VR Y PZ B AB 574 WW AA 652 FF BJ 747 XX Fiat Lancia Punto Brava Delta Attributo comune: NumPatente

48 48 Interrogazioni nidificate Clausola “where” su predicati logici in cui le componenti sono confronti tra valori Possibile anche confrontare valori con il risultato di una query (query annidata) Di solito prima si esegue la query più interna, ma ci sono eccezioni (per esempio, passaggio di binding)

49 49 Interrogazioni nidificate Parole chiave all e any : any : specifica che la riga soddisfa la condizione se risulta vero il confronto tra il valore dell’attributo per la riga ed almeno uno degli elementi restituiti dall’interrogazione all : specifica che la riga soddisfa la condizione solo se tutti gli elementi restituiti dall’interrogazione nidificata rendono vero il confronto

50 50 Interrogazione 32 Tutti i dati degli impiegati che lavorano in dipartimenti in Firenze select * from Impiegato where Dipart = any (select Nome from Dipartimento where Citta = ‘Firenze’) = any corrisponde a in

51 51 Interrogazione 33 (simile alla 10) Impiegati che hanno lo stesso nome di impiegati del dip di Produzione select I1.Nome from Impiegato I1, Impiegato I2 where I1.Nome = I2.Nome and I2.Dipart = ‘Produzione’ select Nome from Impiegato where Nome = any (select Nome from Impiegato where Dipart = ‘Produzione’)

52 52 Interrogazione 34 Dipartimenti in cui non lavorano persone con cognome ‘Rossi’ select Nome from Dipartimento where Nome <> all (select Dipart from Impiegato where Cognome = ‘Rossi’) select Nome from Dipartimento except select Dipart from Impiegato where Cognome = ‘Rossi’ “diverso da” <> all corrisponde a not in

53 53 Interrogazione 35 Dipartimento dell’impiegato che guadagna lo stipendio massimo select Dipart from Impiegato where Stipendio = (select max(Stipendio) from Impiegato) select Dipart from Impiegato where Stipendio >= all (select Stipendio from Impiegato) Un solo valore da confrontare Le due interrogazioni sono equivalenti


Scaricare ppt "SQL (II) Interrogazioni (parte 2). 2 Notazione Le parentesi angolari : permettono di isolare un termine della sintassi Le parentesi quadre [,]: indicano."

Presentazioni simili


Annunci Google