📎

Divisionsbeispiel - in depth

Wiki Beispiel: https://de.wikibooks.org/wiki/Relationenalgebra_und_SQL:_Division

Definition

R÷S\mathrm{R} \div \mathrm{S}Division

R\small \mathrm R und S\small \mathrm S sind Relationen wobei att(S)att(R) \small \operatorname{att}(\mathrm S) \sube \operatorname{att}(\mathrm R)  .

Division lässt sich mit Basisoperationen ausdrücken:

f=att(R)att(S)f = {\text{att(R)}-\text{att(S)}}Keine Attribute vonS\small \mathrm{S}inR\small \mathrm{R}

R÷S=πf(R)πf((πf(R)×S)R) \mathrm R \div \mathrm S=\pi_{f}(\mathrm R)-\pi_{f}\left(\left(\pi_{f}(\mathrm R) \times \mathrm S\right)-\mathrm R\right) 

Beispiel

Relationale Algebra

ho¨ren\text {hören}

MatrNr   VorlNr
---------------
26120    5001
27550    5001
27550    4052
28106    5041
28106    5001
28106    4052
28106    4630
29120    5001
29120    5041
29120    5049

VorL:=πVorlNr(σSWS =4(Vorlesung)) \text{VorL}:=\pi_{\text {VorlNr}}~( \sigma_{\text{SWS} ~= ~4}(\text {Vorlesung})) 

VorlNr
-------
5001
5041
4052
4630

ho¨ren ÷VorL\text {hören } \div \text{VorL}

Wir drücken Division mit primitiven Operatoren aus:

ho¨ren÷VorL=\text{hören} \div \text{VorL}=

πf(ho¨ren)πf((πf(ho¨ren)×VorL)ho¨ren) \pi_{f}(\text{hören})-\pi_{f}((\pi_{f}(\text{hören}) \times \text{VorL})-\text{hören}) 

f=att(ho¨ren)att(VorL)f = {\text{att(hören)}-\text{att(VorL)}}

πf(ho¨ren)\pi_{f}(\text{hören})

Duplikate entfernt

MatrNr
-------
26120
27550
28106
29120  

VorL\text{VorL}

VorlNr
-------
5001
5041
4052
4630

πf(ho¨ren)×VorL\pi_{f}(\text{hören}) \times \text{VorL}

Alle möglichen Kombinationen von Tupeln.

Alles was ein Student hören kann.

MatrNr   VorlNr
---------------
26120    5001
26120    5041
26120    4052
26120    463027550    5001
27550    5041
27550    4052
27550    463028106    5001
28106    5041
28106    4052
28106    463029120    5001
29120    5041
29120    5049
29120    4630

(πf(ho¨ren)×VorL)ho¨ren \left(\pi_{f}(\text{hören}) \times \text{VorL}\right) - \text{hören} 

Alle möglichen Kombinationen von Tupeln die nicht in ho¨ren\small \text{hören} ursprünglich vorhanden waren.

πf(ho¨ren)×VorL\pi_{f}(\text{hören}) \times \text{VorL}

MatrNr   VorlNr
---------------
26120    5001
26120    5041
26120    4052
26120    463027550    5001
27550    5041
27550    4052
27550    463028106    5001
28106    5041
28106    4052
28106    463029120    5001
29120    5041
29120    5049
29120    4630

ho¨ren\text{hören}

MatrNr   VorlNr
---------------
26120    500127550    5001
27550    405228106    5041
28106    5001
28106    4052
28106    463029120    5001
29120    5041
29120    5049

Daraus folgt (wobei 28106 nicht mehr steht weil er alles gehört hat)

MatrNr   VorlNr
---------------
26120    5041
26120    4052
26120    4630
27550    5041
27550    4630
29120    4630

πf((πf(ho¨ren)×VorL)ho¨ren) \pi_{f}(\left(\pi_{f}(\text{hören}) \times \text{VorL}\right) - \text{hören}) 

Duplikate eliminiert

Das sind alle Studenten die nicht alles gehört haben

MatrNr
-------
26120
27550
29120 

πf(ho¨ren)πf((πf(ho¨ren)×VorL)ho¨ren) \pi_{f}(\text{hören})-\pi_{f}((\pi_{f}(\text{hören}) \times \text{VorL})-\text{hören}) 

Erinnerung:

πf(ho¨ren)\pi_{f}(\text{hören})

MatrNr
-------
26120
27550
28106
29120  

Erinnerung:

πf((πf(ho¨ren)×VorL)ho¨ren) \pi_{f}(\left(\pi_{f}(\text{hören}) \times \text{VorL}\right) - \text{hören}) 

MatrNr
-------
26120
27550
29120 

Daraus folgen alle Studenten die alles gehört haben:

MatrNr
-------
28106

SQL

Wir wollen dass das Modulo (Alle vom Studenten noch nicht angehörten Vorlesungen) leer ist.

	(select sja.MatrNr from Student sja) -- Alle studenten die es gibt
except
(select snein.MatrNr                 -- Alle Studenten die nicht alles gehört haben
from (
(select s.MatrNr, v.VorlNr
from Student s, Vorlesung v
where v.SWS = 4)
except
(select *
from hören)
)
snein);