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