SQL. Il nome sta per Structured Query Language Le interrogazioni SQL sono dichiarative –lutente...
-
Upload
bernardo-massaro -
Category
Documents
-
view
215 -
download
0
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.](https://reader035.fdocument.pub/reader035/viewer/2022062512/5542eb68497959361e8d3d08/html5/thumbnails/1.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062512/5542eb68497959361e8d3d08/html5/thumbnails/2.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062512/5542eb68497959361e8d3d08/html5/thumbnails/3.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062512/5542eb68497959361e8d3d08/html5/thumbnails/4.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062512/5542eb68497959361e8d3d08/html5/thumbnails/5.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062512/5542eb68497959361e8d3d08/html5/thumbnails/6.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062512/5542eb68497959361e8d3d08/html5/thumbnails/7.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062512/5542eb68497959361e8d3d08/html5/thumbnails/8.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062512/5542eb68497959361e8d3d08/html5/thumbnails/9.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062512/5542eb68497959361e8d3d08/html5/thumbnails/10.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062512/5542eb68497959361e8d3d08/html5/thumbnails/11.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062512/5542eb68497959361e8d3d08/html5/thumbnails/12.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062512/5542eb68497959361e8d3d08/html5/thumbnails/13.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062512/5542eb68497959361e8d3d08/html5/thumbnails/14.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062512/5542eb68497959361e8d3d08/html5/thumbnails/15.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062512/5542eb68497959361e8d3d08/html5/thumbnails/16.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062512/5542eb68497959361e8d3d08/html5/thumbnails/17.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062512/5542eb68497959361e8d3d08/html5/thumbnails/18.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062512/5542eb68497959361e8d3d08/html5/thumbnails/19.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062512/5542eb68497959361e8d3d08/html5/thumbnails/20.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062512/5542eb68497959361e8d3d08/html5/thumbnails/21.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062512/5542eb68497959361e8d3d08/html5/thumbnails/22.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062512/5542eb68497959361e8d3d08/html5/thumbnails/23.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062512/5542eb68497959361e8d3d08/html5/thumbnails/24.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062512/5542eb68497959361e8d3d08/html5/thumbnails/25.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062512/5542eb68497959361e8d3d08/html5/thumbnails/26.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062512/5542eb68497959361e8d3d08/html5/thumbnails/27.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062512/5542eb68497959361e8d3d08/html5/thumbnails/28.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062512/5542eb68497959361e8d3d08/html5/thumbnails/29.jpg)
• 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.](https://reader035.fdocument.pub/reader035/viewer/2022062512/5542eb68497959361e8d3d08/html5/thumbnails/30.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062512/5542eb68497959361e8d3d08/html5/thumbnails/31.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062512/5542eb68497959361e8d3d08/html5/thumbnails/32.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062512/5542eb68497959361e8d3d08/html5/thumbnails/33.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062512/5542eb68497959361e8d3d08/html5/thumbnails/34.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062512/5542eb68497959361e8d3d08/html5/thumbnails/35.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062512/5542eb68497959361e8d3d08/html5/thumbnails/36.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062512/5542eb68497959361e8d3d08/html5/thumbnails/37.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062512/5542eb68497959361e8d3d08/html5/thumbnails/38.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062512/5542eb68497959361e8d3d08/html5/thumbnails/39.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062512/5542eb68497959361e8d3d08/html5/thumbnails/40.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062512/5542eb68497959361e8d3d08/html5/thumbnails/41.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062512/5542eb68497959361e8d3d08/html5/thumbnails/42.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062512/5542eb68497959361e8d3d08/html5/thumbnails/43.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062512/5542eb68497959361e8d3d08/html5/thumbnails/44.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062512/5542eb68497959361e8d3d08/html5/thumbnails/45.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062512/5542eb68497959361e8d3d08/html5/thumbnails/46.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062512/5542eb68497959361e8d3d08/html5/thumbnails/47.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062512/5542eb68497959361e8d3d08/html5/thumbnails/48.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062512/5542eb68497959361e8d3d08/html5/thumbnails/49.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062512/5542eb68497959361e8d3d08/html5/thumbnails/50.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062512/5542eb68497959361e8d3d08/html5/thumbnails/51.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062512/5542eb68497959361e8d3d08/html5/thumbnails/52.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062512/5542eb68497959361e8d3d08/html5/thumbnails/53.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062512/5542eb68497959361e8d3d08/html5/thumbnails/54.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062512/5542eb68497959361e8d3d08/html5/thumbnails/55.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062512/5542eb68497959361e8d3d08/html5/thumbnails/56.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062512/5542eb68497959361e8d3d08/html5/thumbnails/57.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062512/5542eb68497959361e8d3d08/html5/thumbnails/58.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062512/5542eb68497959361e8d3d08/html5/thumbnails/59.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062512/5542eb68497959361e8d3d08/html5/thumbnails/60.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062512/5542eb68497959361e8d3d08/html5/thumbnails/61.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062512/5542eb68497959361e8d3d08/html5/thumbnails/62.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062512/5542eb68497959361e8d3d08/html5/thumbnails/63.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062512/5542eb68497959361e8d3d08/html5/thumbnails/64.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062512/5542eb68497959361e8d3d08/html5/thumbnails/65.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062512/5542eb68497959361e8d3d08/html5/thumbnails/66.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062512/5542eb68497959361e8d3d08/html5/thumbnails/67.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062512/5542eb68497959361e8d3d08/html5/thumbnails/68.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062512/5542eb68497959361e8d3d08/html5/thumbnails/69.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062512/5542eb68497959361e8d3d08/html5/thumbnails/70.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062512/5542eb68497959361e8d3d08/html5/thumbnails/71.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062512/5542eb68497959361e8d3d08/html5/thumbnails/72.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062512/5542eb68497959361e8d3d08/html5/thumbnails/73.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062512/5542eb68497959361e8d3d08/html5/thumbnails/74.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062512/5542eb68497959361e8d3d08/html5/thumbnails/75.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062512/5542eb68497959361e8d3d08/html5/thumbnails/76.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062512/5542eb68497959361e8d3d08/html5/thumbnails/77.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062512/5542eb68497959361e8d3d08/html5/thumbnails/78.jpg)
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