L’algebra relazionale è un linguaggio procedurale formale usato per manipolare e interrogare relazioni (tabelle) nei database relazionali. Descrive come ottenere i risultati a partire da relazioni esistenti, usando operazioni matematiche su insiemi di tuple.


Caratteristiche:

  • Chiusa: ogni operazione produce una relazione.
  • Componibile: i risultati possono essere input per altre operazioni.
  • Deterministica: stesse relazioni → stesso risultato.

Gli operandi sono le relazioni (tabelle) di partenza o il risultato di altre operazioni. Ogni operazione produce una nuova relazione (chiusura relazionale). Ogni relazione risultato deve mantenere l’integrità propria dei database relazionali (ad esempio non deve contenere duplicati).


OPERATORI:

PROIEZIONE (π)

Seleziona solo le colonne specificate.

Sintassi:

πattributi(relazione)

Esempio:

πNome(studenti)

Oppure:

πNome, Facoltà(Studenti)


SELEZIONE (σ)

Filtra solo le righe che soddisfano una condizione.

Sintassi:

σcondizione(relazione)

Esempio:

σFacoltà=‘informatica’(Studenti)

Oppure:

σNome=‘Andrea’∧Facoltà=‘Informatica’(Studenti)


UNIONE (∪)

Unisce tutti i dati di due relazioni.

N.B. Gli operandi devono essere union compatibili (ovvero che hanno lo stesso schema).

Sintassi:

R ∪ S

Esempio:

Studenti = Studenti in sede ∪ Studenti fuori sede


DIFFERENZA (−)

Restituisce le tuple presenti in una relazione ma non nell’altra.

N.B. Gli operandi devono essere union compatibili (ovvero che hanno lo stesso schema).

Sintassi:

R − S

Esempio:

Studenti di informatica in sede = Studenti di informatica - Studenti fuori sede

Oppure:

Studenti fuori sede non di informatica = Studenti fuori sede - Studenti di informatica


INTERSEZIONE (∩)

Restituisce le tuple presenti in entrambe le relazioni.

N.B. Gli operandi devono essere union compatibili (ovvero che hanno lo stesso schema).

Sintassi:

R ∩ S

Esempio:

Studenti fuori sede di informatica = Studenti fuori sede ∩ Studenti di informatica


PRODOTTO CARTESIANO (×)

Combina ogni tupla di R con ogni tupla di S.

Sintassi:

R × S

Esempio:

Studenti × Esami

→ base per costruire le join.


INNER JOIN (⨝)

Combina tuple di due relazioni in base a una condizione di uguaglianza.

Sintassi:

R ⨝condizioneS

Esempio:

Studenti ⨝Studenti.Matricola=Esami.MatricolaEsami

N.B. Che equivale a scrivere: σStudenti.Matricola=Esami.Matricola(Studenti×Esami)

→ unisce studenti e esami corrispondenti.

N.B In questo caso il join si basa sull’attributo Matricola, presente con lo stesso nome sia in Studenti che in Esami, e possiamo quindi omettere la condizione Studenti.Matricola = Esami.Matricola, applicando direttamente quello che viene chiamato natural join (un sottoinsieme dell’inner join): Studenti ⨝ Esami.


RIDENOMINAZIONE (ρ)

Serve a rinominare relazioni o attributi.

Sintassi:

ρvecchioNome←nuovoNome(relazione)

Esempio:

ρMatricola←Studente(Esami) → Utile per distinguere relazioni o attributi uguali in operazioni complesse.


QUANTIFICATORI

Nel calcolo relazionale e nella logica dei predicati, i quantificatori servono per esprimere condizioni sulle tuple (righe) o sui valori.


Sono due: esistenziale (∃) e universale (∀):

QuantificatoreSignificatoTraduzione logica
Esiste almeno una tupla che soddisfa la condizione“c’è almeno un elemento per cui P(x) è vero”
Tutte le tuple soddisfano la condizione“per ogni elemento P(x) è vero”
¬∃Neanche una tupla soddisfa la condizione (nessuna)“per ogni elemento P(x) non è vero”
¬∀Non tutte le tuple soddisfano la condizione”c’è almeno un elemento per cui P(x) non è vero”

Ecco alcuni esempi:


ALMENO UNA TUPLA (∃)

Query:

Studente che ha almeno un esame con Voto ≥ 18.


Procedimento:

  1. Rinomino l’attributo Esami.Matricola in Esami.Studente per distinguerlo da Studenti.Matricola.
  2. Seleziono in Esami solo le tuple con Voto ≥ 18.
  3. Faccio un join per Studenti.Matricola - Esami.Studente tra Studenti e σVoto≥18(Esami).
  4. Del risultato del join proietto solo Matricola Nome e Cognome degli studenti.

Soluzione: πMatricola,Nome,Cognome(Studenti⨝Studenti.Matricola=Esami.StudenteσVoto≥18Matricola←Studente(Esami)))

N.B La proiezione finale toglie automaticamente le tuple Matricola, Nome, Cognome duplicate, infatti, come gli altri operatori, lavora su insiemi.


NESSUNA TUPLA (¬∃)

Query:

Studente per cui non esiste alcun esame con Voto ≥ 18.


Procedimento:

  1. Rinomino l’attributo Esami.Matricola in Esami.Studente per distinguerlo da Studenti.Matricola.
  2. Seleziono in Esami solo le tuple con Voto ≥ 18.
  3. Faccio un join per Studenti.Matricola - Esami.Studente tra Studenti e σVoto≥18(Esami).
  4. Del risultato del join proietto solo Matricola Nome e Cognome degli studenti.
  5. Sottraggo il risultato della proiezione all’insieme di tutti gli studenti (tutti gli studenti - studenti che soddisfano ∃).

Soluzione:

Studenti−Studenti con almeno un esame ≥ 18 (guarda sopra)

N.B. Se lo studente non ha dato esami allora non ha voti ≥ 18.


TUTTE LE TUPLE (∀)

Query:

Studente che non ha alcun esame con Voto < 18 (tutti con voto ≥ 18).


Procedimento:

  1. Rinomino l’attributo Esami.Matricola in Esami.Studente per distinguerlo da Studenti.Matricola.
  2. Seleziono in Esami solo le tuple con Voto < 18.
  3. Faccio un join per Studenti.Matricola - Esami.Studente tra Studenti e σVoto<</>18(Esami).
  4. Del risultato del join proietto solo Matricola Nome e Cognome degli studenti.
  5. Sottraggo il risultato della proiezione all’insieme di tutti gli studenti (tutti gli studenti - studenti che soddisfano ∃).

Soluzione:

Studenti−Studenti con almeno un esame <</> 18 (come sopra ma con Voto < 18)

N.B. Se lo studente non ha dato esami allora non ha voti < 18. Se volessi trovare gli studenti con nessun voto < 18 e almeno un voto ≥ 18 allora dovrei fare: (Studenti − Studenti con almeno un esame <</> 18) ∩ Studenti con almeno un esame ≥ 18. Otterrei nell’esempio solo gli studenti 104 e 208.