Algebra relazionale

L’algebra relazionale è una teoria matematica basata sulla teoria degli insieme che permette di eseguire operazioni su relazioni. In questa lezione daremo solo brevi cenni di algebra relazionale che tuttavia sono fondamentali per una buona comprensione del linguaggio SQL il quale può essere vista come un’implementazione “pratica” dell’algebra relazionale.

L’algebra relazionale definisce operazioni che si applicano a relazione, considereremo due tipologie di operazioni:

Il risultato di un’operazione nell’algebra relazionale è sempre una relazione.

Durante questa lezione utilizzeremo le seguenti tabelle d’esempio.

Relazione Studente

NomeCognomeData Di NascitaIdClasse
RaimondoBianchi2004-01-017
EdoardoConte2004-08-197
MarioBianchi2008-05-102
AliceRossi2003-02-2010
MarioRossi2007-10-312
BarbaraVerdi2007-04-012
CarloRossi2006-10-315
DavideVisconti2004-06-227
MichelaSciascia2006-02-2212

Relazione Classe

IdClasseAula
21A2
32A5
53A3
75B4
105A9
124A1

Operazioni unarie

Ci occupiamo ora delle due principali operazioni unarie dell’algebra booleana: la selezione e la proiezione.

Operazione di Selezione

L’operazione di selezione (select) permette di selezionare un sottoinsieme di tuple (righe) da un relazione indicando una condizione di selezione. Indichiamo la selezione con la lettera greca \(\sigma\) (sigma minuscolo) mettendo a pedice la condizione.

$$ \sigma_{cond}(R) $$

Ad esempio, volendo selezionare nella relazione Studente solo gli studenti della classe con IdClasse=7 eseguiremo la seguente selezione

$$ \sigma_{\mathsf{IdClasse=7}}(\mathsf{Studente}) $$

Il risultato, nella nostra relazione d’esempio, sarà il seguente.

NomeCognomeData Di NascitaIdClasse
RaimondoBianchi2004-01-017
EdoardoConte2004-08-197
DavideVisconti2004-06-227

Operazione di Proiezione

L’operazione di proiezione (projection) permette di selezionare un sottoinsieme di attributi (colonne) da una relazione indicando il nome degli attributi da selezionare. Indichiamo la proiezione con la lettera greca ((\pi)) (pi greco) mettendo a pedice la lista degli attributi da proiettare.

$$ \pi_{att1,att1,\ldots}(R) $$

Ad esempio, volendo proiettare la relazione classe sui solo attributi Classe e Aula, scriveremo la seguente operazione

$$ \pi_{\mathsf{Classe,Aula}}(\mathsf{Classe}) $$

il cui risultato sarà il seguente.

ClasseAula
1A2
2A5
3A3
5B4
5A9
4A1

Ovviamente è possibile combinare selezione e proiezione, di fatto questa è l’operazione che viene spesso eseguita. Ad esempio per avere nome e cognome (senza data di nascita) di tutti gli studenti della classe 5B (il cui Id è 7) possiamo combinare selezione e proiezione nel seguente modo.

$$ \pi_{\mathsf{Nome,Cognome}}(\sigma_{\mathsf{IdClasse=7}}(\mathsf{Studente})) $$

Attenzione

L’ordine con cui si eseguono le operazione è importante. Nell’esempio sopra se facciamo prima l’operazione di proiezione

$$ R = \pi_{\mathsf{Nome,Cognome}}(\mathsf{Studente}) $$

eliminiamo la colonna IdClasse (perché non fa parte degli attributi proiettati) e l’operazione di selezione

$$ \sigma_{\mathsf{IdClasse=7}}(R) $$

non a più senso in quanto la relazione \(R\) non contiene nessun attributo IdClasse.

Tratteremo SQL in altri moduli, tuttavia è interessante vedere come il linguaggio SQL sia una realizzazione dell’algebra relazionale. Come primo esempio consideriamo le operazioni di selezione e proiezione viste sopra in cui ci interessava vedere nome e cognome degli studente con IdClasse=7, ecco la query SQL per ottenere tale risultato.

SELECT Nome, Cognome
FROM Studente
WHERE IdClasse = 7

Nella parte SELECT vediamo gli attributi da proiettare, FROM indica la relazione da cui prendere gli attributi ed infine WHERE opera la selezione delle tuple sulla base del valore di IdClasse.

Operazioni binarie

Vediamo ora le operazioni binarie di tipo insiemistico unione, intersezione e differenza che pur esistendo nell’algebra relazionale sono raramente utilizzate (anche se risultano fondamentali in alcune query particolarmente complesse). Dedicheremo una sezione a parte all’operazione di join che rappresenta una strumento fondamentale per operare con le relazionali.

Unione

L’unione è l’operazione che prende due relazioni con gli stessi attributi e crea una relazione che è formata da tutte le tuple di una e dell’altra relazione. L’operazione di intersezione si indica con il simbolo \(\cup\)

$$ Q = R \cup S $$

Ad esempio l’unione delle seguenti tabelle

NomeCognomeData Di NascitaIdClasse
RaimondoBianchi2004-01-017
EdoardoConte2004-08-197
DavideVisconti2004-06-227
NomeCognomeData Di NascitaIdClasse
MarioBianchi2008-05-102
MarioRossi2007-10-312
BarbaraVerdi2007-04-012

produrrà come risultato la seguente tabella.

NomeCognomeData Di NascitaIdClasse
RaimondoBianchi2004-01-017
EdoardoConte2004-08-197
DavideVisconti2004-06-227
MarioBianchi2008-05-102
MarioRossi2007-10-312
BarbaraVerdi2007-04-012

Intersezione

L’unione è l’operazione che prende due relazioni con gli stessi attributi e crea una relazione che è formata da tutte le tuple che sono su entrambe le relazioni. L’operazione di intersezione si indica con il simbolo \(\cap\)

$$ Q = R \cap S $$

Nell’esempio sotto l’intersezione delle due relazioni a sinistra produce la relazione di destra.

NomeCognome
RaimondoBianchi
MarioRossi
BarbaraVerdi
CarloRossi
DavideVisconti
MichelaSciascia
NomeCognome
RaimondoBianchi
EdoardoConte
MarioBianchi
CarloRossi
MichelaSciascia
NomeCognome
RaimondoBianchi
CarloRossi
MichelaSciascia

Differenza

La differenza è l’operazione che prende due relazioni con gli stessi attributi e crea una relazione che è formata da tutte le tuple presenti in una relazione, ma non nell’altra. L’operazione di intersezione si indica con il simbolo \(\setminus\) (a volte con il simbolo \(-\) come la differenza numerica)

$$ Q = R \setminus S $$

NomeCognome
RaimondoBianchi
MarioRossi
BarbaraVerdi
CarloRossi
DavideVisconti
MichelaSciascia
NomeCognome
RaimondoBianchi
EdoardoConte
MarioBianchi
CarloRossi
MichelaSciascia
NomeCognome
MarioRossi
BarbaraVerdi
DavideVisconti
Attenzione

La differenza insiemistica (come quella tra numeri) non è commutativa, per esercizio si svolga l’esempio precedente invertendo le due relazioni, ovvero togliendo dalla seconda quello che è presente nella prima.

Operazione di Join

L’operazione di join è lo strumento fondamentale per operare tra relazioni che sono tra loro collegati mediante chiavi esterne. Nella sua versione più semplice, l’operazione di join prende due relazioni e ne crea una le cui tuple si ottengono concatenando tuple con lo stesso valore per gli attributi di collegamento. Nell’algebra relazionale, l’operazione di join si indica con il simbolo \(\bowtie\) indicando come pedice gli attributi di collegamento.

$$ R \bowtie_{\mathsf{Att1=Att2}} S $$

Ad esempio per creare la relazione di join tra Studente e Classe utilizzando gli attributi Studente.IdClasse e Classe.Id come collegamento indicheremo

$$ \mathsf{Studente} \bowtie_{\mathsf{IdClasse=Id}} \mathsf{Classe} $$

Il risultato sarà la seguente relazione

NomeCognomeData Di NascitaIdClasseIdClasseAula
RaimondoBianchi2004-01-01775B4
EdoardoConte2004-08-19775B4
MarioBianchi2008-05-10275B4
AliceRossi2003-02-2010105A9
MarioRossi2007-10-31221A2
BarbaraVerdi2007-04-01221A2
CarloRossi2006-10-31553A3
DavideVisconti2004-06-22775B4
MichelaSciascia2006-02-2212124A1

Una volta ottenuta tale tabella è possibile usare le operazioni di selezione e proiezione. Ad esempio volendo conoscere, nome, cognome e classe degli studenti con data di nascita precedente al 2008 possiamo fare la seguente sequenza di operazioni relazionali:

  1. Creiamo la relazione di join $$ \mathsf{JoinRel} = \mathsf{Studente} \bowtie_{\mathsf{IdClasse=Id}} \mathsf{Classe} $$
  2. Selezioniamo in base all’anno di nascita $$ \mathsf{SelectedRel} = \sigma_{\mathsf{DataDiNascita<2008}}(\mathsf{JoinRel}) $$
  3. Proiettiamo sugli attributi che ci interessano $$ \mathsf{Result} = \pi_{\mathsf{Nome,Cognome,Classe}}(\mathsf{SelectedRel}) $$

Il risultato finale sarà

NomeCognomeClasse
RaimondoBianchi5B
EdoardoConte5B
AliceRossi5A
MarioRossi1A
BarbaraVerdi1A
CarloRossi3A
DavideVisconti5B
MichelaSciascia4A
  • Michele Schimd © 2024
  • Ultimo aggiornamento: 17/02/2024
  • Materiale di studio e di esercizio per gli alunni dello Zuccante.

Creative Commons License