Algebra relazionale

// obiettivi di apprendimento
Comprendere l’algebra relazionale come fondamento teorico del linguaggio SQL
Applicare le operazioni unarie (proiezione π e selezione σ) su insiemi di tuple
Applicare le operazioni binarie: prodotto cartesiano, join naturale, theta-join, equi-join
Tradurre espressioni di algebra relazionale in query SQL e viceversa
📄
Slides
Simboli, operatori, tavole di corrispondenza SQL
Scarica →

1. Cos’è l’Algebra Relazionale

L’algebra relazionale è il linguaggio formale che sta alla base di SQL. È stata inventata da Edgar F. Codd nel 1970 nel suo paper fondamentale “A Relational Model of Data for Large Shared Data Banks”. Prima che esistesse SQL, si descrivevano le interrogazioni ai database usando questo sistema matematico.

Studiare l’algebra relazionale è utile perché ti aiuta a ragionare su cosa fa una query prima di scriverla: capire i dati che escono, prevedere problemi di performance, e comprendere come l’ottimizzatore SQL interpreta le tue istruzioni.

// definizione formale
L’algebra relazionale è un’algebra procedurale che opera su relazioni (insiemi di tuple) e produce come risultato nuove relazioni. Ogni operazione prende una o due relazioni come input e ne restituisce una come output.

Dati di esempio

Useremo due tabelle semplificate del nostro database scuola per illustrare ogni operazione.

R — STUDENTE
idnomecognomeanno
1MarcoRossi4
2LauraBianchi4
3AhmedKarim5
4SofiaFerrari5
S — ESAME
id_esameid_studentemateriavoto
101Programmazione28
111Matematica25
122Programmazione30
133Inglese22

2. Operazioni Unarie

Le operazioni unarie agiscono su una sola relazione. Le principali sono la proiezione e la selezione.

π
PROIEZIONE
Seleziona colonne — riduce gli attributi (verticale)
// espressione algebrica
πnome, cognome(STUDENTE)
Prendi solo gli attributi nome e cognome dalla relazione STUDENTE. Tutti gli altri attributi (id, anno) vengono scartati.
// SQL equivalente
SELECT nome, cognome
FROM STUDENTE;
// risultato
RISULTATO
nomecognome
MarcoRossi
LauraBianchi
AhmedKarim
SofiaFerrari
id e anno sono stati eliminati
σ
SELEZIONE
Filtra righe — riduce le tuple (orizzontale)
// espressione algebrica
σvoto > 27(ESAME)
Prendi solo le tuple di ESAME dove il voto è maggiore di 27. Le colonne rimangono invariate, cambiano le righe.
// SQL equivalente
SELECT *
FROM ESAME
WHERE voto > 27;
// risultato
RISULTATO
id_esameid_st.materiavoto
101Programmazione28
122Programmazione30
solo le tuple con voto > 27
// composizione delle operazioni

Le operazioni si possono comporre: il risultato di una diventa input della successiva. Per trovare nome e cognome degli studenti del quinto anno:

πnome, cognome( σanno = 5(STUDENTE) )

Prima si applica σ (seleziona anno=5), poi π sui risultati (solo nome e cognome). SQL: SELECT nome, cognome FROM STUDENTE WHERE anno = 5

3. Prodotto Cartesiano e Join

Le operazioni binarie agiscono su due relazioni. Il prodotto cartesiano è la base teorica, ma il join è l’operazione concreta che usi ogni giorno in SQL.

×
PRODOTTO CARTESIANO
Combina ogni tupla di R con ogni tupla di S
STUDENTE × ESAME
STUDENTE
4 tuple
×
ESAME
4 tuple
= 4 × 4 = 16 tuple
⚠️ Il prodotto cartesiano da solo non ha senso semantico: combina ogni studente con ogni esame, indipendentemente da chi lo ha sostenuto. Non si usa quasi mai direttamente — serve come base teorica del join.
JOIN NATURALE
Prodotto cartesiano + selezione sugli attributi comuni con stesso nome
// espressione algebrica
STUDENTE ⋈ ESAME
Unisce le tuple dove gli attributi con lo stesso nome (qui: id/id_studente — dipende dalla denominazione) hanno lo stesso valore. Equivale a: × seguito da σ su colonne comuni.
// SQL equivalente (con alias id)
SELECT *
FROM STUDENTE
NATURAL JOIN ESAME;
-- oppure, più esplicito:
SELECT *
FROM STUDENTE s
JOIN ESAME e
  ON s.id = e.id_studente;
// risultato
RISULTATO
idnomecognomemateriavoto
1MarcoRossiProgrammazione28
1MarcoRossiMatematica25
2LauraBianchiProgrammazione30
3AhmedKarimInglese22
Sofia (id=4) non appare: nessun esame

Theta-join e Equi-join

θ
THETA-JOIN
Join con una condizione generica θ (theta) — può essere qualsiasi predicato: =, ≠, <, >, ≤, ≥.
R ⋈R.id < S.id S
SELECT *
FROM R JOIN S
  ON R.id < S.id;
=
EQUI-JOIN
Caso speciale del theta-join dove la condizione è sempre di uguaglianza. È il tipo di join più comune nelle basi di dati relazionali.
STUDENTE ⋈S.id = E.id_studente ESAME
SELECT *
FROM STUDENTE S
JOIN ESAME E
  ON S.id = E.id_studente;

4. Operazioni Insiemistiche

Le operazioni insiemistiche lavorano su due relazioni compatibili — cioè con lo stesso numero di attributi e tipi corrispondenti. Corrispondono agli operatori sugli insiemi della matematica.

UNION — ∪
Unisce tutte le tuple di R e S, eliminando i duplicati.
R ∪ S
SELECT nome FROM R
UNION
SELECT nome FROM S;
UNION ALL mantiene i duplicati
INTERSEZIONE — ∩
Solo le tuple presenti in entrambe R e S.
R ∩ S
SELECT nome FROM R
INTERSECT
SELECT nome FROM S;
-- MySQL: simula con JOIN
DIFFERENZA — −
Le tuple in R ma non in S.
R − S
SELECT nome FROM R
EXCEPT
SELECT nome FROM S;
-- MySQL: NOT IN / NOT EXISTS
// compatibilità degli schemi

Le operazioni insiemistiche richiedono che le due relazioni siano union-compatible: stesso numero di attributi e tipi corrispondenti. Due tabelle con struttura diversa non possono essere unite con UNION, INTERSECT o EXCEPT — usa il JOIN invece.

5. Corrispondenza Algebra Relazionale ↔ SQL

Questa è la tabella di riferimento fondamentale per tradurre espressioni algebriche in SQL e viceversa. Tienila sempre a portata di mano durante gli esercizi.

// ALGEBRA RELAZIONALE → SQL
SimboloOperazioneEspressione AlgebricaEquivalente SQL
πProiezioneπnome,voto(ESAME)SELECT nome, voto FROM ESAME
σSelezioneσvoto>27(ESAME)SELECT * FROM ESAME WHERE voto > 27
×Prodotto cartesianoSTUDENTE × ESAMESELECT * FROM STUDENTE, ESAME
Join naturaleR ⋈ SSELECT * FROM R NATURAL JOIN S
θTheta/Equi-joinR ⋈R.id=S.id SSELECT * FROM R JOIN S ON R.id = S.id
UnioneR ∪ SSELECT … FROM R UNION SELECT … FROM S
IntersezioneR ∩ SSELECT … FROM R INTERSECT SELECT … FROM S
DifferenzaR − SSELECT … FROM R EXCEPT SELECT … FROM S

Esempio completo: espressione composta

Traduzione di una query complessa dalla forma algebrica a SQL. Trova nome e materia degli studenti del 4° anno con voto superiore a 26.

// passo per passo
PASSO 1
Seleziona gli studenti del 4° anno
S₁ = σanno=4(STUDENTE)
PASSO 2
Seleziona gli esami con voto > 26
E₁ = σvoto>26(ESAME)
PASSO 3
Fai il join sui due risultati
J = S₁ ⋈S₁.id=E₁.id_studente E₁
PASSO 4
Proietta solo nome e materia
Risultato = πnome, materia(J)
SQL equivalente
SELECT  s.nome, e.materia
FROM    STUDENTE s
JOIN    ESAME    e  ON s.id = e.id_studente
WHERE   s.anno = 4
  AND   e.voto > 26;
📌 Riepilogo — Punti chiave
  • L'algebra relazionale è la base teorica di SQL: ogni query SQL corrisponde a un'espressione algebrica.
  • π (proiezione) seleziona le colonne — corrisponde alla lista dopo SELECT. σ (selezione) filtra le righe — corrisponde a WHERE.
  • Il prodotto cartesiano (×) combina tutto con tutto: senza una condizione di join diventa inutile e molto costoso (N×M righe).
  • Il join naturale (⋈) è il prodotto cartesiano filtrato sugli attributi comuni. Il theta-join usa una condizione generica, l'equi-join usa l'uguaglianza.
  • Le operazioni insiemistiche (∪ ∩ −) richiedono relazioni union-compatible. In MySQL: UNION, INTERSECT (simulata), EXCEPT (simulata con NOT IN).

Lascia un commento