Sei sulla pagina 1di 14

Atzeni,
Ceri,
Paraboschi,
Torlone

Basi
di
da6

Atzeni,
Ceri,
Paraboschi,
Torlone 
 Basi
di
da6 


SQL:
"storia"


Prima
proposta
SEQUEL
(1974);

 Prime
implementazioni
in
SQL/DS
e
Oracle


(1981)


Dal
1983
ca.
"standard
di
faPo"

 Standard
(1986,
poi
1989
e
infine
1992,
1999)



 

3

CREATE
TABLE:
esempio


CREATE
TABLE
Dipar6mento(



 Nome
CHAR(20)
PRIMARY
KEY,




 Indirizzo
CHAR(50),





 
 CiPà
CHAR(20)
 )



 

5

SQL


Originariamente
Structured
Query
Language,
ora
 "nome
proprio"
 Linguaggio
con
varie
funzionalità:

 DDL
–
Data
Defini6on
Language 
(insieme
di
 comandi
per
la
definizione
dello
schema
della
BD
 relazionale)
 DML
–
Data
Manipula6on
Language
 (insieme
di
 comandi
per
la
modifica
e
l‘interrogazione
 dell‘istanza
della
BD).
 Ne
esistono
varie
versioni

 Vediamo
gli
aspeO
essenziali,
non
i
dePagli



2

Definizione
dei
da6
in
SQL



Istruzione
CREATE
TABLE:

 Definisce
uno
schema
di
relazione
e
ne
crea
 un’istanza
vuota
 Specifica

un
elenco
di
 aPribu6 
che
compongono
 lo
schema
e
un
insieme
(eventualmente
vuoto)
di
 vincoli
tra
più
aPribu6. Per
ogni
aPributo
si
definisce
un
 nome ,
un
 dominio 
e
eventualmente
un
insieme
di
vincoli 
 che
devono
essere
soddisfaO
dai
valori
 dell’aPributo.


4

CREATE
TABLE:
esempio


CREATE
TABLE
Impiegato(
 
 Matricola
CHAR(6)
PRIMARY
KEY,

 
 Nome
CHAR(20)
NOT
NULL,


 
 
 Cognome
CHAR(20)
NOT
NULL,


 
 Dipart
CHAR(20), 
 
 
 S6pendio
NUMERIC(9)
DEFAULT
0,





 FOREIGN
KEY(Dipart)
REFERENCES
 
 



 Dipar6mento(Nome),






 
 UNIQUE
(Cognome,Nome)





)



6

Domini



Domini
elementari
(predefini6
del
linguaggio)
 Domini
defini6
dall'utente
a
par6re
dai
domini


predefini6.


7

Definizione
di
domini


Istruzione
CREATE
DOMAIN:



Definisce
un
dominio
(semplice),
u6lizzabile
in
 definizioni
di
relazioni.
 Dominio
caraPerizzato
da
un
nome ,
da
un
 dominio
 elementare
(o
definito
dall’utente
in
precedenza),
 da
un
eventuale
valore
di
default,
da
un
eventuale
 insieme
di
vincoli
 (insieme
di
condizioni
che
 devono
essere
rispePate
dai
valori
del
dominio).


9

CREATE
DOMAIN:
esempio


CREATE
DOMAIN
Voto




 AS
SMALLINT
DEFAULT
NULL



 CHECK
(
value
>=18
AND
value
<=
30
)


11

Domini
elementari


CaraPere:
singoli
caraPeri
o
stringhe,
anche
di
 lunghezza
variabile
(si
indica
la
lunghezza
massima)

 Bit :
singoli
booleani
o
stringhe
di
bit
 Numerici
(esaO
e
approssima6)
 Data,
ora,
intervalli
di
tempo
 IntrodoO
in
SQL:1999:
 Boolean
 (valore
singolo
booleano)
 BLOB,
CLOB
(Binary/Character
Large
Object):
per


grandi
immagini
e
tes6


8

Definizione
di
domini


La
dichiarazione
di
nuovi
domini
permePe
di
 associare
un
insieme
di
vincoli
ad
un
nome
di
 dominio:
 importante
quando
si
deve
ripetere
(o
modificare)
 la
stessa
definizione
di
aPributo
in
diverse
tabelle.
 Valore
di
default:
valore
che
deve
assumere
 l’aPributo
quando
viene
inserita
un
nuova
riga
in
 tabella
senza
che
sia
specificato
un
valore
per
 l’aPributo
stesso.


10

Vincoli
intrarelazionali


NOT
NULL

 UNIQUE:
definisce
chiavi
 PRIMARY
KEY:
definisce
chiave
primaria
(una
 sola,
implica
 NOT
NULL)
 CHECK,
vedremo
più
avan6


12

UNIQUE
e
PRIMARY
KEY


Definibili
aPraverso
due
forme:


nella
definizione
di
un
 singolo
aPributo,
se
forma
 da
solo
la
chiave
 come
elemento
separato
elencando
più
aPribu6

13

Chiavi
su
più
aPribu6,
aPenzione


 

Nome

 
 
 CHAR(20)
NOT
NULL,


 Cognome
 
 CHAR(20)
NOT
NULL,

 UNIQUE
(Cognome,Nome),


Nome 
 
 CHAR(20)
NOT
NULL
UNIQUE,


 Cognome
 
 CHAR(20)
NOT
NULL
UNIQUE,


Non
è
la
stessa
cosa:
nel
primo
caso
si
impone
che


non
ci
siano
2
righe
con
nome
e
cognome
uguali,
nel


secondo
(più
restriOvo)
si
impone
che
non
ci
siano


più
di
una
volta
lo
stesso
nome
o
lo
stesso
cognome.


15

 

PRIMARY
KEY:
Esempio


Nome




 
 CHAR(20),




Cognome
 
 CHAR(20),

 PRIMARY
KEY
(Cognome,Nome),


 

17

UNIQUE


Impone
che
i
valori
dell’aPributo
(o
degli
 aPribu6)
siano
una
 (super)chiave:



righe
differen6
della
tabella
non
possono
avere
gli
 stessi
valori


Eccezione
per
il
valore
nullo 
che
può
 comparire
su
righe
diverse
(si
assume
che
i
 valori
nulli
siano
diversi
tra
loro)


14

PRIMARY
KEY


Impone
che
i
valori
dell’aPributo
(o
degli
 aPribu6)
siano
la 
chiave
primaria.
 Definibile
 una
sola
chiave
primaria 
per
ogni
 tabella
(mentre
i
vincoli
UNIQUE
e
NOT
NULL
 si
possono
usare
più
volte).
 Gli
aPribu6
che
fanno
parte
della
chiave
 primaria
non
possono
assumere
il
valore
nullo
 (la
definizione
NOT
NULL
è
implicita)


16

(la
definizione
NOT
NULL
è
implicita)
 16 PRIMARY
KEY:
alterna6ve


PRIMARY
KEY:
alterna6ve


Matricola
CHAR(6)
PRIMARY
KEY

Oppure


Matricola
CHAR(6),


…,


PRIMARY
KEY
(Matricola)


18

CREATE
TABLE:
esempio


CREATE
TABLE
Impiegato(
 
 Matricola
CHAR(6)
PRIMARY
KEY,

 
 Nome
CHAR(20)
NOT
NULL,


 
 
 Cognome
CHAR(20)
NOT
NULL,


 
 Dipart
CHAR(15), 
 
 
 S6pendio
NUMERIC(9)
DEFAULT
0,





 FOREIGN
KEY(Dipart)
REFERENCES
 
 



 Dipar6mento(NomeDip),






 
 UNIQUE
(Cognome,Nome)





)



19

 

Vincoli
interrelazionali


 

Due
sintassi:
 per
un
singolo
aPributo:
REFERENCES
 si
deve
specificare
la
tabella
esterna
e
l’aPributo
della
 tabella
esterna

al
quale
l’aPributo
corrente
deve
essere
 legato.
 su
più
aPribu6:
FOREIGN
KEY 
dopo
la
definizione
degli


 

aPribu6.


 

si
devono
elencare
gli
aPribu6
della
tabella
corrente


 

coinvol6,
cui
segue
REFERENCES
alla
tabella
esterna
e
la


definizione
dei
corrisponden6
aPribu6
della
tabella


 

esterna


 
 

21

 

Infrazioni

 

Codice

Data

Vigile

Prov

Numero

 

34321

1/2/95

3987

MI

39548K

53524

4/3/95

3295

TO

E39548

64521

5/4/96

3295

PR

839548

73321

5/2/98

9345

PR

839548

Auto

Prov

Numero

Cognome

Nome

 

MI

39548K

Rossi

Mario

TO

E39548

Rossi

Mario

PR

839548

Neri

Luca

 

23

 

Vincoli
interrelazionali


 

CHECK,
vedremo
più
avan6

 REFERENCES
 e
FOREIGN
KEY
permePono
di
definire
vincoli
di
 integrità
referenziale:
 creano
legami
tra
i
valori
di
un
aPributo
nella
tabella
 corrente
(interna)
e
i
valori
di
un
aPributo
di
un’altra
 tabella 
(esterna)

 per
ogni
riga
della
tabella
il
valore
dell’aPributo
(se
diverso
 dal
valore
nullo)
deve
essere
presente
nelle
righe
della
 tabella
esterna
tra
i
valori
del
corrispondente
aPributo.
 Requisito:
l’aPributo
della
tabella
esterna
deve
essere
 soggePo
a
vincolo
 UNIQUE
(in
genere
è
PRIMARYKEY ).

 

20

 

Infrazioni

Codice

Data

Vigile

Prov

Numero

 

34321

1/2/95

3987

MI

39548K

53524

4/3/95

3295

TO

E39548

64521

5/4/96

3295

PR

839548

73321

5/2/98

9345

PR

839548

Vigili

Matricola

Cognome

Nome

 
 

3987

Rossi

Luca

3295

Neri

Piero

9345

Neri

Mario

7543

Mori

Gino

 

22

 

CREATE
TABLE:
esempio


 

CREATE
TABLE
Infrazioni(


 
 

Codice
CHAR(6)
PRIMARY
KEY,



 


 Data
DATE
NOT
NULL,




 



 
 Vigile
INTEGER
NOT
NULL
 















 
 REFERENCES
Vigili(Matricola), 




 
 


 Provincia
CHAR(2),




 



 
 Numero
CHAR(6)
,
 

 
 FOREIGN
KEY(Provincia,
Numero)
 
 
 REFERENCES
Auto(Provincia,
Numero)




 


)


24

CREATE
SCHEMA


Per
definire
uno
schema
di
base
di
da6
come


insieme
di
elemen6
(tabelle,
domini,
viste,


ecc.)


CREATE
SCHEMA
[NomeSchema]
 
 
 {defElemen6}

25

DML


SQL
esprime
le
interrogazioni
in
modo
 dichiara6vo :
si
 specifica
l’obieOvo
dell’interrogazione
e
non
il
modo
 in
cui
oPenerlo.
 SQL
si
contrappone
ai
linguaggi
di
interrogazione
 procedurali
(come
l’algebra
relazionale)
in
cui
 l’interrogazione

specifica
i
passi
da
compiere
per
 estrarre
l’informazione
cercata.
 In
mol6
sistemi
si
u6lizzano
strumen6
diversi
dal


codice
SQL
per
definire
lo
schema
della
base
di
da6.


27

27 Istruzione
SELECT:
versione
base
 SELECT

Istruzione
SELECT:
versione
base


SELECT 
ListaAPribu6


FROM
ListaTabelle


[
WHERE 
Condizione
]


clausola
 SELECT 
dePa
"target
list"
 clausola
 FROMclausola
 WHERE 



29

Modifica
degli
schemi


Per
modificare
domini,
schemi
di
tabelle,
vincoli,
valori
 di
default,
ecc.:
 ALTER
DOMAIN
 ALTER
TABLE
 …
 Per
 rimuovere
domini,
schemi
di
 tabelle,
vincoli,
valori
 di
default,
ecc.:
 DROP
DOMAIN
 DROP
TABLE
 


26

SQL:
operazioni
sui
da6


Interrogazione:



SELECT


Per
modificare
il
contenuto
della
base
di
da6


( l’istanza
della
base
di
da6):


INSERT,
DELETE,
UPDATE

28

Maternità

Madre

Figlio

Luisa

Maria

Luisa

Luigi

Anna

Olga

Anna

Filippo

Maria

Andrea

Maria

Aldo

Paternità

Padre Figlio Sergio Franco Luigi Olga Luigi Filippo Franco Andrea Franco Aldo
Padre
Figlio
Sergio
Franco
Luigi
Olga
Luigi
Filippo
Franco
Andrea
Franco
Aldo

Persone

Nome

Età

Reddito

Andrea 27

21

Aldo

25

15

Maria

55

42

Anna

50

35

Filippo 26

30

Luigi

50

40

Franco 60

20

Olga

30

41

Sergio

85

35

Luisa

75

87

30

Selezione
e
proiezione:
esempio
 –   Nome
e
reddito
delle
persone
con
meno
di
trenta
 anni
Selezione
e
proiezione:
esempio

–   Nome
e
reddito
delle
persone
con
meno
di
trenta

anni
PROJ Nome,
Reddito ( SEL Eta<30 (Persone))
select
nome,
reddito


 from
persone

proiezione

 where
eta
<
30

selezione

31

select
nome,
reddito
 from
persone
 where
eta
<
30

select
nome,
reddito

from
persone

where
eta
<
30


SELECT:
abbreviazioni



Si può fare uso di alias per le tabelle per abbreviare i riferimenti ad esse.

select p.nome as nome, p.reddito as reddito from persone p where p.eta < 30

alias

33


 
 select
*



 from
persone



 where
eta
<
30


Equivale
a:


select
nome,
età,
reddito


from
persone



 where
eta
<
30


35

Persone

Nome

Età

Reddito

Reddito

Andrea 27 Andrea 27 Andrea 27 21 21 21 21 Aldo Aldo Aldo 25 25
Andrea 27
Andrea 27
Andrea 27
21
21
21
21
Aldo
Aldo
Aldo
25
25
25
15
15
15
15
Filippo 26
Maria
55
30
42
30

Anna

50

35

Filippo 26

Filippo 26

30

30

Luigi

50

40

Franco 60

20

Olga

30

41

Sergio

85

35

Luisa

75

87

32

Selezione,
senza
proiezione


Nome,
età
e
reddito
delle
persone
con
meno
 di
trenta
anni

SEL Eta<30 (Persone)

select
*



 
 from
persone



 
 where
eta
<
30


L’asterisco rappresenta la selezione di tutti gli attributi della tabella persone.

34

Proiezione,
senza
selezione


Nome
e
reddito
di
tuPe
le
persone

PROJ Nome,
Reddito (Persone)

select
nome,
reddito



 from
persone

36

 

SELECT,
abbreviazioni


R(A,B)



 
 select

*


 


 from
R

Equivale
(intui6vamente)
a



 
 select
X.A
as
A,
X.B
as
B



 from
R
X


where
true


37

 

Ges6one
dei
valori
nulli


Impiegati

Matricola Cognome

Filiale

Età

 

5998

7309

9553

5998

5998

9553

9553

Rossi

Neri

Bruni

Neri

Neri

Bruni

Bruni

Milano

Roma

Milano

Milano

Milano

Milano

Milano

45

32

45

45

NULL

NULL

NULL

Gli
impiega6
la
cui
età
è
o



 

potrebbe
essere
maggiore
di
40


 

SEL Età > 40 OR Età IS NULL (Impiegati)

 

39

 

Selezione,
proiezione
e
join


Istruzioni
SELECT
con
 una
sola
relazione 
nella
 clausola
FROM
permePono
di
realizzare:


 

selezioni,
proiezioni,
ridenominazioni


 

Con
più
relazioni 
nella
clausola
FROM
si
 realizzano
 join
(e
prodoO
cartesiani)


41

Condizione
complessa:
esempio


 

select
*
 from
persone


where
reddito
>
25



 

and
(eta
<
30
or
eta
>
60)


 

38

Gli
impiega6
la
cui
età
è
o



 

potrebbe
essere
maggiore
di
40


SEL Età > 40 OR Età IS NULL (Impiegati)

select * from impiegati where eta > 40 or eta is null

40

 

SQL
e
algebra
relazionale


R1(A1,A2)
R2(A3,A4)


 

select
R1.A1,
R2.A4



from


R1,
R2


where

R1.A2
=
R2.A3


prodoPo
cartesiano
(FROM )
 selezione
( WHERE )
 proiezione
(SELECT )


42

 

SQL
e
algebra
relazionale,
2


R1(A1,A2) R2(A3,A4)

 

select R1.A1, R2.A4

from

R1, R2

 

where R1.A2 = R2.A3

 
 

PROJ A1,A4 (SEL A2=A3 (R1 JOIN R2))

 

43

SQL:
esecuzione
delle
interrogazioni


Le
espressioni
SQL
sono
 dichiara6ve
e
noi
ne


s6amo
vedendo
la
seman6ca


 

In
pra6ca,
i
DBMS
eseguono
le
operazioni
in
 modo
efficiente,
ad
esempio:


eseguono
le
selezioni
al
più
presto
 se
possibile,
eseguono
join
e
non
prodoO
 cartesiani


 

45

 

Proiezione:
aPenzione


 

cognome e filiale di tutti gli impiegati

 

Matricola Cognome

Filiale

Stipendio

 

7309

Neri

Napoli

55

5998

Neri

Milano

64

9553

Rossi

Roma

44

5698

Rossi

Roma

64

PROJ Cognome, Filiale (Impiegati)

47

possono
essere
necessarie
ridenominazioni


nel
prodoPo
cartesiano
 nella
target
list


select
X.A1
AS
B1 ,
 
 from


R1
X ,
R2
Y,
R1
Z
 where

X.A2
=
Y.A3
AND
 


44

SQL:
specifica
delle
interrogazioni


Un’interrogazione
SQL
viene
poi
passata


all’oOmizzatore
delle
interrogazioni
(query
op6mizer)


che
la
riformula
nel
linguaggio
 procedurale
interno
al
 DBMS
(nascosto
all’utente).
 La
capacità
dei
DBMS
di
"oOmizzare"
le
 interrogazioni,
rende
(di
solito)
non
necessario
 preoccuparsi
dell'efficienza
quando
si
specifica
 un'interrogazione
 È
perciò
più
importante
preoccuparsi
della
chiarezza
 (anche
perché
così
è
più
difficile
sbagliare
…)


46

Duplica6


In
SQL
si
possono
avere
in
una
tabella
più
 righe
uguali
(dePe
 duplica6 ).
 Per
l’eliminazione
dei
duplica6
occorre
 specificare:


select
dis6nct


48

select


select
dis6nct

cognome,
filiale


cognome,
filiale


from
impiega6


from
impiega6


Cognome Filiale Neri Napoli Neri Milano Rossi Roma Rossi Roma
Cognome
Filiale
Neri
Napoli
Neri
Milano
Rossi
Roma
Rossi
Roma
Cognome Filiale Neri Napoli Neri Milano Rossi Roma
Cognome
Filiale
Neri
Napoli
Neri
Milano
Rossi
Roma

49

Filiale Neri Napoli Neri Milano Rossi Roma 49 Selezione,
proiezione
e
join
 –  

Selezione,
proiezione
e
join


I
padri
di
persone
che
guadagnano
più
di
ven6
 milioni


PROJ Padre (paternita



JOIN Figlio
=Nome

SEL Reddito>20 (persone))


select distinct padre from persone, paternita where figlio = nome and reddito > 20

51

Le
persone
che
guadagnano
più
dei
rispeOvi
padri;
 mostrare
nome,
reddito
e
reddito
del
padre


PROJ

Nome, Reddito, RP (SEL Reddito>RP

(REN NP,EP,RP Nome,Eta,Reddito (persone)

JOIN (paternita JOIN Figlio =Nome persone)))

NP=Padre

select f.nome, f.reddito, p.reddito from persone p, paternita, persone f where p.nome = padre and figlio = f.nome and f.reddito > p.reddito

53

Maternità

Madre

Figlio

 

Persone

Luisa

Maria

Nome

Età

Reddito

Luisa

Luigi

Andrea 27

21

Anna

Olga

Aldo

25

15

Anna

Filippo

Maria

55

42

Maria

Andrea

Anna

50

35

Maria

Aldo

Filippo 26

30

 

Luigi

50

40

Paternità

Padre Figlio Sergio Franco Luigi Olga Luigi Filippo Franco Andrea Franco Aldo
Padre
Figlio
Sergio
Franco
Luigi
Olga
Luigi
Filippo
Franco
Andrea
Franco
Aldo
 

Franco 60

20

Olga

30

41

Sergio

85

35

Luisa

75

87

 

50

 

Join
naturale


 

Padre
e
madre
di
ogni
persona


 

paternita
JOIN
maternita


select
paternita.figlio,padre,
madre


from
maternita,
paternita


 

where
paternita.figlio
=
maternita.figlio


 

52

SELECT,
con
ridenominazione
del


 

risultato


 


 
 select
figlio,
f.reddito
as
reddito,



 


 
 
p.reddito
 as
redditoPadre 
 



 from
persone
p,
paternita,
persone
f


 


 where
p.nome
=
padre
and
figlio
=
f.nome




 
 and
.reddito
>
p.reddito


 
 

54

Join
esplicito


La
condizione
di
join
non
compare
come
 argomento
della
clausola
where
ma
viene
 spostata
nella
clausola
from
associata
alle
 tabelle
coinvolte
nel
join.
 Sintassi:



 SELECT

…
 
 FROM
Tabella
{
…
JOIN
Tabella

ON
CondDiJoin
},
…



 [
WHERE
AltraCondizione
] 
 


55

Le
persone
che
guadagnano
più
dei
rispeOvi
padri;
mostrare
 nome,
reddito
e
reddito
del
padre


select f.nome, f.reddito, p.reddito from persone p, paternita, persone f where p.nome = padre and figlio = f.nome and f.reddito > p.reddito

select f.nome, f.reddito, p.reddito from persone p join paternita on p.nome = padre join persone f on figlio = f.nome where f.reddito > p.reddito

57

Join
naturale:
esempio



 
 select
madre,
paternita.figlio,
padre

 
 from
maternita
join
paternita
on





 
 
 
 paternita.figlio
=
maternita.figlio




 
 select
madre,
paternita.figlio,
padre

 
 from
maternita
natural
join 
paternita
 
 


59

Join
esplicito:
esempio


Padre
e
madre
di
ogni
persona



 select
paternita.figlio,padre,
madre
 from
maternita,
paternita
 wherepaternita.figlio
=
maternita.figlio



 select
paternita.figlio,
padre,
madre


from
maternita
join 
paternita
on 





 
 
 


paternita.figlio
=
maternita.figlio

56

Join
naturale


Natural
join:
nel
join
tra
due
tabelle
si
considera
 come
condizione
implicita
l’uguaglianza
degli


aPribu6
con
lo
stesso
nome.


58

Join
esterno:
"outer
join"


Esegue
un
join
mantenendo
tuPe
le
righe
in
una
o
 entrambe
le
tabelle.
 Tre
varian6
del
join
esterno:
 leÄ 
 right
 full


60

Join
esterno:
"outer
join“,
esempio


Padre
e,
se
nota,
madre
di
ogni
persona


 


 select
paternita.figlio,
padre,
madre


from
paternita
leÄ
join
 maternita



 


 on
paternita.figlio
=
maternita.figlio



 select
paternita.figlio,
padre,
madre


 

from
paternita
leÄ
outer
join 
maternita



 


 on
paternita.figlio
=
maternita.figlio


outer
e'
opzionale


 

61

 

Ordinamento
del
risultato


Nome
e
reddito
delle
persone
con
meno
di


trenta
anni
in
ordine
alfabe6co

 
 

select
nome,
reddito



 
 from
persone


 


 
 where
eta
<
30



 
 order
by
nome


63

 

Operatori
aggrega6


Rappresentano
un’estensione
dell’algebra
 relazionale.
 Nelle
espressioni
della
target
list
possiamo
avere


anche
espressioni
che
calcolano
valori
a
par6re
da


insiemi
di
ennuple:
 conteggio,
minimo,
massimo,
media,
totale
 sintassi
base
(semplificata):
 Funzione
(
[
DISTINCT
]
*
)
 Funzione
(
[
DISTINCT
]
APributo
)


 

65

Outer
join


select
paternita.figlio,
padre,
madre
 from
maternita
join 
paternita



on
maternita.figlio
=
paternita.figlio


select
paternita.figlio,
padre,
madre


from
maternita
leÄ
outer
join 
paternita



on
maternita.figlio
=
paternita.figlio


select
paternita.figlio,
padre,
madre
 from
maternita
full
outer
join 
paternita



on
maternita.figlio
=
paternita.figlio


62

on
maternita.figlio
=
paternita.figlio
 
 62 select nome, reddito from persone where eta < 30

select nome, reddito from persone where eta < 30

select nome, reddito from persone where eta < 30 order by nome

Persone

Persone

Nome Reddito Andrea 21 Aldo 15 Filippo 30
Nome
Reddito
Andrea
21
Aldo
15
Filippo
30
Nome Reddito Aldo 15 Andrea 21 Filippo 30
Nome
Reddito
Aldo
15
Andrea
21
Filippo
30

64

Nome Reddito Aldo 15 Andrea 21 Filippo 30 64 Operatori
aggrega6:
COUNT
 •  

Operatori
aggrega6:
COUNT


Il
numero
di
figli
di
Franco


select
count(*)
as
NumFigliDiFranco


from
Paternita


where
Padre
=
'Franco'


l’operatore
aggregato
(count)
viene
applicato
al
risultato
 dell’interrogazione:
 select
*

 from
Paternita
 where
Padre
=
'Franco'


66

Paternità Padre Figlio Sergio Franco Luigi Olga Luigi Filippo Franco Franco Andrea Andrea Franco Franco

Paternità

Padre Figlio Sergio Franco Luigi Olga Luigi Filippo Franco Franco Andrea Andrea Franco Franco Aldo
Padre
Figlio
Sergio
Franco
Luigi
Olga
Luigi
Filippo
Franco
Franco
Andrea
Andrea
Franco
Franco
Aldo
Aldo
Franco Franco Andrea Andrea Franco Franco Aldo Aldo NumFigliDiFranco 2 67

NumFigliDiFranco

Andrea Andrea Franco Franco Aldo Aldo NumFigliDiFranco 2 67 Unione,
intersezione
e
differenza
 •  

2

67

Andrea Franco Franco Aldo Aldo NumFigliDiFranco 2 67 Unione,
intersezione
e
differenza
 •   La


Unione,
intersezione
e
differenza


La
 select
da
sola
non
permePe
di
fare
unioni;
serve
 un
costruPo
esplicito:


select
 
 … 

 union 

[all ]
 select
 


I
duplica6
vengono
elimina6
(a
meno
che
si
usi
 all );
 anche
dalle
proiezioni!

69

all );
 anche
dalle
proiezioni! 69 Notazione
posizionale:
esempio


Notazione
posizionale:
esempio


select
padre,
figlio



from
paternita


union


select
madre,
figlio


from
maternita


71

 

Altri
operatori
aggrega6


 

SUM,
AVG,
MAX,
MIN


 

Media
dei
reddi6
dei
figli
di
Franco


 

select
avg(reddito)



 

from
persone
join
paternita
on
nome=figlio



 

where
padre='Franco'


 

68

 

Notazione
posizionale


 

SQL
non
richiede
che
gli
schemi
siano
iden6ci
(come
 richiesto
dall’algebra
relazionale)
ma
solo
che
siano


in
pari
numero
e
con
domini
compa6bili.


 

La
corrispondenza
tra
gli
aPribu6
non
si
basa
sul
 nome
ma
sulla
 posizione 
degli
aPribu6.
 Se
gli
aPribu6
hanno
nome
diverso
nella
due
tabelle




il
risultato
in
genere
non
ha
nome
oppure
usa
i
 nomi
degli
aPribu6
della
 prima 
tabella.

 

70

     

Figlio

 

Padre

Figlio

 

Sergio

Franco

Sergio

Franco

Luigi

Olga

Luigi

Olga

Luigi

Filippo

Luigi

Filippo

Franco

Andrea

Franco

Andrea

Franco

Aldo

Franco

Aldo

Luisa

Maria

Luisa

Maria

Luisa

Luigi

Luisa

Luigi

Anna

Olga

Anna

Olga

Anna

Filippo

Anna

Filippo

Maria

Andrea

Maria

Andrea

Maria

Aldo

Maria

Aldo

 

72

 

Notazione
posizionale,
2


CorrePa:


select
padre,
figlio


select
padre,
figlio


 

from
paternita


from
paternita


 

union


union


select
figlio,
madre


select
madre,
figlio


 

from
maternita


from
maternita


73

 

Differenza


select
Nome


from
Impiegato


except

select
Cognome
as
Nome


from
Impiegato


 

75

Interrogazioni
nidificate


Le
condizioni
atomiche
permePono
anche



il
confronto
fra
un
aPributo
(o
più,
vedremo
poi)
e
 il
risultato
di
una
soPointerrogazione


77

 

Notazione
posizionale,
3


 

Anche
con
le
ridenominazioni
non
cambia
niente:

 

select
padre
as
genitore,
figlio


from
paternita
 union
 select
figlio,
madre
as
genitore
 from
maternita
 CorrePa:

 

select
padre
as
genitore,
figlio


from
paternita


union


 

select
madre
as
genitore,
figlio



 

from
maternita


 

74

 

Intersezione


 

select
Nome


 

from
Impiegato


intersect


 

select
Cognome
as
Nome


 

from
Impiegato


equivale
a


 
 

select
I.Nome


 

from
Impiegato
I,
Impiegato
J


where
I.Nome
=
J.Cognome


 

76

Interrogazioni
nidificate:
esempio


 

nome
e
reddito
del
padre
di
Franco


 

select
Nome,
Reddito


from
Persone,
Paternita


where
Nome
=
Padre
and
Figlio
=
'Franco'


select
Nome,
Reddito


from
Persone
 where
Nome
=





( 
 select
Padre


 


 
 from
Paternita
 
 
 where
Figlio
=
'Franco')


 

78

Interrogazioni
nidificate,
commen6


La
forma
nidificata
è
“meno
dichiara6va”,
ma
 talvolta
più
leggibile
(richiede
meno
variabili)
 La
forma
piana
e
quella
nidificata
possono
 essere
combinate
 Le
soPointerrogazioni
non
possono
contenere


operatori
insiemis6ci
(“l’unione
si
fa
solo
al


livello
esterno”);
la
limitazione
non
è


significa6va


79

 

Nome
e
reddito
dei
padri
di
persone
che
guadagnano
più
di
20
 milioni


select
dis6nct
P.Nome,
P.Reddito


 

from
Persone
P,
Paternita,
Persone
F


where
P.Nome
=
Padre
and
Figlio
=
F.Nome



 

and
F.Reddito
>
20


 

select
Nome,
Reddito


 

from
Persone


where
Nome
in
(select
Padre



 
 from
Paternita,
Persone




 
 where
Figlio
=
Nome



 
 and
Reddito
>
20)


 

81

 

Check:
esempio


create
table
Impiegato
 (


 
 

Matricola
character(6),


Cognome
character(20),


Nome
character(20),


Sesso
character
not
null
check
(sesso
in
(‘M’,‘F’))


S6pendio
integer,


Superiore
character(6),



check
(S6pendio
<=
(select
S6pendio























from
Impiegato
J























where
Superiore
=
J.Matricola)



)

 

83

Nome
e
reddito
dei
padri
di
persone
che
guadagnano
più
di
20
 milioni


 

select
dis6nct
 P.Nome,
P.Reddito


 

from
Persone
P,
Paternita,
Persone
F 
 where
P.Nome
=
Padre
and
Figlio
=
 F.Nome



 

and
 F.Reddito
>
20


 

select
Nome,
Reddito
 from
Persone
 where
Nome
in 
(select
Padre


 


 
 from
Paternita



 
 where
Figlio
 =
any
(select
Nome



 
 


 from
Persone



 
 


 where
Reddito
>
20))


 

80

Vincoli
di
integrità
generici:
check


 

Specifica
di
vincoli
di
ennupla
(e
anche
vincoli
più
 complessi) check
( Condizione ) Si
possono
usare
le
stesse
condizioni
usate
come
 argomento
di
where


82