Divisione
÷
Definizione:
Data una relazione R(A, B) e una relazione S(B),
la divisione R ÷ S restituisce l’insieme dei valori di A che sono associati a tutti i valori di B presenti nella relazione S.
R÷S={a ∣ ∀ b∈S,(a,b)∈R}
Questa operazione seleziona i valori di A tali che, per ogni valore di B in S, esiste la coppia (A, B) in R.
Questa operazione restituisce sottoinsiemi di elementi che sono in relazione con tutti gli elementi di un altro insieme
I risultato della divisione tra due relazioni è un insieme i cui elementi sono quelli della prima relazione che hanno una corrispondenza con tutti gli elementi della seconda relazione.
Esempio
Si considerino queste tabella:
Insegna(Professore, Corso)
CorsiRichiesti(Corso)
si vuole sapere quali professori insegnano tutti i corsi richiesti.
L’operazione:
π Professore(Insegna÷CorsiRichiesti)
restituisce i professori che insegnano tutti i corsi richiesti.
Nessun calcolo numerico, solo verifica di completezza rispetto a un insieme.
La divisione relazionale non risponde alla domanda quanto fa
a diviso b,
ma
risponde alla domanda
quali a sono in relazione con tutti i b.”
In SQL:
si basa su un idea semplice: per ogni professore, contiamo quanti corsi richiesti insegna e confrontiamo con il numero totale di corsi richiesti.
SELECT i.Professore
FROM Insegna i
JOIN CorsiRichiesti c ON i.Corso = c.Corso
GROUP BY i.Professore
HAVING COUNT(DISTINCT i.Corso) = (SELECT COUNT(*) FROM CorsiRichiesti);
cioèJOIN fa incontrare Insegna e CorsiRichiesti solo per i corsi richiesti.GROUP BY i.Professore: raggruppiamo per professore.COUNT(DISTINCT i.Corso): contiamo quanti corsi richiesti insegna il professore.HAVING ... = (SELECT COUNT(*) FROM CorsiRichiesti): controlliamo che li insegni tutti.

