ALGEBRA
RELAZIONALE
Linguaggi di interrogazione
relazionale
!
!
Linguaggi di interrogazione (LI) permettono la
manipolazione e il reperimento di dati da una base
di dati
Il modello relazionale supporta LI semplici e potenti
!
!
!
Forte base formale basata sulla logica
Ottimizzazione
Linguaggi di interrogazione ! linguaggi di
programmazione!
!
!
!
I LI non sono necessariamente “Turing completi”
I LI non sono fatti per essere usati in calcoli complessi
I LI supportano un accesso semplice ed efficiente a grandi
insiemi di dati
Giorgio Giacinto 2010
Basi di Dati
2
Linguaggi formali di
interrogazione relazionale
!
Due linguaggi di interrogazione matematici
formano la base per i linguaggi “reali” (es.
SQL) e per l’implementazione
!
!
Algebra relazionale: operazionale, utilissima
per rappresentare i piani di esecuzione
Calcolo relazionale: permette agli utenti di
descrivere ciò che vogliono, piuttosto che il
modo in cui calcolarlo (non operazionale, ma
dichiarativo)
! Capire l’algebra e il calcolo è la chiave per la comprensione
dell’SQL e dell’elaborazione delle interrogazioni!
Giorgio Giacinto 2010
Basi di Dati
3
Nozioni Preliminari
!
Una interrogazione si applica alle istanze di
relazione, e il risultato di una interrogazione è
anch’esso una istanza di relazione
!
!
!
Notazione posizionale rispetto a notazione nominale
dei campi
!
!
Gli schemi delle relazioni in ingresso sono fissi
Anche lo schema per il risultato di una data interrogazione
è fisso e determinato dalla definizione dei costrutti del
linguaggio di interrogazione.
La notazione posizionale è più semplice per definizioni
formali, la notazione nominale è più leggibile
In SQL sono usate entrambe
Giorgio Giacinto 2010
Basi di Dati
4
Schema base di dati di
esempio
Velisti(vid:integer,vnome:string,
esperienza:integer,età:real)
Barche(bid:integer,bnome:string,
colore:string)
Prenotazioni(vid:integer,bid:integer,
giorno:data)
Giorgio Giacinto 2010
Istanze di
esempio
Basi di Dati
P1 vid bid
22
58
Useremo la notazione
V1 vid
posizionale o a campi
22
nominati.
31
Useremo la
58
convenzione che i
nomi dei campi nei
V2 vid
risultati delle
interrogazioni siano
28
“ereditati” dai nomi dei
31
campi delle relazioni in
44
ingresso.
58
Giorgio Giacinto 2010
5
Basi di Dati
giorno
101 10/10/96
103 11/12/96
vnome
esperienza
dustin
lubber
rusty
7
8
10
45.0
55.5
35.0
vnome
esperienza
età
yuppy
lubber
guppy
rusty
9
8
5
10
età
35.0
55.5
35.0
35.0
6
Algebra relazionale
! Operazioni
di base
! Proiezione
(!)
Cancella colonne non desiderate dalla relazione
! Selezione (")
Seleziona un sottoinsieme di righe della relazione
! Prodotto cartesiano (!)
Consente di combinare due relazioni
! Differenza insiemistica (")
Tuple presenti nella relazione 1, ma non nella relazione 2
! Unione (#)
Tuple presenti nella relazione 1 e nella relazione 2
Giorgio Giacinto 2010
Basi di Dati
7
Altre Operazioni di
Algebra Relazionale
!
Altre operazioni
!
!
intersezione, join, divisione, ridenominazione
non essenziali ma (molto!) utili
Poiché ogni operazione restituisce una relazione,
le operazioni possono essere composte (l’algebra
è “chiusa”)
Giorgio Giacinto 2010
Basi di Dati
8
Proiezione
!
!
!
!vnome,esperienza (V2)
Cancella gli attributi che non sono
nella lista di proiezione
Lo schema del risultato contiene
esattamente i campi nella lista di
proiezione, con gli stessi nomi che
avevano nella (unica) relazione in
ingresso
L’operatore di proiezione deve
eliminare i duplicati (perché??)
!
vnome
yuppy
lubber
guppy
rusty
Nota: i sistemi reali tipicamente non
eliminano i duplicati a meno che
l’utente non lo richieda
esplicitamente (perché no?)
Giorgio Giacinto 2010
espe rienza
9
8
5
10
!età (V2)
età
35.0
55.5
Basi di Dati
9
Selezione
!
Seleziona le righe che
soddisfano una condizione
(<, >, =, ", #, ! , ¬, $, %)
!
!
!
Niente duplicati nel
risultato! (Perché?)
Lo schema del risultato è
identico allo schema della
(unica) relazione in
ingresso
La relazione risultato può
essere l’ingresso per
un’altra operazione di
algebra relazionale!
(Composizione di
operatori)
Giorgio Giacinto 2010
! esperienza>8 (V2)
vid vnome espe- età
rienza
28 yuppy 9
35.0
58 rusty
10
35.0
"vnome,esperienza(!esperienza>8 (V2))
vnome esperienza
yuppy 9
rusty
10
Basi di Dati
10
Unione, intersezione, differenza
insiemistica
!
!
!
!
V1#V2
Tutte queste operazioni
prendono in ingresso due
relazioni che devono essere
compatibili rispetto all’unione
vid vnome
stesso numero di campi
campi “corrispondenti” sono
dello stesso dominio
Qual è lo schema del risultato?
45.0
55.5
35.0
35.0
35.0
espeetà
rienza
lubber 8
55.5
rusty 10
35.0
vid vnome
espeetà
rienza
dustin 7
45.0
vid vnome
Giorgio Giacinto 2010
dustin
lubber
rusty
guppy
yuppy
età
V1&V2
V1 – V2
22
22
31
58
44
28
esperienza
7
8
10
5
9
31
58
Basi di Dati
11
Prodotto cartesiano
!
!
V1 ' P1
Ciascuna riga di V1 è accoppiata con ciascuna riga di
P1
Lo schema del risultato ha un campo per ogni campo di
V1 e P1, i cui nomi sono, se possibile, “ereditati”
!
Conflitto: sia V1 che P1 hanno un campo chiamato vid
(vid) vnome espe- età (vid) bid giorno
rienza
22 dustin
7
45.0
22 101 10/10/96
22 dustin
7
45.0
58 103 11/12/96
31 lubber
8
55.5
22 101 10/10/96
31 lubber
8
55.5
58 103 11/12/96
58 rusty
10 35.0
22 101 10/10/96
58 rusty
10 35.0
58 103 11/12/96
! Operatore per ridenominare i campi ((C(1 → vid1, 5 → vid2), V1 ! P1)
Giorgio Giacinto 2010
Basi di Dati
12
Join
•
!
!
Join condizionale: P !"c V = "c(P $ V)
Lo schema del risultato è lo stesso del prodotto
scalare
Meno tuple del prodotto scalare
potrebbe essere calcolato più efficientemente
!
!
A volte chiamato theta-join
V1 !"V 1.vid <P1.vid P1
espeetà (vid) bid giorno
rienza
dustin 7
45.0 58
103 11/12/96
lubber 8
55.5 58
103 11/12/96
(vid) vnome
22
31
Giorgio Giacinto 2010
Basi di Dati
13
Join
!
!
Equi-join: un caso speciale di join condizionale dove
la condizione c contiene solo uguaglianze
Lo schema del risultato è simile al prodotto scalare,
ma c’è solo una copia dei campi per i quali è
specificata l’uguaglianza
V1!"V 1.vid =P1.vid P1
vid
22
58
!
vnome espe- età bid giorno
rienza
dustin 7
45.0 101 10/10/96
rusty 10
35.0 103 11/12/96
Join naturale: equi-join su tutti i campi in comune
Giorgio Giacinto 2010
Basi di Dati
14
Divisione
!
Non supportata come operatore primitivo, ma utile per
esprimere interrogazioni come
Trovare i velisti che hanno prenotato tutte le barche
!
Sia A una relazione con due campi, x e y
sia B una relazione con il solo campo y
!
!
A/B = {)x* | +)y* , B, -)x, y* , A}
cioè, A/B contiene tutte le tuple x (velisti) tali che per ogni tupla y
(barca) in B, ci sia una tupla xy in A
oppure
Se l’insieme di valori y (barche) associato con un valore x (velista)
in A contiene tutti i valori y in B, il valore x è in A/B
In generale, x e y possono essere un qualunque elenco di
campi
!
!
y è l’elenco di campi in B
x # y è l’elenco dei campi in A
Giorgio Giacinto 2010
Basi di Dati
15
Esempi di divisione A/B
sno
s1
s1
s1
s1
s2
s2
s3
s4
s4
pno
p1
p2
p3
p4
p1
p2
p2
p2
p4
A
Giorgio Giacinto 2010
pno
p2
pno
p2
p4
B1
B2
A/B1
sno
s1
s2
s3
s4
A/B2
sno
s1
s4
Basi di Dati
pno
p1
p2
p4
B3
A/B3
sno
s1
16
Esprimere A/B usando
operatori di base
!
La divisione non è una operazione essenziale ma solo
un’utile scorciatoia
!
!
Vero anche per i join, ma i join sono così comuni che i
sistemi li implementano esplicitamente
Idea: per A/B, calcolare tutti i valori x che non sono
“interdetti” da qualche valore y in B
!
Un valore x è “interdetto” se associandogli valori y da B
otteniamo una tupla xy che non è in A
Valori x interdetti:
A/B
Giorgio Giacinto 2010
! x ( A) "
!x ((!x (A)!B)"A)
Tutte le tuple interdette
Basi di Dati
17
Istanze per alcuni esempi
Giorgio Giacinto 2010
Basi di Dati
18
Trovare i nomi dei velisti che hanno
prenotato la barca #103
!
Soluzione 1:
"vnome ((!bid=103 Prenota)
!
Soluzione 2:
! (Temp1, "
bid = 103
Velisti)
Prenota
Re
serves)
Velisti) )
! ( Temp2, Temp1 !" Sailors
"vnome(Temp2)
!
Soluzione 3:
Giorgio Giacinto 2010
"vnome ((!bid=103 (Prenota
Velisti)
Basi di Dati
19
Trovare i nomi dei velisti che
hanno prenotato una barca rossa
•
Informazioni sul colore sono disponibili solo in
Barche, quindi abbiamo bisogno di un ulteriore join
"vnome((!colore=‘rosso’Barche)
•
Prenota
Velisti
Una soluzione più efficiente
"vnome("vid(("bid!colore=‘rosso’Barche)
Prenota)
Velisti)
! Un ottimizzatore di interrogazioni può trovare la seconda
soluzione data la prima!
Giorgio Giacinto 2010
Basi di Dati
20
Trovare i nomi dei velisti che hanno
prenotato una barca rossa o una verde
!
Possiamo identificare tutte le barche rosse o verdi,
poi trovare i velisti che hanno prenotato una di esse
#(Tempbarche, (!colore=‘rosso’ % colore=‘verde’Barche))
"vnome(Tempbarche
!
!
Prenota
Velisti)
Possiamo anche definire TempBarche usando
l’unione (come?)
Che succede se % è sostituito da $ in questa
interrogazione?
Giorgio Giacinto 2010
Basi di Dati
21
Trovare i nomi dei velisti che hanno
prenotato una barca rossa e una verde
!
L’approccio precedente non funziona! Dobbiamo
identificare i velisti che hanno prenotato barche
rosse, i velisti che hanno prenotato barche verdi, poi
trovare l’intersezione (notate che vid è una chiave
per Velisti)
#(Temprosse,!vid ((!colore=‘rosso’ Barche)
Prenota)
#(Tempverdi,!vid ((!colore=‘verde’ Barche)
Prenota)
"vnome(Temprosse & Tempverdi)
Giorgio Giacinto 2010
Basi di Dati
Velisti)
22
Trovare i nomi dei velisti che hanno
prenotato almeno due barche
!
Occorre trovare tutte le tuple di Prenotate
riferite allo stesso velista ma con barche
prenotate diverse.
!
Per confrontare tuple di una stessa relazione
serve un join fra due copie della stessa relazione
!(Prenotate,"vid ,vnome,bid (Velisti !" Prenotazioni)
!(CoppiePrenotate(1! vid1,2 ! vnome, 3 ! bid1,
4 ! vid 2, 5 ! vnome2, 6 ! bid 2),Prenotate"Prenotate)
"vnome1#(vid1=vid 2)#(bid1$bid 2)CoppiePrenotate
Giorgio Giacinto 2010
Basi di Dati
23
Trovare i nomi dei velisti che hanno
prenotato tutte le barche
!
Uso della divisione
!
gli schemi delle relazioni in ingresso alla divisione devono
essere scelti con cura
# (Tempvids, ("vid,bid Prenota) / ("bidBarche))
"vnome (Tempvids
!
Velisti)
Per trovare i velisti che hanno prenotato tutte le
barche “Interlago”
..... / "bid (!bnome=‘Interlago’Barche)
Giorgio Giacinto 2010
Basi di Dati
24
Altre interrogazioni
1.
2.
3.
4.
5.
Trovare i colori delle barche prenotate da
Lubber
Trovare i nomi dei velisti che hanno
prenotato almeno una barca
Trovare i vid dei velisti con età superiore a
20 che non hanno prenotato una barca
rossa
Trovare il nome del velista più giovane
Trovare i dati della prenotazione più vecchia
Giorgio Giacinto 2010
Basi di Dati
25
Soluzioni
(
( (
1. ! colore B1 !" ! bid ! vid (" vnome= LubberV 3) !" P2
(
2. ! vnome V 3 !" (! vid P2 )
)))
)
(
3. ! vid (" età>20 (V 3)) # ! vid ( P2 ) $ ! vid P2 !" ! bid (" colore=rosso B1)
)
4. V 4 = ! vid,età (V 3)
V 5 = ! vid1,età1 (" età1>età2 ( # (1 $ vid1, 2 $ età1, 3 $ vid2, 4 $ età2)V 4 % V 4 ))
! vnome (V 3 !" ! vid (V 4 & V 5 ))
Giorgio Giacinto 2010
Basi di Dati
26