Algebra relazionale | Informatica Anno 5 M1 L04 | Prof. Giagnotti
Informatica · Anno 5 · Modulo 1 · Lezione 04
✍ Autore: profgiagnotti · Fondamento teorico di SQL - Codd 1970

Algebra relazionale

Comprendere l’algebra relazionale come fondamento teorico del linguaggio SQL. Operazioni unarie π e σ, binarie × e ⋈, insiemistiche ∪ ∩ −, e traduzione diretta in query SQL.

Anno 5Modulo 1 Lezione 04Algebra Relazionale ~25 min di lettura📑 Stampa →
OBIETTIVI DI APPRENDIMENTO
✓Comprendere l’algebra relazionale come fondamento teorico del linguaggio SQL
✓Applicare operazioni unarie (proiezione π e selezione σ) su insiemi di tuple
✓Applicare operazioni binarie: prodotto cartesiano, join naturale, theta-join, equi-join
✓Tradurre espressioni di algebra relazionale in query SQL e viceversa

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.

💡 Perché studiarla se c’è SQL?

Ragazzi, SQL è dichiarativo: dite cosa volete, non come ottenerlo. L'algebra relazionale è procedurale: dite passo passo come ottenerlo. L'ottimizzatore SQL traduce il vostro SELECT in algebra relazionale per decidere ordine migliore di esecuzione. Se capite π e σ, capite perché WHERE prima di SELECT è più efficiente. È come studiare grammatica prima di scrivere poesie.

Dati di esempio - Le tabelle che useremo

DATI DI ESEMPIO - R STUDENTE E S ESAME - TABELLE ORIGINALI ADATTATE CHIARO
R — STUDENTE idnomecognomeanno 1MarcoRossi4 2LauraBianchi4 3AhmedKarim5 4SofiaFerrari5 S — ESAME id_esameid_stud.materiavoto 101Programmazione28 111Matematica25 122Programmazione30 133Inglese22

2. Operazioni Unarie - π e σ

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
PROIEZIONE π VERTICALE E SELEZIONE σ ORIZZONTALE
πnome, cognome(STUDENTE) — seleziona colonne id | nome | cognome | anno — prima: 4 colonne 1 | Marco | Rossi | 4 π taglia colonne nome | cognome — dopo: 2 colonne Marco | Rossi Laura | Bianchi Ahmed | Karim Sofia | Ferrari id e anno eliminati — risultato verticale σvoto>27(ESAME) — filtra righe id_esame | id_stud | materia | voto — 4 righe 10 | 1 | Programmazione | 28 ← keep 11 | 1 | Matematica | 25 ← scarta 12 | 2 | Programmazione | 30 ← keep 13 | 3 | Inglese | 22 ← scarta σ filtra righe id_esame | id_stud | materia | voto — dopo: 2 righe 10 | 1 | Programmazione | 28 12 | 2 | Programmazione | 30 solo tuple con voto>27 — risultato orizzontale
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. Prima filtri righe, poi colonne: più efficiente.

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

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

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;
🎯 Ordine logico vs ordine scrittura SQL

In algebra scrivi σ poi π: prima filtri righe, poi scegli colonne — logico ed efficiente. In SQL scrivi SELECT prima ma il DBMS esegue WHERE prima di SELECT, proprio come algebra. Quindi quando scrivete SELECT nome FROM STUDENTE WHERE anno=5, il motore fa prima σanno=5 poi πnome. L'algebra spiega perché SQL funziona così.

📌 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).

🐙 Laboratori Pratici

Vuoi passare all'azione? Accedi alla repository ufficiale GitHub del corso per scaricare i file del laboratorio pratico in formato .md.

Vuoi consultare la sezione dedicata ai laboratori sul sito? Accedi cliccando il pulsante qui sotto.

🛠️ Sezione dedicata ai Laboratori

📚 Prossimo passo - Da algebra a SQL DDL/DML

Nella prossima lezione passiamo da teoria a pratica: CREATE TABLE con chiavi, INSERT, SELECT con JOIN veri in MySQL. Se oggi avete capito πσ⋈, domani scrivere SELECT ... JOIN ... WHERE vi sembrerà naturale. Esercizio: riscrivete in algebra relazionale SELECT nome FROM STUDENTE WHERE anno=4 — poi tradudetela di nuovo in SQL. Se ci riuscite in entrambi i sensi, avete capito.