SQL. Il nome sta per Structured Query Language Le interrogazioni SQL sono dichiarative –lutente...

78
SQL

Transcript of SQL. Il nome sta per Structured Query Language Le interrogazioni SQL sono dichiarative –lutente...

Page 1: SQL. Il nome sta per Structured Query Language Le interrogazioni SQL sono dichiarative –lutente specifica quale informazione è di suo interesse, ma non.

SQL

Page 2: SQL. Il nome sta per Structured Query Language Le interrogazioni SQL sono dichiarative –lutente specifica quale informazione è di suo interesse, ma non.

SQL

• Il nome sta per Structured Query Language• Le interrogazioni SQL sono dichiarative

– l’utente specifica quale informazione è di suo interesse, ma non come estrarla dai dati

• Le interrogazioni vengono tradotte dall’ottimizzatore (query optimizer) nel linguaggio procedurale interno al DBMS

• Il programmatore si focalizza sulla leggibilità, non sull’efficienza

• È l'aspetto più qualificante delle basi di dati relazionali

Page 3: SQL. Il nome sta per Structured Query Language Le interrogazioni SQL sono dichiarative –lutente specifica quale informazione è di suo interesse, ma non.

Definizione di tabelle

• Una tabella SQL consiste di:– un insieme ordinato di attributi

– un insieme di vincoli (eventualmente vuoto)

• Comando create table– definisce lo schema di una relazione, creandone un’istanza vuota

create table Studente( Matr character(6) primary key, Nome varchar(30) not null, Città varchar(20), CDip char(3) )

Page 4: SQL. Il nome sta per Structured Query Language Le interrogazioni SQL sono dichiarative –lutente specifica quale informazione è di suo interesse, ma non.

Vincoli intra-relazionali

• I vincoli sono condizioni che devono essere verificate da ogni istanza della base di dati

• I vincoli intra-relazionali coinvolgono una sola relazione (distinguibili ulteriormente a livello di tupla o di tabella)– not null (su un solo attributo; a livello di tupla)– unique: permette la definizione di chiavi candidate (opera quindi a livello

di tabella); sintassi:• per un solo attributo:

unique, dopo il dominio• per diversi attributi:

unique( Attributo {, Attributo } )– primary key: definisce la chiave primaria (una volta per ogni tabella;

implica not null); sintassi come per unique– check: può rappresentare vincoli di ogni tipo

Page 5: SQL. Il nome sta per Structured Query Language Le interrogazioni SQL sono dichiarative –lutente specifica quale informazione è di suo interesse, ma non.

Integrità referenzialeIntegrità referenziale

• Esprime un legame gerarchico (padre-figlio)Esprime un legame gerarchico (padre-figlio) fra tabellefra tabelle

• Alcuni attributi della tabella figlio sono Alcuni attributi della tabella figlio sono definiti FOREIGN KEYdefiniti FOREIGN KEY

• I valori contenuti nella FOREIGN KEY I valori contenuti nella FOREIGN KEY devono essere sempre presenti nella devono essere sempre presenti nella tabella padretabella padre

Page 6: SQL. Il nome sta per Structured Query Language Le interrogazioni SQL sono dichiarative –lutente specifica quale informazione è di suo interesse, ma non.

Una istanza scorretta

MatrMatr

123123

415415

702702

NomeNome CittàCittà CDipCDip

MatrMatr

123123

123123

123123

702702

702702

714714

CodCodCorsoCorso

11

22

22

22

11

11

DataData

7-9-977-9-97

8-1-988-1-98

1-8-971-8-97

7-9-977-9-97

NULLNULL

7-9-977-9-97

VotoVoto

3030

2828

2828

2020

NULLNULL

2828

EsameEsame

viola la chiaveviola la chiave

viola il NULLviola il NULL

viola la integrità referenzialeviola la integrità referenziale

Page 7: SQL. Il nome sta per Structured Query Language Le interrogazioni SQL sono dichiarative –lutente specifica quale informazione è di suo interesse, ma non.

Interrogazioni SQL• Le interrogazioni SQL hanno una struttura select-from-where• Sintassi:

select AttrEspr {, AttrEspr}from Tabella {, Tabella}[ where Condizione ]

• Le tre parti della query sono chiamate:– clausola select / target list– clausola from– clausola where

• La query effettua il prodotto cartesiano delle tabelle nella clausola from, considera solo le righe che soddisfano la condizione nella clausola where e per ogni riga valuta le espressioni nella select

• Sintassi completa:select AttrEspr [[ as ] Alias ] {, AttrEspr [[ as ]

Alias ] }from Tabella [[ as ] Alias ] {, Tabella [[ as ] Alias ] }[ where Condizione ]

Page 8: SQL. Il nome sta per Structured Query Language Le interrogazioni SQL sono dichiarative –lutente specifica quale informazione è di suo interesse, ma non.

Esempio:gestione degli esami universitari

StudenteStudente

MATRMATR

123123

415415

702702

NOMENOME

CarloCarlo

AlexAlex

AntonioAntonio

CITTA’CITTA’

BolognaBologna

TorinoTorino

RomaRoma

CDIPCDIP

InfInf

InfInf

LogLog

EsameEsameMATRMATR

123123

123123

702702

COD- COD- CORSOCORSO

11

22

22

DATADATA

7-9-977-9-97

8-1-988-1-98

7-9-977-9-97

VOTOVOTO

3030

2828

2020

CorsoCorsoCOD- COD- CORSOCORSO

11

22

TITOLOTITOLO

matematicamatematica

informaticainformatica

DOCENTDOCENTEE

BarozziBarozzi

MeoMeo

Page 9: SQL. Il nome sta per Structured Query Language Le interrogazioni SQL sono dichiarative –lutente specifica quale informazione è di suo interesse, ma non.

9

ProiezioneProiezione

NomeNome

CarloCarlo

AlexAlex

AntonioAntonio

CDipCDip

InfInf

InfInf

LogLog

SELECT Nome, CdipSELECT Nome, Cdip

FROM STUDENTEFROM STUDENTE

è una tabella conè una tabella con• schema : schema :

gli attributi Nome e Cdip (grado <=)gli attributi Nome e Cdip (grado <=)

• istanza : istanza :

la restrizione delle tuple sugli attributi la restrizione delle tuple sugli attributi

Nome e CDip (cardinalità <=)Nome e CDip (cardinalità <=)

Page 10: SQL. Il nome sta per Structured Query Language Le interrogazioni SQL sono dichiarative –lutente specifica quale informazione è di suo interesse, ma non.

10

ProiezioneProiezione

SELECT *SELECT *

FROM STUDENTEFROM STUDENTE

Prende tutte le colonne della tabella Prende tutte le colonne della tabella STUDENTESTUDENTE

Page 11: SQL. Il nome sta per Structured Query Language Le interrogazioni SQL sono dichiarative –lutente specifica quale informazione è di suo interesse, ma non.

Duplicati

• In SQL, le tabelle prodotte dalle interrogazioni possono contenere più righe identiche tra loro

• I duplicati possono essere rimossi usando la parola chiave distinct

Select distinct CDip from Studente

select CDip from Studente

CDipCDip

InfInf

LogLog

CDipCDip

InfInf

InfInf

LogLog

Page 12: SQL. Il nome sta per Structured Query Language Le interrogazioni SQL sono dichiarative –lutente specifica quale informazione è di suo interesse, ma non.

SelezioneSelezione

SELECT * SELECT *

FROM STUDENTEFROM STUDENTE

WHERE Nome=‘Alex’WHERE Nome=‘Alex’

MatrMatr

415415

NomeNome

AlexAlex

CittàCittà

TorinoTorino

CDipCDip

InfInf

È una tabella conÈ una tabella con• schema: lo stesso schema di STUDENTE (grado =)schema: lo stesso schema di STUDENTE (grado =)• istanza: le tuple di STUDENTE che soddisfano il predicato di istanza: le tuple di STUDENTE che soddisfano il predicato di selezione (cardinalità <=)selezione (cardinalità <=)

Page 13: SQL. Il nome sta per Structured Query Language Le interrogazioni SQL sono dichiarative –lutente specifica quale informazione è di suo interesse, ma non.

Sintassi del predicato di selezioneSintassi del predicato di selezione

espressione booleana di predicati sempliciespressione booleana di predicati semplici

operazioni booleane : operazioni booleane : • AND (P1 AND P2)AND (P1 AND P2)• OR (P1 OR P2) OR (P1 OR P2) • NOT (P1)NOT (P1)

predicati semplici : predicati semplici : • TRUE, FALSE TRUE, FALSE

• termine termine comparatorecomparatore terminetermine

comparatore : comparatore : • =, <>, <, <=, >, >==, <>, <, <=, >, >=

termine : termine : • costante, attributocostante, attributo• espressione espressione

aritmetica di aritmetica di costanti e attributicostanti e attributi

Page 14: SQL. Il nome sta per Structured Query Language Le interrogazioni SQL sono dichiarative –lutente specifica quale informazione è di suo interesse, ma non.

Sintassi della clausola where• Espressione booleana di predicati semplici (come in

algebra)• Estrarre gli studenti di informatica originari di Bologna:

select *

from Studente

where CDip = ’Inf’ and Città = ’Bologna’

• Estrarre gli studenti originari di Bologna o di Torino:select *from Studentewhere Città = ’Bologna’ or Città = ’Torino’– Attenzione: estrarre gli studenti originari di Bologna e originari di

Torino

Page 15: SQL. Il nome sta per Structured Query Language Le interrogazioni SQL sono dichiarative –lutente specifica quale informazione è di suo interesse, ma non.

Espressioni booleane

• Estrarre gli studenti originari di Roma che frequentano il corso in Informatica o in Logistica:

select *from Studentewhere Città = ’Roma’ and (CDip = ’Inf’ or CDip = ’Log’)

• Risultato:

MatrMatr

702702

NomeNome

AntonioAntonio

CittàCittà

RomaRoma

CDipCDip

LogLog

Page 16: SQL. Il nome sta per Structured Query Language Le interrogazioni SQL sono dichiarative –lutente specifica quale informazione è di suo interesse, ma non.

Gestione dei valori nulli• I valori nulli rappresentano tre diverse situazioni:

– un valore non è applicabile

– un valore è applicabile ma sconosciuto

– non si sa se il valore è applicabile o meno

• Per fare una verifica sui valori nulli:Attributo is [ not ] null

select *select *from Studentefrom Studentewhere CDip = ’Inf’ or CDip <> ’Inf’where CDip = ’Inf’ or CDip <> ’Inf’

è equivalente a:è equivalente a:

select *select *from Studentefrom Studentewhere CDip is not nullwhere CDip is not null

Page 17: SQL. Il nome sta per Structured Query Language Le interrogazioni SQL sono dichiarative –lutente specifica quale informazione è di suo interesse, ma non.

17

SELECT *SELECT *

FROM STUDENTE FROM STUDENTE

WHERE (Città='Torino') OR WHERE (Città='Torino') OR (((Città='Roma') AND NOT (CDip=’Log')(Città='Roma') AND NOT (CDip=’Log')))

Esempio di selezioneEsempio di selezione

MATRMATR

123123

415415

702702

NOMENOME

CarloCarlo

AlexAlex

AntonioAntonio

CITTA’CITTA’

BolognaBologna

TorinoTorino

RomaRoma

C-DIPC-DIP

InfInf

InfInf

LogLog

Page 18: SQL. Il nome sta per Structured Query Language Le interrogazioni SQL sono dichiarative –lutente specifica quale informazione è di suo interesse, ma non.

Selezione e proiezioneSelezione e proiezione

NOMENOME

CarloCarlo

AlexAlex

• Estrarre il nome degli studenti iscritti alEstrarre il nome degli studenti iscritti al

diploma in informatica?diploma in informatica?

MatrMatr

123123

415415

702702

NomeNome

CarloCarlo

AlexAlex

AntonioAntonio

CittàCittà

BolognaBologna

TorinoTorino

RomaRoma

CDipCDip

InfInf

InfInf

LogLog

SELECT Nome SELECT Nome

FROM STUDENTE FROM STUDENTE

WHERE CDip=‘Inf’WHERE CDip=‘Inf’

Page 19: SQL. Il nome sta per Structured Query Language Le interrogazioni SQL sono dichiarative –lutente specifica quale informazione è di suo interesse, ma non.

Selezione e proiezioneSelezione e proiezione

MatrMatr

123123

415415

702702

NomeNome

CarloCarlo

AlexAlex

AntonioAntonio

CittàCittà

BolognaBologna

TorinoTorino

RomaRoma

CDipCDip

InfInf

InfInf

LogLog

• Nome degli studenti di Logistica non diNome degli studenti di Logistica non di

MilanoMilano

SELECT NOME SELECT NOME

FROM STUDENTEFROM STUDENTE

WHERE CDip=‘Log’ AND Città<>’Milano’WHERE CDip=‘Log’ AND Città<>’Milano’

NOMENOME

AntonioAntonio

Page 20: SQL. Il nome sta per Structured Query Language Le interrogazioni SQL sono dichiarative –lutente specifica quale informazione è di suo interesse, ma non.

20

Prodotto cartesianoProdotto cartesiano

R ,R , S S

è una tabella (priva di nome) conè una tabella (priva di nome) con• schema : schema :

gli attributi di R e S gli attributi di R e S (grado(RxS)= grado(R)+grado(S)) (grado(RxS)= grado(R)+grado(S))• istanza : istanza :

tutte le possibili coppie di tuple di R e tutte le possibili coppie di tuple di R e SS (card(RxS)=card(R)*card(S)) (card(RxS)=card(R)*card(S))

Page 21: SQL. Il nome sta per Structured Query Language Le interrogazioni SQL sono dichiarative –lutente specifica quale informazione è di suo interesse, ma non.

Esempio

A A

aa

bb

B B

11

33

C C

cc

bb

aa

D D

11

33

22

R(A,B) S(C,D)R(A,B) S(C,D)

A A

aa

aa

aa

bb

bb

bb

B B

11

11

11

33

33

33

C C

cc

bb

a a

cc

bb

aa

D D

11

33

22

11

33

22

R,S (A,B,C,D)R,S (A,B,C,D)

Select *

FROM R,S

Page 22: SQL. Il nome sta per Structured Query Language Le interrogazioni SQL sono dichiarative –lutente specifica quale informazione è di suo interesse, ma non.

Prodotto cartesiano con condizione Prodotto cartesiano con condizione JoinJoin

SELECT *SELECT *

FROM STUDENTE FROM STUDENTE ,, ESAME ESAME

WHERE STUDENTE.Matr=ESAME.Matr WHERE STUDENTE.Matr=ESAME.Matr

Page 23: SQL. Il nome sta per Structured Query Language Le interrogazioni SQL sono dichiarative –lutente specifica quale informazione è di suo interesse, ma non.

JoinJoin FROM STUDENTE JOIN ESAME FROM STUDENTE JOIN ESAME

ON STUDENTE.Matr=ESAME.MatrON STUDENTE.Matr=ESAME.Matr

è equivalente alla seguente espressione è equivalente alla seguente espressione (operatore derivato):(operatore derivato):

FROM STUDENTE FROM STUDENTE ,, ESAME ESAME

WHERE STUDENTE.Matr=ESAME.Matr WHERE STUDENTE.Matr=ESAME.Matr

attributi omonimi sono resi non ambigui attributi omonimi sono resi non ambigui usando la notazione “puntata”:usando la notazione “puntata”:

ESAME.MatrESAME.Matr

STUDENTE.MatrSTUDENTE.Matr

Page 24: SQL. Il nome sta per Structured Query Language Le interrogazioni SQL sono dichiarative –lutente specifica quale informazione è di suo interesse, ma non.

JoinJoin

FROM STUDENTE JOIN ESAMEFROM STUDENTE JOIN ESAME

ON STUDENTE.Matr=ESAME.MatrON STUDENTE.Matr=ESAME.Matr

STUDENTE.STUDENTE.MatrMatr

123123

123123

702702

NomeNome

CarloCarlo

CarloCarlo

AntonioAntonio

CittàCittà

BolognaBologna

BolognaBologna

RomaRoma

CDipCDip

InfInf

InfInf

LogLog

ESAME.ESAME.MatrMatr

123123

123123

702702

Cod- Cod- CorsoCorso

11

22

22

DataData

7-9-977-9-97

8-1-988-1-98

7-9-977-9-97

VotoVoto

3030

2828

2020

produce una tabella conproduce una tabella con• schema: schema: la concatenazione degli schemi di la concatenazione degli schemi di STUDENTE e ESAMESTUDENTE e ESAME• istanza: istanza: le tuple ottenute concatenando quelle tuple di le tuple ottenute concatenando quelle tuple di

STUDENTE e di ESAME che soddisfano il predicatoSTUDENTE e di ESAME che soddisfano il predicato

Page 25: SQL. Il nome sta per Structured Query Language Le interrogazioni SQL sono dichiarative –lutente specifica quale informazione è di suo interesse, ma non.

25

Sintassi del predicato di joinSintassi del predicato di join

espressione congiuntiva di predicati espressione congiuntiva di predicati

semplici:semplici:

ATTR1 comp ATTR2ATTR1 comp ATTR2

ove ATTR1 appartiene a TAB1 ove ATTR1 appartiene a TAB1

ATTR2 appartiene a TAB2ATTR2 appartiene a TAB2

comp: =, <>, <, <=, >, >=comp: =, <>, <, <=, >, >=

Page 26: SQL. Il nome sta per Structured Query Language Le interrogazioni SQL sono dichiarative –lutente specifica quale informazione è di suo interesse, ma non.

select Nome

from Studente, Esame

where Studente.Matr = Esame.Matr

and CDip = ’Log’ and Voto = 30

Interrogazione semplice con due tabelle

NOMENOME

CarloCarlo

Estrarre il nome degli studenti di “Logistica” che hanno preso almeno un 30

Page 27: SQL. Il nome sta per Structured Query Language Le interrogazioni SQL sono dichiarative –lutente specifica quale informazione è di suo interesse, ma non.

select distinct Nome

from Studente, Esame

where Studente.Matr = Esame.Matr

and CDip = ’Log’ and Voto = 30

Interrogazione semplice con due tabelle

NOMENOME

CarloCarlo

Estrarre il nome degli studenti di “Logistica” che hanno preso almeno un 30

Page 28: SQL. Il nome sta per Structured Query Language Le interrogazioni SQL sono dichiarative –lutente specifica quale informazione è di suo interesse, ma non.

select distinct Nome

from Studente, Esame

where Studente.Matr = Esame.Matr

and CDip = ’Log’ and Voto = 30

Interrogazione semplice con due tabelle

NOMENOME

CarloCarlo

Estrarre il nome degli studenti di “Logistica” che hanno preso sempre 30

Page 29: SQL. Il nome sta per Structured Query Language Le interrogazioni SQL sono dichiarative –lutente specifica quale informazione è di suo interesse, ma non.

• Estrarre il nome degli studenti di “Matematica” che hanno preso 30

select Nomeselect Nome

from Studente, Esame, Corsofrom Studente, Esame, Corso

where Studente.Matr = Esame.Matrwhere Studente.Matr = Esame.Matr

and Corso.CodCorso = Esame.CodCorsoand Corso.CodCorso = Esame.CodCorso

and Titolo = ’Matematica' and Voto = 30and Titolo = ’Matematica' and Voto = 30

Interrogazione semplice con tre tabelle

Page 30: SQL. Il nome sta per Structured Query Language Le interrogazioni SQL sono dichiarative –lutente specifica quale informazione è di suo interesse, ma non.

Join in SQL

• SQL ha una sintassi per i join, li rappresenta esplicitamente nella clausola from:

select AttrEspr {, AttrEspr}

from Tabella { [TipoJoin] join Tabella on Condizioni }

[ where AltreCondizioni ]

• TipoJoin può essere inner, right [ outer ], left [outer] oppure full [ outer ], consentendo la rappresentazione dei join esterni

Page 31: SQL. Il nome sta per Structured Query Language Le interrogazioni SQL sono dichiarative –lutente specifica quale informazione è di suo interesse, ma non.

Variabili in SQL

Page 32: SQL. Il nome sta per Structured Query Language Le interrogazioni SQL sono dichiarative –lutente specifica quale informazione è di suo interesse, ma non.

Interrogazione semplice convariabili relazionali

ImpiegatoImpiegato

MatrMatr

11

22

33

NomeNome

PieroPiero

GiorgioGiorgio

GiovanniGiovanni

DataAssDataAss

1-1-951-1-95

1-1-971-1-97

1-7-961-7-96

SalarioSalario

3 M3 M

2,5 M2,5 M

2 M2 M

MatrMgrMatrMgr

22

nullnull

2 2

Chi sono i dipendenti di Giorgio?

Page 33: SQL. Il nome sta per Structured Query Language Le interrogazioni SQL sono dichiarative –lutente specifica quale informazione è di suo interesse, ma non.

Chi sono i dipendenti di Giorgio?

select select XX.Nome,.Nome,XX.MatrMgr,.MatrMgr,YY.Matr,.Matr,YY.Nome.Nome

from from Impiegato as XImpiegato as X, , Impiegato as YImpiegato as Y

where where XX.MatrMgr = .MatrMgr = YY.Matr.Matr

and and YY.Nome = ’Giorgio’.Nome = ’Giorgio’

X.MatrMgrX.MatrMgr

22

22

X.NomeX.Nome

PieroPiero

GiovanniGiovanni

Y.NomeY.Nome

GiorgioGiorgio

GiorgioGiorgio

Y.MatrY.Matr

22

22

Page 34: SQL. Il nome sta per Structured Query Language Le interrogazioni SQL sono dichiarative –lutente specifica quale informazione è di suo interesse, ma non.

Ordinamento

• La clausola order by, che compare in coda all’interrogazione, ordina le righe del risultato

• Sintassi:order by AttributoOrdinamento [ asc | desc ]

{, AttributoOrdinamento [ asc | desc ] }

• Le condizioni di ordinamento vengono valutate in ordine– a pari valore del primo attributo, si considera l’ordinamento sul

secondo, e così via

Page 35: SQL. Il nome sta per Structured Query Language Le interrogazioni SQL sono dichiarative –lutente specifica quale informazione è di suo interesse, ma non.

Query con ordinamento

select *select *from Ordinefrom Ordinewhere Importo > 100.000where Importo > 100.000order by Dataorder by Data

CODORDCODORD

11

44

55

22

33

66

CODCLICODCLI

33

11

11

44

33

33

DATADATA

1-6-971-6-97

1-7-971-7-97

1-8-971-8-97

3-8-973-8-97

1-9-971-9-97

3-9-973-9-97

IMPORTOIMPORTO

50.000.00050.000.000

12.000.00012.000.000

1.500.0001.500.000

8.000.0008.000.000

1.500.0001.500.000

5.500.0005.500.000

Page 36: SQL. Il nome sta per Structured Query Language Le interrogazioni SQL sono dichiarative –lutente specifica quale informazione è di suo interesse, ma non.

order by CodCliorder by CodCli

CODORDCODORD

44

55

11

66

33

22

CODCLICODCLI

11

11

33

33

33

44

DATADATA

1-7-971-7-97

1-8-971-8-97

1-6-971-6-97

3-9-973-9-97

1-9-971-9-97

3-8-973-8-97

IMPORTOIMPORTO

12.000.00012.000.000

1.500.0001.500.000

50.000.00050.000.000

5.500.0005.500.000

1.500.0001.500.000

27.000.00027.000.000

Page 37: SQL. Il nome sta per Structured Query Language Le interrogazioni SQL sono dichiarative –lutente specifica quale informazione è di suo interesse, ma non.

order by CodCli asc, Data descorder by CodCli asc, Data desc

CODORDCODORD

55

44

66

33

11

22

CODCLICODCLI

11

11

33

33

33

44

DATADATA

1-8-971-8-97

1-7-971-7-97

3-9-973-9-97

1-9-971-9-97

1-6-971-6-97

3-8-973-8-97

IMPORTOIMPORTO

1.500.0001.500.000

12.000.00012.000.000

5.500.0005.500.000

1.500.0001.500.000

50.000.00050.000.000

27.000.00027.000.000

Page 38: SQL. Il nome sta per Structured Query Language Le interrogazioni SQL sono dichiarative –lutente specifica quale informazione è di suo interesse, ma non.

Funzioni aggregate

• Il risultato di una query con funzioni aggregate dipende dalla valutazione del contenuto di un insieme di righe

• Cinque operatori aggregati: – count cardinalità– sum sommatoria– max massimo– min minimo– avg media

Page 39: SQL. Il nome sta per Structured Query Language Le interrogazioni SQL sono dichiarative –lutente specifica quale informazione è di suo interesse, ma non.

Operatore count

• count restituisce il numero di righe o valori distinti; sintassi:

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

• Estrarre il numero di ordini:select count(*)from Ordine

• Estrarre il numero di valori distinti dell’attributo CodCli per tutte le righe di Ordine:

select count(distinct CodCli)from Ordine

• Estrarre il numero di righe di Ordine che posseggono un valore non nullo per l’attributo CodCli:

select count(all CodCli)from Ordine

Page 40: SQL. Il nome sta per Structured Query Language Le interrogazioni SQL sono dichiarative –lutente specifica quale informazione è di suo interesse, ma non.

sum, max, min, avg

• Sintassi:< sum | max | min | avg > ([ distinct | all ] AttrEspr )

• L’opzione distinct considera una sola volta ciascun valore– utile solo per le funzioni sum e avg

• L’opzione all considera tutti i valori diversi da null

Page 41: SQL. Il nome sta per Structured Query Language Le interrogazioni SQL sono dichiarative –lutente specifica quale informazione è di suo interesse, ma non.

Query con massimo

MaxImpMaxImp

50.000.00050.000.000

• Estrarre l’importo massimo degli ordiniEstrarre l’importo massimo degli ordini

select max(Importo) as MaxImpselect max(Importo) as MaxImp

from Ordinefrom Ordine

Page 42: SQL. Il nome sta per Structured Query Language Le interrogazioni SQL sono dichiarative –lutente specifica quale informazione è di suo interesse, ma non.

Query con sommatoria

SommaImpSommaImp

13.500.00013.500.000

• Estrarre la somma degli importi degli ordini relativi al Estrarre la somma degli importi degli ordini relativi al cliente numero 1cliente numero 1

select sum(Importo) as SommaImp

from Ordine

where CodCliente = 1

Page 43: SQL. Il nome sta per Structured Query Language Le interrogazioni SQL sono dichiarative –lutente specifica quale informazione è di suo interesse, ma non.

Funzioni aggregate con join

• Estrarre l’ordine massimo tra quelli contenenti il prodotto con codice ‘ABC’ :

select max(Importo) as MaxImportoABCfrom Ordine, Dettagliowhere Ordine.CodOrd = Dettaglio.CodOrd and CodProd = ’ABC’

Page 44: SQL. Il nome sta per Structured Query Language Le interrogazioni SQL sono dichiarative –lutente specifica quale informazione è di suo interesse, ma non.

Funzioni aggregate e target list

• Query scorretta:select Data, max(Importo)from Ordine, Dettagliowhere Ordine.CodOrd = Dettaglio.CodOrd and CodProd = ’ABC’

• La data di quale ordine? La target list deve essere omogenea

• Estrarre il massimo e il minimo importo degli ordini:select max(Importo) as MaxImp, min(Importo) as MinImpfrom Ordine

Page 45: SQL. Il nome sta per Structured Query Language Le interrogazioni SQL sono dichiarative –lutente specifica quale informazione è di suo interesse, ma non.

Funzioni aggregate e target list

• Estrarre il massimo e il minimo importo degli ordini:

select max(Importo) as MaxImp, min(Importo) as MinImpfrom Ordine

MaxImpMaxImp

50.000.00050.000.000

MinImpMinImp

1.500.0001.500.000

Page 46: SQL. Il nome sta per Structured Query Language Le interrogazioni SQL sono dichiarative –lutente specifica quale informazione è di suo interesse, ma non.

Query con raggruppamento• Nelle interrogazioni si possono applicare gli operatori aggregati a sottoinsiemi di righe• Si aggiungono le clausole

– group by (raggruppamento)– having (selezione dei gruppi)

select …select …

from …from …

where …where …

group by …group by …

having …having …

Page 47: SQL. Il nome sta per Structured Query Language Le interrogazioni SQL sono dichiarative –lutente specifica quale informazione è di suo interesse, ma non.

Query con raggruppamento • Estrarre la somma degli importi degli ordini successivi al 10-6-97 per quei clienti che hanno emesso almeno 2 ordini

select CodCli, sum(Importo) select CodCli, sum(Importo) from Ordinefrom Ordinewhere Data > 10-6-97where Data > 10-6-97group by CodCligroup by CodClihaving count(*) >= 2having count(*) >= 2

Page 48: SQL. Il nome sta per Structured Query Language Le interrogazioni SQL sono dichiarative –lutente specifica quale informazione è di suo interesse, ma non.

Passo 1: Valutazione where

CodOrdCodOrd

22

33

44

55

66

CodCliCodCli

44

33

11

11

33

DataData

3-8-973-8-97

1-9-971-9-97

1-7-971-7-97

1-8-971-8-97

3-9-973-9-97

ImportoImporto

8.000.0008.000.000

5.500.0005.500.000

12.000.00012.000.000

1.500.0001.500.000

27.000.00027.000.000

Page 49: SQL. Il nome sta per Structured Query Language Le interrogazioni SQL sono dichiarative –lutente specifica quale informazione è di suo interesse, ma non.

Passo 2 : Raggruppamento

CodOrdCodOrd

44

55

33

66

22

CodCliCodCli

11

11

33

33

44

DataData

1-7-971-7-97

1-8-971-8-97

1-9-971-9-97

3-9-973-9-97

3-8-973-8-97

ImportoImporto

12.000.00012.000.000

1.500.0001.500.000

1.500.0001.500.000

5.500.0005.500.000

8.000.0008.000.000

• si valuta la clausola group by

Page 50: SQL. Il nome sta per Structured Query Language Le interrogazioni SQL sono dichiarative –lutente specifica quale informazione è di suo interesse, ma non.

Passo 3 : Calcolo degli aggregati

• si calcolano sum(Importo) e count(*) per ciascun gruppo

CodCliCodCli

11

33

44

sum(Importo)sum(Importo)

13.500.00013.500.000

32.500.00032.500.000

5.000.0005.000.000

count(*)count(*)

22

22

11

Page 51: SQL. Il nome sta per Structured Query Language Le interrogazioni SQL sono dichiarative –lutente specifica quale informazione è di suo interesse, ma non.

Passo 4 : Estrazione dei gruppi

• si valuta il predicato count(*) >= 2

CodCliCodCli

11

33

44

sum sum (Importo)(Importo)

13.500.00013.500.000

32.500.00032.500.000

5.000.0005.000.000

count(*)count(*)

22

22

11

Page 52: SQL. Il nome sta per Structured Query Language Le interrogazioni SQL sono dichiarative –lutente specifica quale informazione è di suo interesse, ma non.

Passo 5 : Produzione del risultato(esecuzione della clausola Select)

CodCliCodCli

11

33

sum(Importo)sum(Importo)

13.500.00013.500.000

32.500.00032.500.000

Page 53: SQL. Il nome sta per Structured Query Language Le interrogazioni SQL sono dichiarative –lutente specifica quale informazione è di suo interesse, ma non.

Query con group by e target list

• Query scorretta:select Importofrom Ordinegroup by CodCli

• Query scorretta:select O.CodCli, count(*), C.Cittàfrom Ordine O join Cliente C on (O.CodCli = C.CodCli)group by O.CodCli

• Query corretta:select O.CodCli, count(*), C.Cittàfrom Ordine O join Cliente C on (O.CodCli = C.CodCli)group by O.CodCli, C.Città

Page 54: SQL. Il nome sta per Structured Query Language Le interrogazioni SQL sono dichiarative –lutente specifica quale informazione è di suo interesse, ma non.

where o having?

• Soltanto i predicati che richiedono la valutazione di funzioni aggregate dovrebbero comparire nell’argomento della clausola having

• Estrarre i dipartimenti in cui lo stipendio medio degli impiegati che lavorano nell’ufficio 20 è maggiore di 25:

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

Page 55: SQL. Il nome sta per Structured Query Language Le interrogazioni SQL sono dichiarative –lutente specifica quale informazione è di suo interesse, ma non.

Raggruppamento e ordinamento

Estrarre la somma degli importi degli ordini successivi al 10-6-97 per quei clienti che hanno emesso almeno 2 ordini, in ordine decrescente di codice clienteselect CodCli, sum(Importo) select CodCli, sum(Importo) from Ordinefrom Ordinewhere Data > 10-6-97where Data > 10-6-97group by CodCligroup by CodClihaving count(*) >= 2having count(*) >= 2order by CodCli descorder by CodCli desc

Page 56: SQL. Il nome sta per Structured Query Language Le interrogazioni SQL sono dichiarative –lutente specifica quale informazione è di suo interesse, ma non.

Raggruppamento e ordinamento

Estrarre la somma degli importi degli ordini successivi al 10-6-97 per quei clienti che hanno emesso almeno 2 ordini, in ordine decrescente di somma di importoselect CodCli, sum(Importo) select CodCli, sum(Importo) from Ordinefrom Ordinewhere Data > 10-6-97where Data > 10-6-97group by CodCligroup by CodClihaving count(*) >= 2having count(*) >= 2order by 2 descorder by 2 desc

Page 57: SQL. Il nome sta per Structured Query Language Le interrogazioni SQL sono dichiarative –lutente specifica quale informazione è di suo interesse, ma non.

Risultato dopo la clausola di ordinamento

CodCliCodCli

33

11

sum(Importo)sum(Importo)

32.500.00032.500.000

13.500.00013.500.000

Page 58: SQL. Il nome sta per Structured Query Language Le interrogazioni SQL sono dichiarative –lutente specifica quale informazione è di suo interesse, ma non.

Doppio raggruppamento • Estrarre la somma delle quantità dei dettagli degli ordini emessi da ciascun cliente per ciascun prodotto, purché la somma superi 50

select CodCli, CodProd, sum(Qta)

from Ordine as O, Dettaglio as D

Where O.CodOrd = D.CodOrd

group by CodCli, CodProd

having sum(Qta) > 50

Page 59: SQL. Il nome sta per Structured Query Language Le interrogazioni SQL sono dichiarative –lutente specifica quale informazione è di suo interesse, ma non.

Situazione dopo il join e il raggruppamento

OrdineOrdine

Ordine.Ordine.CodOrdCodOrd

33

44

33

55

33

11

22

66

CodCliCodCli

11

11

11

11

22

33

33

33

Dettaglio.Dettaglio.CodOrdCodOrd

33

44

33

55

33

11

22

66

CodProdCodProd

11

11

22

22

11

11

11

11

DettaglioDettaglio

QtaQta

gruppo 1,1gruppo 1,1

gruppo 1,2gruppo 1,2

gruppo 2,1gruppo 2,1

gruppo 3,1gruppo 3,1

3030

2020

3030

1010

6060

4040

3030

2525

Page 60: SQL. Il nome sta per Structured Query Language Le interrogazioni SQL sono dichiarative –lutente specifica quale informazione è di suo interesse, ma non.

Estrazione del risultato

• si valuta la funzione aggregata sum(Qta) e il predicato having

sum(Qta) sum(Qta)

5050

4040

6060

9595

CodProd CodProd

11

22

11

11

CodCli CodCli

11

11

22

33

Page 61: SQL. Il nome sta per Structured Query Language Le interrogazioni SQL sono dichiarative –lutente specifica quale informazione è di suo interesse, ma non.

Query nidificate

• Nella clausola where e nella clausola having possono comparire predicati che:– confrontano un attributo (o un’espressione sugli attributi) con il

risultato di una query SQL; sintassi:AttrExpr Operator < any | all > SelectSQL• any: il predicato è vero se almeno una riga restituita dalla query SelectSQL

soddisfa il confronto• all: il predicato è vero se tutte le righe restituite dalla query SelectSQL

soddisfano il confronto• Operator: uno qualsiasi tra =, <>, <, <=, >, >=

• La query che appare nella clausola where e nella clausola having è chiamata query nidificata

• Nelle query nidificate posso usare variabili definite esternamente

Page 62: SQL. Il nome sta per Structured Query Language Le interrogazioni SQL sono dichiarative –lutente specifica quale informazione è di suo interesse, ma non.

Uso di any e all

select CodOrd from Ordine where Importo > any select Importo from Ordine

select CodOrdselect CodOrdfrom Ordinefrom Ordinewhere Importo >= allwhere Importo >= all select Importoselect Importo from Ordinefrom Ordine

COD-ORDCOD-ORD

11

22

33

IMPORTOIMPORTO

5050

300300

9090

ANYANY

FF

VV

VV

ALLALL

FF

VV

FF

Page 63: SQL. Il nome sta per Structured Query Language Le interrogazioni SQL sono dichiarative –lutente specifica quale informazione è di suo interesse, ma non.

Query nidificate con any

• Estrarre gli ordini di prodotti con un prezzo superiore a 100

select distinct CodOrdfrom Dettagliowhere CodProd = any(select CodProd from Prodotto where Prezzo > 100)

• Equivalente a (senza query nidificata)select distinct CodOrdfrom Dettaglio D, Prodotto Pwhere D.CodProd = P.CodProd and Prezzo > 100

Page 64: SQL. Il nome sta per Structured Query Language Le interrogazioni SQL sono dichiarative –lutente specifica quale informazione è di suo interesse, ma non.

Query nidificate con any

• Estrarre i prodotti ordinati assieme al prodotto avente codice ‘ABC’– con una query nidificata:select distinct CodProdfrom Dettagliowhere CodProd<>’ABC’ and CodOrd = any (select CodOrd from Dettaglio where CodProd = ’ABC’)– senza query nidificata, a meno di duplicati:select distinct D1.CodProdfrom Dettaglio D1, Dettaglio D2where D1.CodOrd = D2.CodOrd andD1.CodProd<>’ABC’ and D2.CodProd=’ABC’

Page 65: SQL. Il nome sta per Structured Query Language Le interrogazioni SQL sono dichiarative –lutente specifica quale informazione è di suo interesse, ma non.

Negazione con query nidificate

• Estrarre gli ordini che non contengono il prodotto ‘ABC’:

select distinct CodOrdfrom Ordinewhere CodOrd <> all (select CodOrd from Dettaglio where CodProd = ’ABC’)

Page 66: SQL. Il nome sta per Structured Query Language Le interrogazioni SQL sono dichiarative –lutente specifica quale informazione è di suo interesse, ma non.

Query nidificate

• AttrExpr Operator < in | not in > SelectSQL– in: il predicato è vero se almeno una riga restituita

dalla query SelectSQL e’ presente nell’espressione– not in: il predicato è vero se nessuna riga restituita

query e’ presente nell’espressione

Page 67: SQL. Il nome sta per Structured Query Language Le interrogazioni SQL sono dichiarative –lutente specifica quale informazione è di suo interesse, ma non.

Operatori in e not in

• L’operatore in è equivalente a = anyselect CodProdfrom Dettagliowhere CodOrd in (select CodOrd from Dettaglio where CodProd = ’ABC’)

• L’operatore not in è equivalente a <> allselect distinct CodOrdfrom Ordinewhere CodOrd not in (select CodOrd from Dettaglio where CodProd = ’ABC’)

Page 68: SQL. Il nome sta per Structured Query Language Le interrogazioni SQL sono dichiarative –lutente specifica quale informazione è di suo interesse, ma non.

max con query nidificata

• Gli operatori aggregati max (e min) possono essere espressi tramite query nidificate

• Estrarre l’ordine con il massimo importo– Con una query nidificata, usando max:

select CodOrdfrom Ordinewhere Importo in (select max(Importo) from Ordine)

– con una query nidificata, usando all:

select CodOrdfrom Ordinewhere Importo >= all (select Importo from Ordine)

Page 69: SQL. Il nome sta per Structured Query Language Le interrogazioni SQL sono dichiarative –lutente specifica quale informazione è di suo interesse, ma non.

Costruttore di tupla

• Il confronto con la query nidificata può coinvolgere più di un attributo

• Gli attributi devono essere racchiusi da un paio di parentesi tonde (costruttore di tupla)

• Esempio: estrarre gli omonimiselect *from Persona Pwhere (Nome,Cognome) in (select Nome, Cognome from Persona P1 where P1.CodFisc <> P.CodFisc)

Page 70: SQL. Il nome sta per Structured Query Language Le interrogazioni SQL sono dichiarative –lutente specifica quale informazione è di suo interesse, ma non.

Costruttore di tupla

• Esempio: estrarre le persone che non hanno omonimi

select *from Persona Pwhere (Nome,Cognome) not in (select Nome, Cognome from Persona P1 where P1.CodFisc <> P.CodFisc)

Page 71: SQL. Il nome sta per Structured Query Language Le interrogazioni SQL sono dichiarative –lutente specifica quale informazione è di suo interesse, ma non.

Uso di in nelle modifiche• Aumentare di 5 euro l’importo di tutti gli ordini che

comprendono il prodotto 456

update Ordine set Importo = Importo + 5 where CodOrd in select CodOrd

from Dettaglio where CodProd = ’456’

Page 72: SQL. Il nome sta per Structured Query Language Le interrogazioni SQL sono dichiarative –lutente specifica quale informazione è di suo interesse, ma non.

Uso di query nidificate nelle modifiche• Assegnare a TotPezzi la somma delle quantità delle linee di un ordine

update Ordine O set TotPezzi = (select sum(Qta) from Dettaglio D where D.CodOrd = O.CodOrd)

Page 73: SQL. Il nome sta per Structured Query Language Le interrogazioni SQL sono dichiarative –lutente specifica quale informazione è di suo interesse, ma non.

Viste

• Offrono la "visione" di tabelle virtuali (schemi esterni)• Le viste possono essere usate per formulare query complesse

– Le viste decompongono il problema e producono una soluzione più leggibile

• Le viste sono talvolta necessarie per esprimere alcune query:– query che combinano e nidificano diversi operatori aggregati– query che fanno un uso sofisticato dell’operatore di unione

• Sintassi:create view NomeVista [ (ListaAttributi) ] as SelectSQL

Page 74: SQL. Il nome sta per Structured Query Language Le interrogazioni SQL sono dichiarative –lutente specifica quale informazione è di suo interesse, ma non.

Composizione delle viste con le query

• Vista: create view OrdiniPrincipali as select * from Ordine where Importo > 10000• Query: select CodCli from OrdiniPrincipali

• Composizione della vista con la query: select CodCli from Ordine

where Importo > 10000

Page 75: SQL. Il nome sta per Structured Query Language Le interrogazioni SQL sono dichiarative –lutente specifica quale informazione è di suo interesse, ma non.

Viste e query

• Estrarre il cliente che ha generato il massimo fatturato (senza usare le viste):

select CodClifrom Ordinegroup by CodClihaving sum(Importo) >= all (select sum(Importo) from Ordine group by CodCli)

Page 76: SQL. Il nome sta per Structured Query Language Le interrogazioni SQL sono dichiarative –lutente specifica quale informazione è di suo interesse, ma non.

Viste e query

• Estrarre il cliente che ha generato il massimo fatturato (usando le viste):create view CliFatt(CodCli,FattTotale) asselect CodCli, sum(Importo)from Ordinegroup by CodCli

select CodClifrom CliFattwhere FattTotale = (select max(FattTotale) from CliFatt)

Page 77: SQL. Il nome sta per Structured Query Language Le interrogazioni SQL sono dichiarative –lutente specifica quale informazione è di suo interesse, ma non.

Viste e query

• Estrarre il numero medio di ordini per cliente:– Soluzione scorretta (SQL non permette di applicare gli

operatori aggregati in cascata):select avg(count(*))from Ordinegroup by CodCli

– Soluzione corretta (usando una vista):create view CliOrd(CodCli,NumOrdini) asselect CodCli, count(*)from Ordinegroup by CodCli

select avg(NumOrdini)from CliOrd

Page 78: SQL. Il nome sta per Structured Query Language Le interrogazioni SQL sono dichiarative –lutente specifica quale informazione è di suo interesse, ma non.

Viste in cascata

create view ImpiegatoAmmin (Matr,Nome,Cognome,Stipendio) asselect Matr, Nome, Cognome, Stipendiofrom Impiegatowhere Dipart = ’Amministrazione’ and Stipendio > 10

create view ImpiegatoAmminJunior asselect *from ImpiegatoAmminwhere Stipendio < 50