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 (∀):
| Quantificatore | Significato | Traduzione 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:
- Rinomino l’attributo
Esami.MatricolainEsami.Studenteper distinguerlo daStudenti.Matricola. - Seleziono in Esami solo le tuple con Voto ≥ 18.
- Faccio un join per
Studenti.Matricola-Esami.Studentetra Studenti e σVoto≥18(Esami). - Del risultato del join proietto solo Matricola Nome e Cognome degli studenti.
Soluzione:
πMatricola,Nome,Cognome(Studenti⨝Studenti.Matricola=Esami.StudenteσVoto≥18(ρMatricola←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:
- Rinomino l’attributo
Esami.MatricolainEsami.Studenteper distinguerlo daStudenti.Matricola. - Seleziono in Esami solo le tuple con Voto ≥ 18.
- Faccio un join per
Studenti.Matricola-Esami.Studentetra Studenti e σVoto≥18(Esami). - Del risultato del join proietto solo Matricola Nome e Cognome degli studenti.
- 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:
- Rinomino l’attributo
Esami.MatricolainEsami.Studenteper distinguerlo daStudenti.Matricola. - Seleziono in Esami solo le tuple con Voto < 18.
- Faccio un join per
Studenti.Matricola-Esami.Studentetra Studenti e σVoto<</>18(Esami). - Del risultato del join proietto solo Matricola Nome e Cognome degli studenti.
- 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.