SQL (II) Interrogazioni (parte 2). 2 Notazione Le parentesi angolari : permettono di isolare un...

Post on 03-May-2015

227 views 0 download

Transcript of SQL (II) Interrogazioni (parte 2). 2 Notazione Le parentesi angolari : permettono di isolare un...

SQL (II)

Interrogazioni (parte 2)

2

Notazione

Le parentesi angolari <,>: permettono di isolare un termine della sintassiLe parentesi quadre [,]: indicano che il termine all’interno è opzionale Può non comparire o comparire una

sola volta

3

Notazione

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

4

Interpretazione algebrica delle interrogazioni SQL

select T1.Attrib_11,…,Th.Attrib_hmfrom Tabella1 as T1,…,Tabellan as Tnwhere 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

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 aggregatiInterrogazioni nidificate

per ordinare le tuple

6

Tabella “Impiegato”

Nome Cognome

Dipart Ufficio

Stipendio

Città

Mario Rossi Amministr

10 15 Milano

Carlo Bianchi Prod 20 12 Torino

Giuseppe

Verdi Amministr

20 13 Roma

Franco Neri Distrib 16 15 Napoli

Carlo Rossi Direzione

14 27 Milano

Lorenzo Lanzi Direzione

7 21 Genova

Paola Burroni Ammistr 75 13 Venezia

Marco Franco Prod 20 14 Roma

Impiegato

7

Tabella “Dipartimento”

Nome Indirizzo Città

Amministr

Via Tito Livio 27

Milano

Prod P.le Lavater 3 Torino

Distrib Via Segre 9 Roma

Direzione

Via Tito Livio 27

Milano

Ricerca Via Morone 6 Milano

Dipartimento

8

Operatori aggregati

Algebra relazionale: tutte le condizioni sono valutate su una tupla alla volta, in modo indipendenteSQL offre degli operatori che lavorano su più di una tupla alla volta:

count,sum,max,min,avg

9

Interrogazione 12select count(*)from Impiegatowhere Dipart = ‘Prod’

count(<*|[distinct|all|]ListaAttributi>)

valori diversi tra loro

non null

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 selezionatedalla clausola “where” (se c’è)

count(<*|[distinct|all|]ListaAttributi>)

11

sum, max, min, avg

Prendono solo espressioni rappresentanti valori numerici o intervalli di tempodistinct e all stesso significato di primaAltri operatori a seconda delle versioni di SQL (solitamente operatori statistici)

12

Interrogazioni 15, 16Somma stipendi di Amministrazione

select sum(Stipendio)from Impiegatowhere Dipart = ‘Amministr’

Stipendi min, max, medio degli Impiegati

select min(Stipendio),max(Stipendio),avg(Stipendio)from Impiegato

13

Interrogazione 17

Max stipendio tra impiegati che lavorano in dip a Milano

select max(Stipendio)from Impiegato, Dipartimentowhere Dipart = NomeDip and Citta = ‘Milano’

Equi-join

14

Interrogazione non corretta

select Cognome, Nome, max(Stipendio)from Impiegato, Dipartimentowhere Dipart = NomeDip and Citta = ‘Milano’

Perché è scorretta?

Ha senso con group by…

15

Interrogazione 18Estrarre la somma degli stipendi di tutti gli impiegati dello stesso dipartimento

select Dipart, sum(Stipendio)from Impiegatogroup by Dipart

16

Interrogazione 18 (cont.)E` come se prima si facesse la query

select Dipart, Stipendiofrom Impiegato

ottenendo la tabella…

17

Interrogazione 18 (cont.)

Dipart Stipendio

Amministrazione 22.500

Produzione 18.000

Amministrazione 20.000

Distribuzione 22.500

Direzione 40.000

Direzione 36.500

Amministrazione 20.000

Produzione 23.000

18

Interrogazione 18 (cont.)

Poi le tuple si raggruppano in sottoinsiemi in base allo stesso valore dell’attributo Dipart

Dipart Stipendio

Amministrazione 22.500

Amministrazione 20.000

Amministrazione 20.000

Produzione 18.000

Produzione 23.000

Distribuzione 22.500

Direzione 40.000

Direzione 36.500

19

Interrogazione 18 (cont.)

Poi le tuple si raggruppano in sottoinsiemi in base allo stesso valore dell’attributo Dipart

Dipart Stipendio

Amministrazione 22.500

Amministrazione 20.000

Amministrazione 20.000

Produzione 18.000

Produzione 23.000

Distribuzione 22.500

Direzione 40.000

Direzione 36.500

20

Interrogazione 18 (cont.)

Infine l’operatore sum viene applicato separatamente a ogni sottoinsieme

Dipart sum(Stipendio)

Amministrazione 125

Produzione 82

Distribuzione 45

Direzione 153

21

Interrogazione non corretta

select Ufficiofrom Impiegatogroup by Dipart

Perché?

22

Interrogazione non corretta

select Ufficiofrom Impiegatogroup 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

Interrogazione 19

Dipartimenti, il numero di impiegati di ciascun dipart,e la città sede del dipart

select Dipart, count(*), D.cittafrom Impiegato I, Dipartimento Dwhere I.Dipart=D.Nomegroup by Dipart

scorretta!

24

Interrogazione 19

select Dipart, count(*), D.Cittafrom Impiegato I, Dipartimento Dwhere I.Dipart=D.Nomegroup by Dipart, Citta

corretta!

25

Predicati sui gruppi

group by: le tuple vengono raggruppate in sottoinsiemiSi può voler considerare solo sottoinsiemi che soddisfano una certa condizioneSulle 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

Interrogazione 20Dipartimenti che spendono più di 100 milioni in stipendi

select Dipart, sum(Stipendi) as SommaStipfrom Impiegatogroup by Diparthaving sum(Stipendio) > 100

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

Interrogazione 21

Dipartimenti per cui la media degli stipendi degli impiegatiche lavorano nell’ufficio 20 è > di 25 milioni

select Dipartfrom Impiegatowhere Ufficio = 20group by Diparthaving avg(Stipendio) > 25

29

Interrogazioni in SQL

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

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

Interrogazioni di tipo insiemistico

La sintassi per l’uso degli operatori insiemistici:

SelectSQL {<union|intersect|except> [all] SelectSQL }

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

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 Nomefrom Impiegato unionselect Cognomefrom Impiegato

L’unione non si può

simulare

34

Interrogazione 22 (insiemistiche)

select Nomefrom Impiegato unionselect Cognomefrom Impiegato

Nome

Mario

Carlo

Giuseppe

Franco

Lorenzo

Paola

Marco

Rossi

Bianchi

Verdi

Neri

Lanzi

Borroni

35

Interrogazione 23 (insiemistiche)Nomi e cognomi degli impiegati mantenendo i duplicati

select Nomefrom Impiegato union allselect Cognomefrom Impiegato

Nome

Carlo

Franco

Carlo

Lorenzo

Marco

Bianchi

Neri

Rossi

Lanzi

Franco

36

Interrogazione 24 (insiemistiche)

Cognomi che sono anche nomi

select Nomefrom Impiegato intersectselect Cognomefrom Impiegato

Nome

Franco

37

Interrogazione 25 (insiemistiche)

Nomi che non sono cognomi

select Nomefrom Impiegato exceptselect Cognomefrom Impiegato

Nome

Mario

Carlo

Giuseppe

Lorenzo

Paola

Marco

38

Join esplicito

Abbiamo visto un modo di fare il join mettendo le condizioni di join nella clausola whereSi può utilizzare esplicitamente un operatore di join

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

Interrogazione 27 (join esplicito riprende la 11)

Estrarre il nome e lo stipendio dei capi degliimpiegati che guadagnano piú dei loro capi

select I1.Nome, I1.Stipendiofrom Impiegato I1, Impiegato I2, Supervisionewhere I1.Matricola = Capo and I2.Matricola = Impiegato and I2.Stipendio > I1.Stipendio

select I1.Nome, I1.Stipendiofrom (Impiegato I1 join Supervisione on (I1.Matricola = Capo)) join Impiegato I2 on (I2.Matricola = Impiegato)where I2.Stipendio > I1.Stipendio

41

Outer join

Fino ad adesso abbiamo visto inner joinParliamo adesso di outer joinServe 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

Tabelle “Guidatore” e “Automobile”

Nome Cognome NumPatente

MarioCarloMarco

RossiBianchiNeri

VR 2030020YPZ 1012436BAP 4544442R

Targa Marca Modello NumPatente

AB 574 WWAA 652 FFBJ 747 XXBB 421 JJ

FiatFiatLanciaFiat

PuntoBravaDeltaUno

VR 2030020YVR 2030020YPZ 1012436BMI 2020030U

43

Inner join (“normale”)

select Nome,Cognome,Guidatore.NumPatente, Targafrom Guidatore join Automobile on (Guidatore.NumPatente=Automobile.NumPatente)

Nome

Cognome

NumPatente

Targa Marca

Modello

MarioMarioCarlo

RossiRossiBianchi

VR 2030020YVR 2030020YPZ 1012436B

AB 574 WWAA 652 FFBJ 747 XX

FiatFiatLancia

PuntoBravaDelta

Join non completo

44

Outer left join (interrogazione 28)

select Nome,Cognome,Guidatore.NumPatente, Targafrom Guidatore left join Automobile on (Guidatore.NumPatente=Automobile.NumPatente)

Nome

Cognome

NumPatente

Targa Marca

Modello

MarioMarioCarloMarco

RossiRossiBianchiNeri

VR 2030020YVR 2030020YPZ 1012436BAP 4544442R

AB 574 WWAA 652 FFBJ 747 XXnull

FiatFiatLancianull

PuntoBravaDeltanull

45

Outer right join (interrogazione 29)

select Nome,Cognome,Guidatore.NumPatente, Targafrom Guidatore right join Automobile on (Guidatore.NumPatente=Automobile.NumPatente)

Nome

Cognome

NumPatente

Targa Marca

Modello

MarioMarioCarlonull

RossiRossiBianchinull

VR 2030020YVR 2030020YPZ 1012436Bnull

AB 574 WWAA 652 FFBJ 747 XXBB 421 JJ

FiatFiatLanciaFiat

PuntoBravaDeltaUno

46

Outer full join (interrogazione 30)

select Nome,Cognome,Guidatore.NumPatente, Targafrom Guidatore full join Automobile on (Guidatore.NumPatente=Automobile.NumPatente)

Nome

Cognome

NumPatente

Targa Marca

Modello

MarioMarioCarloMarconull

RossiRossiBianchiNerinull

VR 2030020YVR 2030020YPZ 1012436BAP 4544442Rnull

AB 574 WWAA 652 FFBJ 747 XXnullBB 421 JJ

FiatFiatLancianullFiat

PuntoBravaDeltanullUno

47

Join naturale (interrogazione 31)

select Nome,Cognome,Guidatore.NumPatente, Targafrom Guidatore natural join Automobile

Nome

Cognome

NumPatente

Targa Marca

Modello

MarioMarioCarlo

RossiRossiBianchi

VR 2030020YVR 2030020YPZ 1012436B

AB 574 WWAA 652 FFBJ 747 XX

FiatFiatLancia

PuntoBravaDelta

Attributo comune: NumPatente

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

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

Interrogazione 32

Tutti i dati degli impiegati che lavorano in dipartimenti in Firenze

select *from Impiegatowhere Dipart = any (select Nome from Dipartimento where Citta = ‘Firenze’)

= any corrisponde a in

51

Interrogazione 33 (simile alla 10)

Impiegati che hanno lo stesso nome di impiegati del dip di Produzione

select I1.Nomefrom Impiegato I1, Impiegato I2where I1.Nome = I2.Nome and I2.Dipart = ‘Produzione’

select Nomefrom Impiegatowhere Nome = any (select Nome from Impiegato where Dipart = ‘Produzione’)

52

Interrogazione 34Dipartimenti in cui non lavorano persone con cognome ‘Rossi’

select Nomefrom Dipartimentowhere Nome <> all (select Dipart from Impiegato where Cognome = ‘Rossi’)

select Nomefrom Dipartimentoexcept select Dipartfrom Impiegatowhere Cognome = ‘Rossi’

“diverso da”

<> all corrisponde a not in

53

Interrogazione 35Dipartimento dell’impiegato che guadagna lo stipendio massimo

select Dipartfrom Impiegatowhere Stipendio = (select max(Stipendio) from Impiegato)

select Dipartfrom Impiegatowhere Stipendio >= all (select Stipendio from Impiegato)

Un solo valore da confrontar

e

Le due interrogazioni sono equivalenti